* What I am working on* - since we want to create an index on the referencing column, I am working on firing a 'CREATE INDEX' query programatically right after the 'CREATE TABLE' query - The problem I ran into is how to specify my Strategy ( GinContainsElemStrategy) within the CREATE INDEX query. For example: CREATE INDEX ON fktable USING gin (fkcolumn array_ops) Where does the strategy number fit? - The patch is attached here, is the approach I took to creating an index programmatically, correct?
Best Regard, Mark Rofail
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index dc18fd1eae..085b63aa98 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -7139,6 +7139,31 @@ ATAddForeignKeyConstraint(AlteredTableInfo *tab, Relation rel, ereport(ERROR, (errcode(ERRCODE_INVALID_FOREIGN_KEY), errmsg("array foreign keys support only NO ACTION and RESTRICT actions"))); + + IndexStmt *stmt = makeNode(IndexStmt); + stmt->unique = false; /* is index unique? Nope, should allow duplicates*/ + stmt->concurrent = false; /* should this be a concurrent index build? we want + to lock out writes on the table until it's done. */ + stmt->idxname = NULL; /* let the idxname be generated */ + stmt->relation = /* relation name */; + stmt->accessMethod = "gin"; /* name of access method: GIN */ + stmt->indexParams = /* column name + */"array_ops"; + stmt->options = NULL; + stmt->tableSpace = NULL; /* NULL for default */ + stmt->whereClause = NULL; + stmt->excludeOpNames = NIL; + stmt->idxcomment = NULL; + stmt->indexOid = InvalidOid; + stmt->oldNode = InvalidOid; /* relfilenode of existing storage, if any: None*/ + stmt->primary = false; /* is index a primary key? Nope */ + stmt->isconstraint = false; /* is it for a pkey/unique constraint? Nope */ + stmt->deferrable = false; + stmt->initdeferred = false; + stmt->transformed = false; + stmt->if_not_exists = false; /* just do nothing if index already exists? Nope + (this shouldn't happen)*/ + + ATExecAddIndex(tab, rel, stmt, true, lockmode); } /* diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c index 3a25ba52f3..0045f64c9e 100644 --- a/src/backend/utils/adt/ri_triggers.c +++ b/src/backend/utils/adt/ri_triggers.c @@ -2650,7 +2650,7 @@ quoteRelationName(char *buffer, Relation rel) * ri_GenerateQual --- generate a WHERE clause equating two variables * * The idea is to append " sep leftop op rightop" to buf, or if fkreftype is - * FKCONSTR_REF_EACH_ELEMENT, append " sep leftop op ANY(rightop)" to buf. + * FKCONSTR_REF_EACH_ELEMENT, append " sep leftop <@ rightop" to buf. * * The complexity comes from needing to be sure that the parser will select * the desired operator. We always name the operator using @@ -2697,17 +2697,10 @@ ri_GenerateQual(StringInfo buf, appendStringInfo(buf, " %s %s", sep, leftop); if (leftoptype != operform->oprleft) ri_add_cast_to(buf, operform->oprleft); - - appendStringInfo(buf, " OPERATOR(%s.%s) ", - quote_identifier(nspname), oprname); - - if (fkreftype == FKCONSTR_REF_EACH_ELEMENT) - appendStringInfoString(buf, "ANY ("); + appendStringInfo(buf, " @> "); appendStringInfoString(buf, rightop); if (rightoptype != oprright) ri_add_cast_to(buf, oprright); - if (fkreftype == FKCONSTR_REF_EACH_ELEMENT) - appendStringInfoChar(buf, ')'); ReleaseSysCache(opertup); }
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers