* 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 ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers