diff options
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/commands/cluster.c | 28 | ||||
-rw-r--r-- | src/backend/commands/indexcmds.c | 36 | ||||
-rw-r--r-- | src/backend/nodes/copyfuncs.c | 4 | ||||
-rw-r--r-- | src/backend/nodes/equalfuncs.c | 4 | ||||
-rw-r--r-- | src/backend/parser/gram.y | 54 | ||||
-rw-r--r-- | src/backend/tcop/utility.c | 15 |
6 files changed, 103 insertions, 38 deletions
diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index 04d12a7ece6..fd5a6eec862 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -35,6 +35,7 @@ #include "catalog/pg_am.h" #include "catalog/toasting.h" #include "commands/cluster.h" +#include "commands/defrem.h" #include "commands/progress.h" #include "commands/tablecmds.h" #include "commands/vacuum.h" @@ -99,8 +100,29 @@ static List *get_tables_to_cluster(MemoryContext cluster_context); *--------------------------------------------------------------------------- */ void -cluster(ClusterStmt *stmt, bool isTopLevel) +cluster(ParseState *pstate, ClusterStmt *stmt, bool isTopLevel) { + ListCell *lc; + int options = 0; + bool verbose = false; + + /* Parse option list */ + foreach(lc, stmt->params) + { + DefElem *opt = (DefElem *) lfirst(lc); + + if (strcmp(opt->defname, "verbose") == 0) + verbose = defGetBoolean(opt); + else + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("unrecognized CLUSTER option \"%s\"", + opt->defname), + parser_errposition(pstate, opt->location))); + } + + options = (verbose ? CLUOPT_VERBOSE : 0); + if (stmt->relation != NULL) { /* This is the single-relation case. */ @@ -170,7 +192,7 @@ cluster(ClusterStmt *stmt, bool isTopLevel) table_close(rel, NoLock); /* Do the job. */ - cluster_rel(tableOid, indexOid, stmt->options); + cluster_rel(tableOid, indexOid, options); } else { @@ -219,7 +241,7 @@ cluster(ClusterStmt *stmt, bool isTopLevel) PushActiveSnapshot(GetTransactionSnapshot()); /* Do the job. */ cluster_rel(rvtc->tableOid, rvtc->indexOid, - stmt->options | CLUOPT_RECHECK); + options | CLUOPT_RECHECK); PopActiveSnapshot(); CommitTransactionCommand(); } diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index d35deb433aa..14d24b3cc40 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -2452,6 +2452,42 @@ ChooseIndexColumnNames(List *indexElems) } /* + * ReindexParseOptions + * Parse list of REINDEX options, returning a bitmask of ReindexOption. + */ +int +ReindexParseOptions(ParseState *pstate, ReindexStmt *stmt) +{ + ListCell *lc; + int options = 0; + bool concurrently = false; + bool verbose = false; + + /* Parse option list */ + foreach(lc, stmt->params) + { + DefElem *opt = (DefElem *) lfirst(lc); + + if (strcmp(opt->defname, "verbose") == 0) + verbose = defGetBoolean(opt); + else if (strcmp(opt->defname, "concurrently") == 0) + concurrently = defGetBoolean(opt); + else + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("unrecognized REINDEX option \"%s\"", + opt->defname), + parser_errposition(pstate, opt->location))); + } + + options = + (verbose ? REINDEXOPT_VERBOSE : 0) | + (concurrently ? REINDEXOPT_CONCURRENTLY : 0); + + return options; +} + +/* * ReindexIndex * Recreate a specific index. */ diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index 74882597f92..910906f6396 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -3349,7 +3349,7 @@ _copyClusterStmt(const ClusterStmt *from) COPY_NODE_FIELD(relation); COPY_STRING_FIELD(indexname); - COPY_SCALAR_FIELD(options); + COPY_NODE_FIELD(params); return newnode; } @@ -4443,7 +4443,7 @@ _copyReindexStmt(const ReindexStmt *from) COPY_SCALAR_FIELD(kind); COPY_NODE_FIELD(relation); COPY_STRING_FIELD(name); - COPY_SCALAR_FIELD(options); + COPY_NODE_FIELD(params); return newnode; } diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index e69815d1c52..687609f59eb 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -1210,7 +1210,7 @@ _equalClusterStmt(const ClusterStmt *a, const ClusterStmt *b) { COMPARE_NODE_FIELD(relation); COMPARE_STRING_FIELD(indexname); - COMPARE_SCALAR_FIELD(options); + COMPARE_NODE_FIELD(params); return true; } @@ -2130,7 +2130,7 @@ _equalReindexStmt(const ReindexStmt *a, const ReindexStmt *b) COMPARE_SCALAR_FIELD(kind); COMPARE_NODE_FIELD(relation); COMPARE_STRING_FIELD(name); - COMPARE_SCALAR_FIELD(options); + COMPARE_NODE_FIELD(params); return true; } diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index cbd5fa3cc05..61f02360415 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -515,7 +515,6 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type <list> generic_option_list alter_generic_option_list %type <ival> reindex_target_type reindex_target_multitable -%type <ival> reindex_option_list reindex_option_elem %type <node> copy_generic_opt_arg copy_generic_opt_arg_list_item %type <defelt> copy_generic_opt_elem @@ -8217,9 +8216,10 @@ ReindexStmt: n->kind = $2; n->relation = $4; n->name = NULL; - n->options = 0; + n->params = NIL; if ($3) - n->options |= REINDEXOPT_CONCURRENTLY; + n->params = lappend(n->params, + makeDefElem("concurrently", NULL, @3)); $$ = (Node *)n; } | REINDEX reindex_target_multitable opt_concurrently name @@ -8228,31 +8228,34 @@ ReindexStmt: n->kind = $2; n->name = $4; n->relation = NULL; - n->options = 0; + n->params = NIL; if ($3) - n->options |= REINDEXOPT_CONCURRENTLY; + n->params = lappend(n->params, + makeDefElem("concurrently", NULL, @3)); $$ = (Node *)n; } - | REINDEX '(' reindex_option_list ')' reindex_target_type opt_concurrently qualified_name + | REINDEX '(' utility_option_list ')' reindex_target_type opt_concurrently qualified_name { ReindexStmt *n = makeNode(ReindexStmt); n->kind = $5; n->relation = $7; n->name = NULL; - n->options = $3; + n->params = $3; if ($6) - n->options |= REINDEXOPT_CONCURRENTLY; + n->params = lappend(n->params, + makeDefElem("concurrently", NULL, @6)); $$ = (Node *)n; } - | REINDEX '(' reindex_option_list ')' reindex_target_multitable opt_concurrently name + | REINDEX '(' utility_option_list ')' reindex_target_multitable opt_concurrently name { ReindexStmt *n = makeNode(ReindexStmt); n->kind = $5; n->name = $7; n->relation = NULL; - n->options = $3; + n->params = $3; if ($6) - n->options |= REINDEXOPT_CONCURRENTLY; + n->params = lappend(n->params, + makeDefElem("concurrently", NULL, @6)); $$ = (Node *)n; } ; @@ -8265,13 +8268,6 @@ reindex_target_multitable: | SYSTEM_P { $$ = REINDEX_OBJECT_SYSTEM; } | DATABASE { $$ = REINDEX_OBJECT_DATABASE; } ; -reindex_option_list: - reindex_option_elem { $$ = $1; } - | reindex_option_list ',' reindex_option_elem { $$ = $1 | $3; } - ; -reindex_option_elem: - VERBOSE { $$ = REINDEXOPT_VERBOSE; } - ; /***************************************************************************** * @@ -10407,6 +10403,7 @@ CreateConversionStmt: * * QUERY: * CLUSTER [VERBOSE] <qualified_name> [ USING <index_name> ] + * CLUSTER [ (options) ] <qualified_name> [ USING <index_name> ] * CLUSTER [VERBOSE] * CLUSTER [VERBOSE] <index_name> ON <qualified_name> (for pre-8.3) * @@ -10418,9 +10415,18 @@ ClusterStmt: ClusterStmt *n = makeNode(ClusterStmt); n->relation = $3; n->indexname = $4; - n->options = 0; + n->params = NIL; if ($2) - n->options |= CLUOPT_VERBOSE; + n->params = lappend(n->params, makeDefElem("verbose", NULL, @2)); + $$ = (Node*)n; + } + + | CLUSTER '(' utility_option_list ')' qualified_name cluster_index_specification + { + ClusterStmt *n = makeNode(ClusterStmt); + n->relation = $5; + n->indexname = $6; + n->params = $3; $$ = (Node*)n; } | CLUSTER opt_verbose @@ -10428,9 +10434,9 @@ ClusterStmt: ClusterStmt *n = makeNode(ClusterStmt); n->relation = NULL; n->indexname = NULL; - n->options = 0; + n->params = NIL; if ($2) - n->options |= CLUOPT_VERBOSE; + n->params = lappend(n->params, makeDefElem("verbose", NULL, @2)); $$ = (Node*)n; } /* kept for pre-8.3 compatibility */ @@ -10439,9 +10445,9 @@ ClusterStmt: ClusterStmt *n = makeNode(ClusterStmt); n->relation = $5; n->indexname = $3; - n->options = 0; + n->params = NIL; if ($2) - n->options |= CLUOPT_VERBOSE; + n->params = lappend(n->params, makeDefElem("verbose", NULL, @2)); $$ = (Node*)n; } ; diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index 81ac9b1cb2d..a42ead7d698 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -22,6 +22,7 @@ #include "access/xact.h" #include "access/xlog.h" #include "catalog/catalog.h" +#include "catalog/index.h" #include "catalog/namespace.h" #include "catalog/pg_inherits.h" #include "catalog/toasting.h" @@ -818,7 +819,7 @@ standard_ProcessUtility(PlannedStmt *pstmt, break; case T_ClusterStmt: - cluster((ClusterStmt *) parsetree, isTopLevel); + cluster(pstate, (ClusterStmt *) parsetree, isTopLevel); break; case T_VacuumStmt: @@ -918,20 +919,20 @@ standard_ProcessUtility(PlannedStmt *pstmt, case T_ReindexStmt: { ReindexStmt *stmt = (ReindexStmt *) parsetree; + int options; - if ((stmt->options & REINDEXOPT_CONCURRENTLY) != 0) + options = ReindexParseOptions(pstate, stmt); + if ((options & REINDEXOPT_CONCURRENTLY) != 0) PreventInTransactionBlock(isTopLevel, "REINDEX CONCURRENTLY"); switch (stmt->kind) { case REINDEX_OBJECT_INDEX: - ReindexIndex(stmt->relation, stmt->options, - isTopLevel); + ReindexIndex(stmt->relation, options, isTopLevel); break; case REINDEX_OBJECT_TABLE: - ReindexTable(stmt->relation, stmt->options, - isTopLevel); + ReindexTable(stmt->relation, options, isTopLevel); break; case REINDEX_OBJECT_SCHEMA: case REINDEX_OBJECT_SYSTEM: @@ -947,7 +948,7 @@ standard_ProcessUtility(PlannedStmt *pstmt, (stmt->kind == REINDEX_OBJECT_SCHEMA) ? "REINDEX SCHEMA" : (stmt->kind == REINDEX_OBJECT_SYSTEM) ? "REINDEX SYSTEM" : "REINDEX DATABASE"); - ReindexMultipleTables(stmt->name, stmt->kind, stmt->options); + ReindexMultipleTables(stmt->name, stmt->kind, options); break; default: elog(ERROR, "unrecognized object type: %d", |