diff options
| author | Teodor Sigaev | 2016-04-08 18:52:13 +0000 |
|---|---|---|
| committer | Teodor Sigaev | 2016-04-08 18:52:13 +0000 |
| commit | 8b99edefcab1e82c43139a2c7dc06d31fb27b3e4 (patch) | |
| tree | 5428925d16447c4d204e0956e6d2ae1032847585 /src/backend/parser | |
| parent | 35e2e357cb054dc9e5d890fe754c56f0722f015e (diff) | |
Revert CREATE INDEX ... INCLUDING ...
It's not ready yet, revert two commits
690c543550b0d2852060c18d270cdb534d339d9a - unstable test output
386e3d7609c49505e079c40c65919d99feb82505 - patch itself
Diffstat (limited to 'src/backend/parser')
| -rw-r--r-- | src/backend/parser/analyze.c | 6 | ||||
| -rw-r--r-- | src/backend/parser/gram.y | 57 | ||||
| -rw-r--r-- | src/backend/parser/parse_relation.c | 2 | ||||
| -rw-r--r-- | src/backend/parser/parse_target.c | 2 | ||||
| -rw-r--r-- | src/backend/parser/parse_utilcmd.c | 121 |
5 files changed, 40 insertions, 148 deletions
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index faf83092b7a..7d2fedfaadf 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -920,7 +920,7 @@ transformOnConflictClause(ParseState *pstate, * relation. */ Assert(pstate->p_next_resno == 1); - for (attno = 0; attno < RelationGetNumberOfAttributes(targetrel); attno++) + for (attno = 0; attno < targetrel->rd_rel->relnatts; attno++) { Form_pg_attribute attr = targetrel->rd_att->attrs[attno]; char *name; @@ -2122,8 +2122,8 @@ transformUpdateTargetList(ParseState *pstate, List *origTlist) EXPR_KIND_UPDATE_SOURCE); /* Prepare to assign non-conflicting resnos to resjunk attributes */ - if (pstate->p_next_resno <= RelationGetNumberOfAttributes(pstate->p_target_relation)) - pstate->p_next_resno = RelationGetNumberOfAttributes(pstate->p_target_relation) + 1; + if (pstate->p_next_resno <= pstate->p_target_relation->rd_rel->relnatts) + pstate->p_next_resno = pstate->p_target_relation->rd_rel->relnatts + 1; /* Prepare non-junk columns for assignment to target table */ target_rte = pstate->p_target_rangetblentry; diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 7166d6f8bbd..18ec5f03d81 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -356,7 +356,6 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); oper_argtypes RuleActionList RuleActionMulti opt_column_list columnList opt_name_list sort_clause opt_sort_clause sortby_list index_params - optincluding opt_including index_including_params name_list role_list from_clause from_list opt_array_bounds qualified_name_list any_name any_name_list type_name_list any_operator expr_list attrs @@ -373,7 +372,6 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); create_generic_options alter_generic_options relation_expr_list dostmt_opt_list transform_element_list transform_type_list - optcincluding opt_c_including %type <list> group_by_list %type <node> group_by_item empty_grouping_set rollup_clause cube_clause @@ -3219,18 +3217,17 @@ ConstraintElem: n->initially_valid = !n->skip_validation; $$ = (Node *)n; } - | UNIQUE '(' columnList ')' opt_c_including opt_definition OptConsTableSpace + | UNIQUE '(' columnList ')' opt_definition OptConsTableSpace ConstraintAttributeSpec { Constraint *n = makeNode(Constraint); n->contype = CONSTR_UNIQUE; n->location = @1; n->keys = $3; - n->including = $5; - n->options = $6; + n->options = $5; n->indexname = NULL; - n->indexspace = $7; - processCASbits($8, @8, "UNIQUE", + n->indexspace = $6; + processCASbits($7, @7, "UNIQUE", &n->deferrable, &n->initdeferred, NULL, NULL, yyscanner); $$ = (Node *)n; @@ -3241,7 +3238,6 @@ ConstraintElem: n->contype = CONSTR_UNIQUE; n->location = @1; n->keys = NIL; - n->including = NIL; n->options = NIL; n->indexname = $2; n->indexspace = NULL; @@ -3250,18 +3246,17 @@ ConstraintElem: NULL, yyscanner); $$ = (Node *)n; } - | PRIMARY KEY '(' columnList ')' opt_c_including opt_definition OptConsTableSpace + | PRIMARY KEY '(' columnList ')' opt_definition OptConsTableSpace ConstraintAttributeSpec { Constraint *n = makeNode(Constraint); n->contype = CONSTR_PRIMARY; n->location = @1; n->keys = $4; - n->including = $6; - n->options = $7; + n->options = $6; n->indexname = NULL; - n->indexspace = $8; - processCASbits($9, @9, "PRIMARY KEY", + n->indexspace = $7; + processCASbits($8, @8, "PRIMARY KEY", &n->deferrable, &n->initdeferred, NULL, NULL, yyscanner); $$ = (Node *)n; @@ -3272,7 +3267,6 @@ ConstraintElem: n->contype = CONSTR_PRIMARY; n->location = @1; n->keys = NIL; - n->including = NIL; n->options = NIL; n->indexname = $3; n->indexspace = NULL; @@ -3340,13 +3334,6 @@ columnElem: ColId } ; -opt_c_including: INCLUDING optcincluding { $$ = $2; } - | /* EMPTY */ { $$ = NIL; } - ; - -optcincluding : '(' columnList ')' { $$ = $2; } - ; - key_match: MATCH FULL { $$ = FKCONSTR_MATCH_FULL; @@ -6639,7 +6626,7 @@ defacl_privilege_target: IndexStmt: CREATE opt_unique INDEX opt_concurrently opt_index_name ON qualified_name access_method_clause '(' index_params ')' - opt_including opt_reloptions OptTableSpace where_clause + opt_reloptions OptTableSpace where_clause { IndexStmt *n = makeNode(IndexStmt); n->unique = $2; @@ -6648,10 +6635,9 @@ IndexStmt: CREATE opt_unique INDEX opt_concurrently opt_index_name n->relation = $7; n->accessMethod = $8; n->indexParams = $10; - n->indexIncludingParams = $12; - n->options = $13; - n->tableSpace = $14; - n->whereClause = $15; + n->options = $12; + n->tableSpace = $13; + n->whereClause = $14; n->excludeOpNames = NIL; n->idxcomment = NULL; n->indexOid = InvalidOid; @@ -6666,7 +6652,7 @@ IndexStmt: CREATE opt_unique INDEX opt_concurrently opt_index_name } | CREATE opt_unique INDEX opt_concurrently IF_P NOT EXISTS index_name ON qualified_name access_method_clause '(' index_params ')' - opt_including opt_reloptions OptTableSpace where_clause + opt_reloptions OptTableSpace where_clause { IndexStmt *n = makeNode(IndexStmt); n->unique = $2; @@ -6675,10 +6661,9 @@ IndexStmt: CREATE opt_unique INDEX opt_concurrently opt_index_name n->relation = $10; n->accessMethod = $11; n->indexParams = $13; - n->indexIncludingParams = $15; - n->options = $16; - n->tableSpace = $17; - n->whereClause = $18; + n->options = $15; + n->tableSpace = $16; + n->whereClause = $17; n->excludeOpNames = NIL; n->idxcomment = NULL; n->indexOid = InvalidOid; @@ -6757,16 +6742,6 @@ index_elem: ColId opt_collate opt_class opt_asc_desc opt_nulls_order } ; -optincluding : '(' index_including_params ')' { $$ = $2; } - ; -opt_including: INCLUDING optincluding { $$ = $2; } - | /* EMPTY */ { $$ = NIL; } - ; - -index_including_params: index_elem { $$ = list_make1($1); } - | index_including_params ',' index_elem { $$ = lappend($1, $3); } - ; - opt_collate: COLLATE any_name { $$ = $2; } | /*EMPTY*/ { $$ = NIL; } ; diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c index 0f5d796c7fd..81332b57d93 100644 --- a/src/backend/parser/parse_relation.c +++ b/src/backend/parser/parse_relation.c @@ -2875,7 +2875,7 @@ attnameAttNum(Relation rd, const char *attname, bool sysColOK) { int i; - for (i = 0; i < RelationGetNumberOfAttributes(rd); i++) + for (i = 0; i < rd->rd_rel->relnatts; i++) { Form_pg_attribute att = rd->rd_att->attrs[i]; diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c index b5ec2bd371b..fc93063ed0b 100644 --- a/src/backend/parser/parse_target.c +++ b/src/backend/parser/parse_target.c @@ -898,7 +898,7 @@ checkInsertTargets(ParseState *pstate, List *cols, List **attrnos) * Generate default column list for INSERT. */ Form_pg_attribute *attr = pstate->p_target_relation->rd_att->attrs; - int numcol = RelationGetNumberOfAttributes(pstate->p_target_relation); + int numcol = pstate->p_target_relation->rd_rel->relnatts; int i; for (i = 0; i < numcol; i++) diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c index 707106f10c2..65284941ed9 100644 --- a/src/backend/parser/parse_utilcmd.c +++ b/src/backend/parser/parse_utilcmd.c @@ -1242,14 +1242,14 @@ generateClonedIndexStmt(CreateStmtContext *cxt, Relation source_idx, /* Build the list of IndexElem */ index->indexParams = NIL; - index->indexIncludingParams = NIL; indexpr_item = list_head(indexprs); - for (keyno = 0; keyno < idxrec->indnkeyatts; keyno++) + for (keyno = 0; keyno < idxrec->indnatts; keyno++) { IndexElem *iparam; AttrNumber attnum = idxrec->indkey.values[keyno]; int16 opt = source_idx->rd_indoption[keyno]; + iparam = makeNode(IndexElem); if (AttributeNumberIsValid(attnum)) @@ -1331,38 +1331,6 @@ generateClonedIndexStmt(CreateStmtContext *cxt, Relation source_idx, index->indexParams = lappend(index->indexParams, iparam); } - /* Handle included columns separately */ - for (keyno = idxrec->indnkeyatts; keyno < idxrec->indnatts; keyno++) - { - IndexElem *iparam; - AttrNumber attnum = idxrec->indkey.values[keyno]; - - iparam = makeNode(IndexElem); - - if (AttributeNumberIsValid(attnum)) - { - /* Simple index column */ - char *attname; - - attname = get_relid_attribute_name(indrelid, attnum); - keycoltype = get_atttype(indrelid, attnum); - - iparam->name = attname; - iparam->expr = NULL; - } - else - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("expressions are not supported in included columns"))); - - /* Copy the original index column name */ - iparam->indexcolname = pstrdup(NameStr(attrs[keyno]->attname)); - - /* Add the collation name, if non-default */ - iparam->collation = get_collation(indcollation->values[keyno], keycoltype); - - index->indexIncludingParams = lappend(index->indexIncludingParams, iparam); - } /* Copy reloptions if any */ datum = SysCacheGetAttr(RELOID, ht_idxrel, Anum_pg_class_reloptions, &isnull); @@ -1555,7 +1523,6 @@ transformIndexConstraints(CreateStmtContext *cxt) IndexStmt *priorindex = lfirst(k); if (equal(index->indexParams, priorindex->indexParams) && - equal(index->indexIncludingParams, priorindex->indexIncludingParams) && equal(index->whereClause, priorindex->whereClause) && equal(index->excludeOpNames, priorindex->excludeOpNames) && strcmp(index->accessMethod, priorindex->accessMethod) == 0 && @@ -1627,7 +1594,6 @@ transformIndexConstraint(Constraint *constraint, CreateStmtContext *cxt) index->tableSpace = constraint->indexspace; index->whereClause = constraint->where_clause; index->indexParams = NIL; - index->indexIncludingParams = NIL; index->excludeOpNames = NIL; index->idxcomment = NULL; index->indexOid = InvalidOid; @@ -1777,30 +1743,24 @@ transformIndexConstraint(Constraint *constraint, CreateStmtContext *cxt) heap_rel->rd_rel->relhasoids); attname = pstrdup(NameStr(attform->attname)); - if (i < index_form->indnkeyatts) - { - /* - * Insist on default opclass and sort options. While the index - * would still work as a constraint with non-default settings, it - * might not provide exactly the same uniqueness semantics as - * you'd get from a normally-created constraint; and there's also - * the dump/reload problem mentioned above. - */ - defopclass = GetDefaultOpClass(attform->atttypid, - index_rel->rd_rel->relam); - if (indclass->values[i] != defopclass || - index_rel->rd_indoption[i] != 0) - ereport(ERROR, - (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("index \"%s\" does not have default sorting behavior", index_name), - errdetail("Cannot create a primary key or unique constraint using such an index."), - parser_errposition(cxt->pstate, constraint->location))); - - constraint->keys = lappend(constraint->keys, makeString(attname)); - } - else - constraint->including = lappend(constraint->including, makeString(attname)); + /* + * Insist on default opclass and sort options. While the index + * would still work as a constraint with non-default settings, it + * might not provide exactly the same uniqueness semantics as + * you'd get from a normally-created constraint; and there's also + * the dump/reload problem mentioned above. + */ + defopclass = GetDefaultOpClass(attform->atttypid, + index_rel->rd_rel->relam); + if (indclass->values[i] != defopclass || + index_rel->rd_indoption[i] != 0) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("index \"%s\" does not have default sorting behavior", index_name), + errdetail("Cannot create a primary key or unique constraint using such an index."), + parser_errposition(cxt->pstate, constraint->location))); + constraint->keys = lappend(constraint->keys, makeString(attname)); } /* Close the index relation but keep the lock */ @@ -1813,7 +1773,6 @@ transformIndexConstraint(Constraint *constraint, CreateStmtContext *cxt) * If it's an EXCLUDE constraint, the grammar returns a list of pairs of * IndexElems and operator names. We have to break that apart into * separate lists. - * NOTE that exclusion constraints don't support included nonkey attributes */ if (constraint->contype == CONSTR_EXCLUSION) { @@ -1968,48 +1927,6 @@ transformIndexConstraint(Constraint *constraint, CreateStmtContext *cxt) index->indexParams = lappend(index->indexParams, iparam); } - /* Here is some ugly code duplication. But we do need it. */ - foreach(lc, constraint->including) - { - char *key = strVal(lfirst(lc)); - bool found = false; - ColumnDef *column = NULL; - ListCell *columns; - IndexElem *iparam; - - foreach(columns, cxt->columns) - { - column = (ColumnDef *) lfirst(columns); - Assert(IsA(column, ColumnDef)); - if (strcmp(column->colname, key) == 0) - { - found = true; - break; - } - } - - /* - * In the ALTER TABLE case, don't complain about index keys not - * created in the command; they may well exist already. DefineIndex - * will complain about them if not, and will also take care of marking - * them NOT NULL. - */ - if (!found && !cxt->isalter) - ereport(ERROR, - (errcode(ERRCODE_UNDEFINED_COLUMN), - errmsg("column \"%s\" named in key does not exist", key), - parser_errposition(cxt->pstate, constraint->location))); - - /* OK, add it to the index definition */ - iparam = makeNode(IndexElem); - iparam->name = pstrdup(key); - iparam->expr = NULL; - iparam->indexcolname = NULL; - iparam->collation = NIL; - iparam->opclass = NIL; - index->indexIncludingParams = lappend(index->indexIncludingParams, iparam); - } - return index; } |
