001: /*
002:
003: Derby - Class org.apache.derby.impl.sql.compile.DropIndexNode
004:
005: Licensed to the Apache Software Foundation (ASF) under one or more
006: contributor license agreements. See the NOTICE file distributed with
007: this work for additional information regarding copyright ownership.
008: The ASF licenses this file to you under the Apache License, Version 2.0
009: (the "License"); you may not use this file except in compliance with
010: the License. You may obtain a copy of the License at
011:
012: http://www.apache.org/licenses/LICENSE-2.0
013:
014: Unless required by applicable law or agreed to in writing, software
015: distributed under the License is distributed on an "AS IS" BASIS,
016: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017: See the License for the specific language governing permissions and
018: limitations under the License.
019:
020: */
021:
022: package org.apache.derby.impl.sql.compile;
023:
024: import org.apache.derby.iapi.services.context.ContextManager;
025:
026: import org.apache.derby.iapi.sql.compile.CompilerContext;
027:
028: import org.apache.derby.iapi.sql.dictionary.ConglomerateDescriptor;
029: import org.apache.derby.iapi.sql.dictionary.ConstraintDescriptor;
030: import org.apache.derby.iapi.sql.dictionary.DataDictionary;
031: import org.apache.derby.iapi.sql.dictionary.DataDictionaryContext;
032: import org.apache.derby.iapi.sql.dictionary.SchemaDescriptor;
033: import org.apache.derby.iapi.sql.dictionary.TableDescriptor;
034:
035: import org.apache.derby.iapi.reference.SQLState;
036:
037: import org.apache.derby.iapi.sql.execute.ConstantAction;
038:
039: import org.apache.derby.iapi.sql.dictionary.SchemaDescriptor;
040:
041: import org.apache.derby.iapi.error.StandardException;
042:
043: /**
044: * A DropIndexNode is the root of a QueryTree that represents a DROP INDEX
045: * statement.
046: *
047: * @author Jeff Lichtman
048: */
049:
050: public class DropIndexNode extends DDLStatementNode {
051: private ConglomerateDescriptor cd;
052: private TableDescriptor td;
053:
054: public String statementToString() {
055: return "DROP INDEX";
056: }
057:
058: /**
059: * Bind this DropIndexNode. This means looking up the index,
060: * verifying it exists and getting the conglomerate number.
061: *
062: * @return The bound query tree
063: *
064: * @exception StandardException Thrown on error
065: */
066: public QueryTreeNode bind() throws StandardException {
067: CompilerContext cc = getCompilerContext();
068: DataDictionary dd = getDataDictionary();
069: SchemaDescriptor sd;
070:
071: sd = getSchemaDescriptor();
072:
073: if (sd.getUUID() != null)
074: cd = dd.getConglomerateDescriptor(getRelativeName(), sd,
075: false);
076:
077: if (cd == null) {
078: throw StandardException.newException(
079: SQLState.LANG_INDEX_NOT_FOUND, getFullName());
080: }
081:
082: /* Get the table descriptor */
083: td = getTableDescriptor(cd.getTableID());
084:
085: /* Drop index is not allowed on an index backing a constraint -
086: * user must drop the constraint, which will drop the index.
087: * Drop constraint drops the constraint before the index,
088: * so it's okay to drop a backing index if we can't find its
089: * ConstraintDescriptor.
090: */
091: if (cd.isConstraint()) {
092: ConstraintDescriptor conDesc;
093: String constraintName;
094:
095: conDesc = dd.getConstraintDescriptor(td, cd.getUUID());
096: if (conDesc != null) {
097: constraintName = conDesc.getConstraintName();
098: throw StandardException.newException(
099: SQLState.LANG_CANT_DROP_BACKING_INDEX,
100: getFullName(), constraintName);
101: }
102: }
103:
104: /* Statement is dependent on the TableDescriptor and ConglomerateDescriptor */
105: cc.createDependency(td);
106: cc.createDependency(cd);
107:
108: return this ;
109: }
110:
111: // inherit generate() method from DDLStatementNode
112:
113: /**
114: * Create the Constant information that will drive the guts of Execution.
115: *
116: * @exception StandardException Thrown on failure
117: */
118: public ConstantAction makeConstantAction() throws StandardException {
119: return getGenericConstantActionFactory()
120: .getDropIndexConstantAction(getFullName(),
121: getRelativeName(), getRelativeName(),
122: getSchemaDescriptor().getSchemaName(),
123: td.getUUID(), td.getHeapConglomerateId());
124: }
125: }
|