Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitb5913f6

Browse files
committed
Refactor CLUSTER and REINDEX grammar to use DefElem for option lists
This changes CLUSTER and REINDEX so as a parenthesized grammar becomespossible for options, while unifying the grammar parsing rules foroption lists with the existing ones.This is a follow-up of the work done in 873ea9e for VACUUM, ANALYZE andEXPLAIN. This benefits REINDEX for a potential backend-side filteringfor collatable-sensitive indexes and TABLESPACE, while CLUSTER wouldbenefit from the latter.Author: Alexey Kondratov, Justin PryzbyDiscussion:https://postgr.es/m/8a8f5f73-00d3-55f8-7583-1375ca8f6a91@postgrespro.ru
1 parentdc11f31 commitb5913f6

File tree

15 files changed

+180
-62
lines changed

15 files changed

+180
-62
lines changed

‎doc/src/sgml/ref/cluster.sgml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,13 @@ PostgreSQL documentation
2222
<refsynopsisdiv>
2323
<synopsis>
2424
CLUSTER [VERBOSE] <replaceable class="parameter">table_name</replaceable> [ USING <replaceable class="parameter">index_name</replaceable> ]
25+
CLUSTER ( <replaceable class="parameter">option</replaceable> [, ...] ) <replaceable class="parameter">table_name</replaceable> [ USING <replaceable class="parameter">index_name</replaceable> ]
2526
CLUSTER [VERBOSE]
27+
28+
<phrase>where <replaceable class="parameter">option</replaceable> can be one of:</phrase>
29+
30+
VERBOSE [ <replaceable class="parameter">boolean</replaceable> ]
31+
2632
</synopsis>
2733
</refsynopsisdiv>
2834

@@ -107,6 +113,20 @@ CLUSTER [VERBOSE]
107113
</para>
108114
</listitem>
109115
</varlistentry>
116+
117+
<varlistentry>
118+
<term><replaceable class="parameter">boolean</replaceable></term>
119+
<listitem>
120+
<para>
121+
Specifies whether the selected option should be turned on or off.
122+
You can write <literal>TRUE</literal>, <literal>ON</literal>, or
123+
<literal>1</literal> to enable the option, and <literal>FALSE</literal>,
124+
<literal>OFF</literal>, or <literal>0</literal> to disable it. The
125+
<replaceable class="parameter">boolean</replaceable> value can also
126+
be omitted, in which case <literal>TRUE</literal> is assumed.
127+
</para>
128+
</listitem>
129+
</varlistentry>
110130
</variablelist>
111131
</refsect1>
112132

‎doc/src/sgml/ref/reindex.sgml

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ REINDEX [ ( <replaceable class="parameter">option</replaceable> [, ...] ) ] { IN
2525

2626
<phrase>where <replaceable class="parameter">option</replaceable> can be one of:</phrase>
2727

28-
VERBOSE
28+
CONCURRENTLY [ <replaceable class="parameter">boolean</replaceable> ]
29+
VERBOSE [ <replaceable class="parameter">boolean</replaceable> ]
2930
</synopsis>
3031
</refsynopsisdiv>
3132

@@ -194,6 +195,21 @@ REINDEX [ ( <replaceable class="parameter">option</replaceable> [, ...] ) ] { IN
194195
</para>
195196
</listitem>
196197
</varlistentry>
198+
199+
<varlistentry>
200+
<term><replaceable class="parameter">boolean</replaceable></term>
201+
<listitem>
202+
<para>
203+
Specifies whether the selected option should be turned on or off.
204+
You can write <literal>TRUE</literal>, <literal>ON</literal>, or
205+
<literal>1</literal> to enable the option, and <literal>FALSE</literal>,
206+
<literal>OFF</literal>, or <literal>0</literal> to disable it. The
207+
<replaceable class="parameter">boolean</replaceable> value can also
208+
be omitted, in which case <literal>TRUE</literal> is assumed.
209+
</para>
210+
</listitem>
211+
</varlistentry>
212+
197213
</variablelist>
198214
</refsect1>
199215

‎src/backend/commands/cluster.c

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include"catalog/pg_am.h"
3636
#include"catalog/toasting.h"
3737
#include"commands/cluster.h"
38+
#include"commands/defrem.h"
3839
#include"commands/progress.h"
3940
#include"commands/tablecmds.h"
4041
#include"commands/vacuum.h"
@@ -99,8 +100,29 @@ static List *get_tables_to_cluster(MemoryContext cluster_context);
99100
*---------------------------------------------------------------------------
100101
*/
101102
void
102-
cluster(ClusterStmt*stmt,boolisTopLevel)
103+
cluster(ParseState*pstate,ClusterStmt*stmt,boolisTopLevel)
103104
{
105+
ListCell*lc;
106+
intoptions=0;
107+
boolverbose= false;
108+
109+
/* Parse option list */
110+
foreach(lc,stmt->params)
111+
{
112+
DefElem*opt= (DefElem*)lfirst(lc);
113+
114+
if (strcmp(opt->defname,"verbose")==0)
115+
verbose=defGetBoolean(opt);
116+
else
117+
ereport(ERROR,
118+
(errcode(ERRCODE_SYNTAX_ERROR),
119+
errmsg("unrecognized CLUSTER option \"%s\"",
120+
opt->defname),
121+
parser_errposition(pstate,opt->location)));
122+
}
123+
124+
options= (verbose ?CLUOPT_VERBOSE :0);
125+
104126
if (stmt->relation!=NULL)
105127
{
106128
/* This is the single-relation case. */
@@ -170,7 +192,7 @@ cluster(ClusterStmt *stmt, bool isTopLevel)
170192
table_close(rel,NoLock);
171193

172194
/* Do the job. */
173-
cluster_rel(tableOid,indexOid,stmt->options);
195+
cluster_rel(tableOid,indexOid,options);
174196
}
175197
else
176198
{
@@ -219,7 +241,7 @@ cluster(ClusterStmt *stmt, bool isTopLevel)
219241
PushActiveSnapshot(GetTransactionSnapshot());
220242
/* Do the job. */
221243
cluster_rel(rvtc->tableOid,rvtc->indexOid,
222-
stmt->options |CLUOPT_RECHECK);
244+
options |CLUOPT_RECHECK);
223245
PopActiveSnapshot();
224246
CommitTransactionCommand();
225247
}

‎src/backend/commands/indexcmds.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2451,6 +2451,42 @@ ChooseIndexColumnNames(List *indexElems)
24512451
returnresult;
24522452
}
24532453

2454+
/*
2455+
* ReindexParseOptions
2456+
*Parse list of REINDEX options, returning a bitmask of ReindexOption.
2457+
*/
2458+
int
2459+
ReindexParseOptions(ParseState*pstate,ReindexStmt*stmt)
2460+
{
2461+
ListCell*lc;
2462+
intoptions=0;
2463+
boolconcurrently= false;
2464+
boolverbose= false;
2465+
2466+
/* Parse option list */
2467+
foreach(lc,stmt->params)
2468+
{
2469+
DefElem*opt= (DefElem*)lfirst(lc);
2470+
2471+
if (strcmp(opt->defname,"verbose")==0)
2472+
verbose=defGetBoolean(opt);
2473+
elseif (strcmp(opt->defname,"concurrently")==0)
2474+
concurrently=defGetBoolean(opt);
2475+
else
2476+
ereport(ERROR,
2477+
(errcode(ERRCODE_SYNTAX_ERROR),
2478+
errmsg("unrecognized REINDEX option \"%s\"",
2479+
opt->defname),
2480+
parser_errposition(pstate,opt->location)));
2481+
}
2482+
2483+
options=
2484+
(verbose ?REINDEXOPT_VERBOSE :0) |
2485+
(concurrently ?REINDEXOPT_CONCURRENTLY :0);
2486+
2487+
returnoptions;
2488+
}
2489+
24542490
/*
24552491
* ReindexIndex
24562492
*Recreate a specific index.

‎src/backend/nodes/copyfuncs.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3349,7 +3349,7 @@ _copyClusterStmt(const ClusterStmt *from)
33493349

33503350
COPY_NODE_FIELD(relation);
33513351
COPY_STRING_FIELD(indexname);
3352-
COPY_SCALAR_FIELD(options);
3352+
COPY_NODE_FIELD(params);
33533353

33543354
returnnewnode;
33553355
}
@@ -4443,7 +4443,7 @@ _copyReindexStmt(const ReindexStmt *from)
44434443
COPY_SCALAR_FIELD(kind);
44444444
COPY_NODE_FIELD(relation);
44454445
COPY_STRING_FIELD(name);
4446-
COPY_SCALAR_FIELD(options);
4446+
COPY_NODE_FIELD(params);
44474447

44484448
returnnewnode;
44494449
}

‎src/backend/nodes/equalfuncs.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1210,7 +1210,7 @@ _equalClusterStmt(const ClusterStmt *a, const ClusterStmt *b)
12101210
{
12111211
COMPARE_NODE_FIELD(relation);
12121212
COMPARE_STRING_FIELD(indexname);
1213-
COMPARE_SCALAR_FIELD(options);
1213+
COMPARE_NODE_FIELD(params);
12141214

12151215
return true;
12161216
}
@@ -2130,7 +2130,7 @@ _equalReindexStmt(const ReindexStmt *a, const ReindexStmt *b)
21302130
COMPARE_SCALAR_FIELD(kind);
21312131
COMPARE_NODE_FIELD(relation);
21322132
COMPARE_STRING_FIELD(name);
2133-
COMPARE_SCALAR_FIELD(options);
2133+
COMPARE_NODE_FIELD(params);
21342134

21352135
return true;
21362136
}

‎src/backend/parser/gram.y

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,6 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
515515
%type<list>generic_option_listalter_generic_option_list
516516

517517
%type<ival>reindex_target_typereindex_target_multitable
518-
%type<ival>reindex_option_listreindex_option_elem
519518

520519
%type<node>copy_generic_opt_argcopy_generic_opt_arg_list_item
521520
%type<defelt>copy_generic_opt_elem
@@ -8217,9 +8216,10 @@ ReindexStmt:
82178216
n->kind =$2;
82188217
n->relation =$4;
82198218
n->name =NULL;
8220-
n->options =0;
8219+
n->params =NIL;
82218220
if ($3)
8222-
n->options |= REINDEXOPT_CONCURRENTLY;
8221+
n->params = lappend(n->params,
8222+
makeDefElem("concurrently",NULL, @3));
82238223
$$ = (Node *)n;
82248224
}
82258225
|REINDEXreindex_target_multitableopt_concurrentlyname
@@ -8228,31 +8228,34 @@ ReindexStmt:
82288228
n->kind =$2;
82298229
n->name =$4;
82308230
n->relation =NULL;
8231-
n->options =0;
8231+
n->params =NIL;
82328232
if ($3)
8233-
n->options |= REINDEXOPT_CONCURRENTLY;
8233+
n->params = lappend(n->params,
8234+
makeDefElem("concurrently",NULL, @3));
82348235
$$ = (Node *)n;
82358236
}
8236-
|REINDEX'('reindex_option_list')'reindex_target_typeopt_concurrentlyqualified_name
8237+
|REINDEX'('utility_option_list')'reindex_target_typeopt_concurrentlyqualified_name
82378238
{
82388239
ReindexStmt *n = makeNode(ReindexStmt);
82398240
n->kind =$5;
82408241
n->relation =$7;
82418242
n->name =NULL;
8242-
n->options =$3;
8243+
n->params =$3;
82438244
if ($6)
8244-
n->options |= REINDEXOPT_CONCURRENTLY;
8245+
n->params = lappend(n->params,
8246+
makeDefElem("concurrently",NULL, @6));
82458247
$$ = (Node *)n;
82468248
}
8247-
|REINDEX'('reindex_option_list')'reindex_target_multitableopt_concurrentlyname
8249+
|REINDEX'('utility_option_list')'reindex_target_multitableopt_concurrentlyname
82488250
{
82498251
ReindexStmt *n = makeNode(ReindexStmt);
82508252
n->kind =$5;
82518253
n->name =$7;
82528254
n->relation =NULL;
8253-
n->options =$3;
8255+
n->params =$3;
82548256
if ($6)
8255-
n->options |= REINDEXOPT_CONCURRENTLY;
8257+
n->params = lappend(n->params,
8258+
makeDefElem("concurrently",NULL, @6));
82568259
$$ = (Node *)n;
82578260
}
82588261
;
@@ -8265,13 +8268,6 @@ reindex_target_multitable:
82658268
|SYSTEM_P{$$ = REINDEX_OBJECT_SYSTEM; }
82668269
|DATABASE{$$ = REINDEX_OBJECT_DATABASE; }
82678270
;
8268-
reindex_option_list:
8269-
reindex_option_elem{$$ =$1; }
8270-
|reindex_option_list','reindex_option_elem{$$ =$1 |$3; }
8271-
;
8272-
reindex_option_elem:
8273-
VERBOSE{$$ = REINDEXOPT_VERBOSE; }
8274-
;
82758271

82768272
/*****************************************************************************
82778273
*
@@ -10407,6 +10403,7 @@ CreateConversionStmt:
1040710403
*
1040810404
*QUERY:
1040910405
*CLUSTER [VERBOSE] <qualified_name> [ USING <index_name> ]
10406+
*CLUSTER [ (options) ] <qualified_name> [ USING <index_name> ]
1041010407
*CLUSTER [VERBOSE]
1041110408
*CLUSTER [VERBOSE] <index_name> ON <qualified_name> (for pre-8.3)
1041210409
*
@@ -10418,19 +10415,28 @@ ClusterStmt:
1041810415
ClusterStmt *n = makeNode(ClusterStmt);
1041910416
n->relation =$3;
1042010417
n->indexname =$4;
10421-
n->options =0;
10418+
n->params =NIL;
1042210419
if ($2)
10423-
n->options |= CLUOPT_VERBOSE;
10420+
n->params = lappend(n->params, makeDefElem("verbose",NULL,@2));
10421+
$$ = (Node*)n;
10422+
}
10423+
10424+
|CLUSTER'('utility_option_list')'qualified_namecluster_index_specification
10425+
{
10426+
ClusterStmt *n = makeNode(ClusterStmt);
10427+
n->relation =$5;
10428+
n->indexname =$6;
10429+
n->params =$3;
1042410430
$$ = (Node*)n;
1042510431
}
1042610432
|CLUSTERopt_verbose
1042710433
{
1042810434
ClusterStmt *n = makeNode(ClusterStmt);
1042910435
n->relation =NULL;
1043010436
n->indexname =NULL;
10431-
n->options =0;
10437+
n->params =NIL;
1043210438
if ($2)
10433-
n->options |= CLUOPT_VERBOSE;
10439+
n->params = lappend(n->params, makeDefElem("verbose",NULL,@2));
1043410440
$$ = (Node*)n;
1043510441
}
1043610442
/* kept for pre-8.3 compatibility*/
@@ -10439,9 +10445,9 @@ ClusterStmt:
1043910445
ClusterStmt *n = makeNode(ClusterStmt);
1044010446
n->relation =$5;
1044110447
n->indexname =$3;
10442-
n->options =0;
10448+
n->params =NIL;
1044310449
if ($2)
10444-
n->options |= CLUOPT_VERBOSE;
10450+
n->params = lappend(n->params, makeDefElem("verbose",NULL,@2));
1044510451
$$ = (Node*)n;
1044610452
}
1044710453
;

‎src/backend/tcop/utility.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include"access/xact.h"
2323
#include"access/xlog.h"
2424
#include"catalog/catalog.h"
25+
#include"catalog/index.h"
2526
#include"catalog/namespace.h"
2627
#include"catalog/pg_inherits.h"
2728
#include"catalog/toasting.h"
@@ -818,7 +819,7 @@ standard_ProcessUtility(PlannedStmt *pstmt,
818819
break;
819820

820821
caseT_ClusterStmt:
821-
cluster((ClusterStmt*)parsetree,isTopLevel);
822+
cluster(pstate,(ClusterStmt*)parsetree,isTopLevel);
822823
break;
823824

824825
caseT_VacuumStmt:
@@ -918,20 +919,20 @@ standard_ProcessUtility(PlannedStmt *pstmt,
918919
caseT_ReindexStmt:
919920
{
920921
ReindexStmt*stmt= (ReindexStmt*)parsetree;
922+
intoptions;
921923

922-
if ((stmt->options&REINDEXOPT_CONCURRENTLY)!=0)
924+
options=ReindexParseOptions(pstate,stmt);
925+
if ((options&REINDEXOPT_CONCURRENTLY)!=0)
923926
PreventInTransactionBlock(isTopLevel,
924927
"REINDEX CONCURRENTLY");
925928

926929
switch (stmt->kind)
927930
{
928931
caseREINDEX_OBJECT_INDEX:
929-
ReindexIndex(stmt->relation,stmt->options,
930-
isTopLevel);
932+
ReindexIndex(stmt->relation,options,isTopLevel);
931933
break;
932934
caseREINDEX_OBJECT_TABLE:
933-
ReindexTable(stmt->relation,stmt->options,
934-
isTopLevel);
935+
ReindexTable(stmt->relation,options,isTopLevel);
935936
break;
936937
caseREINDEX_OBJECT_SCHEMA:
937938
caseREINDEX_OBJECT_SYSTEM:
@@ -947,7 +948,7 @@ standard_ProcessUtility(PlannedStmt *pstmt,
947948
(stmt->kind==REINDEX_OBJECT_SCHEMA) ?"REINDEX SCHEMA" :
948949
(stmt->kind==REINDEX_OBJECT_SYSTEM) ?"REINDEX SYSTEM" :
949950
"REINDEX DATABASE");
950-
ReindexMultipleTables(stmt->name,stmt->kind,stmt->options);
951+
ReindexMultipleTables(stmt->name,stmt->kind,options);
951952
break;
952953
default:
953954
elog(ERROR,"unrecognized object type: %d",

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp