Age Owner Branch data TLA Line data Source code
1 : : %{
2 : :
3 : : /*#define YYDEBUG 1*/
4 : : /*-------------------------------------------------------------------------
5 : : *
6 : : * gram.y
7 : : * POSTGRESQL BISON rules/actions
8 : : *
9 : : * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
10 : : * Portions Copyright (c) 1994, Regents of the University of California
11 : : *
12 : : *
13 : : * IDENTIFICATION
14 : : * src/backend/parser/gram.y
15 : : *
16 : : * HISTORY
17 : : * AUTHOR DATE MAJOR EVENT
18 : : * Andrew Yu Sept, 1994 POSTQUEL to SQL conversion
19 : : * Andrew Yu Oct, 1994 lispy code conversion
20 : : *
21 : : * NOTES
22 : : * CAPITALS are used to represent terminal symbols.
23 : : * non-capitals are used to represent non-terminals.
24 : : *
25 : : * In general, nothing in this file should initiate database accesses
26 : : * nor depend on changeable state (such as SET variables). If you do
27 : : * database accesses, your code will fail when we have aborted the
28 : : * current transaction and are just parsing commands to find the next
29 : : * ROLLBACK or COMMIT. If you make use of SET variables, then you
30 : : * will do the wrong thing in multi-query strings like this:
31 : : * SET constraint_exclusion TO off; SELECT * FROM foo;
32 : : * because the entire string is parsed by gram.y before the SET gets
33 : : * executed. Anything that depends on the database or changeable state
34 : : * should be handled during parse analysis so that it happens at the
35 : : * right time not the wrong time.
36 : : *
37 : : * WARNINGS
38 : : * If you use a list, make sure the datum is a node so that the printing
39 : : * routines work.
40 : : *
41 : : * Sometimes we assign constants to makeStrings. Make sure we don't free
42 : : * those.
43 : : *
44 : : *-------------------------------------------------------------------------
45 : : */
46 : : #include "postgres.h"
47 : :
48 : : #include <ctype.h>
49 : : #include <limits.h>
50 : :
51 : : #include "access/tableam.h"
52 : : #include "catalog/index.h"
53 : : #include "catalog/namespace.h"
54 : : #include "catalog/pg_am.h"
55 : : #include "catalog/pg_trigger.h"
56 : : #include "commands/defrem.h"
57 : : #include "commands/trigger.h"
58 : : #include "gramparse.h"
59 : : #include "nodes/makefuncs.h"
60 : : #include "nodes/nodeFuncs.h"
61 : : #include "parser/parser.h"
62 : : #include "storage/lmgr.h"
63 : : #include "utils/date.h"
64 : : #include "utils/datetime.h"
65 : : #include "utils/numeric.h"
66 : : #include "utils/xml.h"
67 : :
68 : :
69 : : /*
70 : : * Location tracking support --- simpler than bison's default, since we only
71 : : * want to track the start position not the end position of each nonterminal.
72 : : */
73 : : #define YYLLOC_DEFAULT(Current, Rhs, N) \
74 : : do { \
75 : : if ((N) > 0) \
76 : : (Current) = (Rhs)[1]; \
77 : : else \
78 : : (Current) = (-1); \
79 : : } while (0)
80 : :
81 : : /*
82 : : * The above macro assigns -1 (unknown) as the parse location of any
83 : : * nonterminal that was reduced from an empty rule, or whose leftmost
84 : : * component was reduced from an empty rule. This is problematic
85 : : * for nonterminals defined like
86 : : * OptFooList: / * EMPTY * / { ... } | OptFooList Foo { ... } ;
87 : : * because we'll set -1 as the location during the first reduction and then
88 : : * copy it during each subsequent reduction, leaving us with -1 for the
89 : : * location even when the list is not empty. To fix that, do this in the
90 : : * action for the nonempty rule(s):
91 : : * if (@$ < 0) @$ = @2;
92 : : * (Although we have many nonterminals that follow this pattern, we only
93 : : * bother with fixing @$ like this when the nonterminal's parse location
94 : : * is actually referenced in some rule.)
95 : : *
96 : : * A cleaner answer would be to make YYLLOC_DEFAULT scan all the Rhs
97 : : * locations until it's found one that's not -1. Then we'd get a correct
98 : : * location for any nonterminal that isn't entirely empty. But this way
99 : : * would add overhead to every rule reduction, and so far there's not been
100 : : * a compelling reason to pay that overhead.
101 : : */
102 : :
103 : : /*
104 : : * Bison doesn't allocate anything that needs to live across parser calls,
105 : : * so we can easily have it use palloc instead of malloc. This prevents
106 : : * memory leaks if we error out during parsing.
107 : : */
108 : : #define YYMALLOC palloc
109 : : #define YYFREE pfree
110 : :
111 : : /* Private struct for the result of privilege_target production */
112 : : typedef struct PrivTarget
113 : : {
114 : : GrantTargetType targtype;
115 : : ObjectType objtype;
116 : : List *objs;
117 : : } PrivTarget;
118 : :
119 : : /* Private struct for the result of import_qualification production */
120 : : typedef struct ImportQual
121 : : {
122 : : ImportForeignSchemaType type;
123 : : List *table_names;
124 : : } ImportQual;
125 : :
126 : : /* Private struct for the result of opt_select_limit production */
127 : : typedef struct SelectLimit
128 : : {
129 : : Node *limitOffset;
130 : : Node *limitCount;
131 : : LimitOption limitOption;
132 : : } SelectLimit;
133 : :
134 : : /* Private struct for the result of group_clause production */
135 : : typedef struct GroupClause
136 : : {
137 : : bool distinct;
138 : : List *list;
139 : : } GroupClause;
140 : :
141 : : /* Private structs for the result of key_actions and key_action productions */
142 : : typedef struct KeyAction
143 : : {
144 : : char action;
145 : : List *cols;
146 : : } KeyAction;
147 : :
148 : : typedef struct KeyActions
149 : : {
150 : : KeyAction *updateAction;
151 : : KeyAction *deleteAction;
152 : : } KeyActions;
153 : :
154 : : /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
155 : : #define CAS_NOT_DEFERRABLE 0x01
156 : : #define CAS_DEFERRABLE 0x02
157 : : #define CAS_INITIALLY_IMMEDIATE 0x04
158 : : #define CAS_INITIALLY_DEFERRED 0x08
159 : : #define CAS_NOT_VALID 0x10
160 : : #define CAS_NO_INHERIT 0x20
161 : :
162 : :
163 : : #define parser_yyerror(msg) scanner_yyerror(msg, yyscanner)
164 : : #define parser_errposition(pos) scanner_errposition(pos, yyscanner)
165 : :
166 : : static void base_yyerror(YYLTYPE *yylloc, core_yyscan_t yyscanner,
167 : : const char *msg);
168 : : static RawStmt *makeRawStmt(Node *stmt, int stmt_location);
169 : : static void updateRawStmtEnd(RawStmt *rs, int end_location);
170 : : static Node *makeColumnRef(char *colname, List *indirection,
171 : : int location, core_yyscan_t yyscanner);
172 : : static Node *makeTypeCast(Node *arg, TypeName *typename, int location);
173 : : static Node *makeStringConstCast(char *str, int location, TypeName *typename);
174 : : static Node *makeIntConst(int val, int location);
175 : : static Node *makeFloatConst(char *str, int location);
176 : : static Node *makeBoolAConst(bool state, int location);
177 : : static Node *makeBitStringConst(char *str, int location);
178 : : static Node *makeNullAConst(int location);
179 : : static Node *makeAConst(Node *v, int location);
180 : : static RoleSpec *makeRoleSpec(RoleSpecType type, int location);
181 : : static void check_qualified_name(List *names, core_yyscan_t yyscanner);
182 : : static List *check_func_name(List *names, core_yyscan_t yyscanner);
183 : : static List *check_indirection(List *indirection, core_yyscan_t yyscanner);
184 : : static List *extractArgTypes(List *parameters);
185 : : static List *extractAggrArgTypes(List *aggrargs);
186 : : static List *makeOrderedSetArgs(List *directargs, List *orderedargs,
187 : : core_yyscan_t yyscanner);
188 : : static void insertSelectOptions(SelectStmt *stmt,
189 : : List *sortClause, List *lockingClause,
190 : : SelectLimit *limitClause,
191 : : WithClause *withClause,
192 : : core_yyscan_t yyscanner);
193 : : static Node *makeSetOp(SetOperation op, bool all, Node *larg, Node *rarg);
194 : : static Node *doNegate(Node *n, int location);
195 : : static void doNegateFloat(Float *v);
196 : : static Node *makeAndExpr(Node *lexpr, Node *rexpr, int location);
197 : : static Node *makeOrExpr(Node *lexpr, Node *rexpr, int location);
198 : : static Node *makeNotExpr(Node *expr, int location);
199 : : static Node *makeAArrayExpr(List *elements, int location);
200 : : static Node *makeSQLValueFunction(SQLValueFunctionOp op, int32 typmod,
201 : : int location);
202 : : static Node *makeXmlExpr(XmlExprOp op, char *name, List *named_args,
203 : : List *args, int location);
204 : : static List *mergeTableFuncParameters(List *func_args, List *columns);
205 : : static TypeName *TableFuncTypeName(List *columns);
206 : : static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_t yyscanner);
207 : : static RangeVar *makeRangeVarFromQualifiedName(char *name, List *namelist, int location,
208 : : core_yyscan_t yyscanner);
209 : : static void SplitColQualList(List *qualList,
210 : : List **constraintList, CollateClause **collClause,
211 : : core_yyscan_t yyscanner);
212 : : static void processCASbits(int cas_bits, int location, const char *constrType,
213 : : bool *deferrable, bool *initdeferred, bool *not_valid,
214 : : bool *no_inherit, core_yyscan_t yyscanner);
215 : : static PartitionStrategy parsePartitionStrategy(char *strategy);
216 : : static void preprocess_pubobj_list(List *pubobjspec_list,
217 : : core_yyscan_t yyscanner);
218 : : static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
219 : :
220 : : %}
221 : :
222 : : %pure-parser
223 : : %expect 0
224 : : %name-prefix="base_yy"
225 : : %locations
226 : :
227 : : %parse-param {core_yyscan_t yyscanner}
228 : : %lex-param {core_yyscan_t yyscanner}
229 : :
230 : : %union
231 : : {
232 : : core_YYSTYPE core_yystype;
233 : : /* these fields must match core_YYSTYPE: */
234 : : int ival;
235 : : char *str;
236 : : const char *keyword;
237 : :
238 : : char chr;
239 : : bool boolean;
240 : : JoinType jtype;
241 : : DropBehavior dbehavior;
242 : : OnCommitAction oncommit;
243 : : List *list;
244 : : Node *node;
245 : : ObjectType objtype;
246 : : TypeName *typnam;
247 : : FunctionParameter *fun_param;
248 : : FunctionParameterMode fun_param_mode;
249 : : ObjectWithArgs *objwithargs;
250 : : DefElem *defelt;
251 : : SortBy *sortby;
252 : : WindowDef *windef;
253 : : JoinExpr *jexpr;
254 : : IndexElem *ielem;
255 : : StatsElem *selem;
256 : : Alias *alias;
257 : : RangeVar *range;
258 : : IntoClause *into;
259 : : WithClause *with;
260 : : InferClause *infer;
261 : : OnConflictClause *onconflict;
262 : : A_Indices *aind;
263 : : ResTarget *target;
264 : : struct PrivTarget *privtarget;
265 : : AccessPriv *accesspriv;
266 : : struct ImportQual *importqual;
267 : : InsertStmt *istmt;
268 : : VariableSetStmt *vsetstmt;
269 : : PartitionElem *partelem;
270 : : PartitionSpec *partspec;
271 : : PartitionBoundSpec *partboundspec;
272 : : SinglePartitionSpec *singlepartspec;
273 : : RoleSpec *rolespec;
274 : : PublicationObjSpec *publicationobjectspec;
275 : : struct SelectLimit *selectlimit;
276 : : SetQuantifier setquantifier;
277 : : struct GroupClause *groupclause;
278 : : MergeMatchKind mergematch;
279 : : MergeWhenClause *mergewhen;
280 : : struct KeyActions *keyactions;
281 : : struct KeyAction *keyaction;
282 : : }
283 : :
284 : : %type <node> stmt toplevel_stmt schema_stmt routine_body_stmt
285 : : AlterEventTrigStmt AlterCollationStmt
286 : : AlterDatabaseStmt AlterDatabaseSetStmt AlterDomainStmt AlterEnumStmt
287 : : AlterFdwStmt AlterForeignServerStmt AlterGroupStmt
288 : : AlterObjectDependsStmt AlterObjectSchemaStmt AlterOwnerStmt
289 : : AlterOperatorStmt AlterTypeStmt AlterSeqStmt AlterSystemStmt AlterTableStmt
290 : : AlterTblSpcStmt AlterExtensionStmt AlterExtensionContentsStmt
291 : : AlterCompositeTypeStmt AlterUserMappingStmt
292 : : AlterRoleStmt AlterRoleSetStmt AlterPolicyStmt AlterStatsStmt
293 : : AlterDefaultPrivilegesStmt DefACLAction
294 : : AnalyzeStmt CallStmt ClosePortalStmt ClusterStmt CommentStmt
295 : : ConstraintsSetStmt CopyStmt CreateAsStmt CreateCastStmt
296 : : CreateDomainStmt CreateExtensionStmt CreateGroupStmt CreateOpClassStmt
297 : : CreateOpFamilyStmt AlterOpFamilyStmt CreatePLangStmt
298 : : CreateSchemaStmt CreateSeqStmt CreateStmt CreateStatsStmt CreateTableSpaceStmt
299 : : CreateFdwStmt CreateForeignServerStmt CreateForeignTableStmt
300 : : CreateAssertionStmt CreateTransformStmt CreateTrigStmt CreateEventTrigStmt
301 : : CreateUserStmt CreateUserMappingStmt CreateRoleStmt CreatePolicyStmt
302 : : CreatedbStmt DeclareCursorStmt DefineStmt DeleteStmt DiscardStmt DoStmt
303 : : DropOpClassStmt DropOpFamilyStmt DropStmt
304 : : DropCastStmt DropRoleStmt
305 : : DropdbStmt DropTableSpaceStmt
306 : : DropTransformStmt
307 : : DropUserMappingStmt ExplainStmt FetchStmt
308 : : GrantStmt GrantRoleStmt ImportForeignSchemaStmt IndexStmt InsertStmt
309 : : ListenStmt LoadStmt LockStmt MergeStmt NotifyStmt ExplainableStmt PreparableStmt
310 : : CreateFunctionStmt AlterFunctionStmt ReindexStmt RemoveAggrStmt
311 : : RemoveFuncStmt RemoveOperStmt RenameStmt ReturnStmt RevokeStmt RevokeRoleStmt
312 : : RuleActionStmt RuleActionStmtOrEmpty RuleStmt
313 : : SecLabelStmt SelectStmt TransactionStmt TransactionStmtLegacy TruncateStmt
314 : : UnlistenStmt UpdateStmt VacuumStmt
315 : : VariableResetStmt VariableSetStmt VariableShowStmt
316 : : ViewStmt CheckPointStmt CreateConversionStmt
317 : : DeallocateStmt PrepareStmt ExecuteStmt
318 : : DropOwnedStmt ReassignOwnedStmt
319 : : AlterTSConfigurationStmt AlterTSDictionaryStmt
320 : : CreateMatViewStmt RefreshMatViewStmt CreateAmStmt
321 : : CreatePublicationStmt AlterPublicationStmt
322 : : CreateSubscriptionStmt AlterSubscriptionStmt DropSubscriptionStmt
323 : :
324 : : %type <node> select_no_parens select_with_parens select_clause
325 : : simple_select values_clause
326 : : PLpgSQL_Expr PLAssignStmt
327 : :
328 : : %type <str> opt_single_name
329 : : %type <list> opt_qualified_name
330 : : %type <boolean> opt_concurrently
331 : : %type <dbehavior> opt_drop_behavior
332 : :
333 : : %type <node> alter_column_default opclass_item opclass_drop alter_using
334 : : %type <ival> add_drop opt_asc_desc opt_nulls_order
335 : :
336 : : %type <node> alter_table_cmd alter_type_cmd opt_collate_clause
337 : : replica_identity partition_cmd index_partition_cmd
338 : : %type <list> alter_table_cmds alter_type_cmds
339 : : %type <list> alter_identity_column_option_list
340 : : %type <defelt> alter_identity_column_option
341 : : %type <node> set_statistics_value
342 : : %type <str> set_access_method_name
343 : :
344 : : %type <list> createdb_opt_list createdb_opt_items copy_opt_list
345 : : transaction_mode_list
346 : : create_extension_opt_list alter_extension_opt_list
347 : : %type <defelt> createdb_opt_item copy_opt_item
348 : : transaction_mode_item
349 : : create_extension_opt_item alter_extension_opt_item
350 : :
351 : : %type <ival> opt_lock lock_type cast_context
352 : : %type <str> utility_option_name
353 : : %type <defelt> utility_option_elem
354 : : %type <list> utility_option_list
355 : : %type <node> utility_option_arg
356 : : %type <defelt> drop_option
357 : : %type <boolean> opt_or_replace opt_no
358 : : opt_grant_grant_option
359 : : opt_nowait opt_if_exists opt_with_data
360 : : opt_transaction_chain
361 : : %type <list> grant_role_opt_list
362 : : %type <defelt> grant_role_opt
363 : : %type <node> grant_role_opt_value
364 : : %type <ival> opt_nowait_or_skip
365 : :
366 : : %type <list> OptRoleList AlterOptRoleList
367 : : %type <defelt> CreateOptRoleElem AlterOptRoleElem
368 : :
369 : : %type <str> opt_type
370 : : %type <str> foreign_server_version opt_foreign_server_version
371 : : %type <str> opt_in_database
372 : :
373 : : %type <str> parameter_name
374 : : %type <list> OptSchemaEltList parameter_name_list
375 : :
376 : : %type <chr> am_type
377 : :
378 : : %type <boolean> TriggerForSpec TriggerForType
379 : : %type <ival> TriggerActionTime
380 : : %type <list> TriggerEvents TriggerOneEvent
381 : : %type <node> TriggerFuncArg
382 : : %type <node> TriggerWhen
383 : : %type <str> TransitionRelName
384 : : %type <boolean> TransitionRowOrTable TransitionOldOrNew
385 : : %type <node> TriggerTransition
386 : :
387 : : %type <list> event_trigger_when_list event_trigger_value_list
388 : : %type <defelt> event_trigger_when_item
389 : : %type <chr> enable_trigger
390 : :
391 : : %type <str> copy_file_name
392 : : access_method_clause attr_name
393 : : table_access_method_clause name cursor_name file_name
394 : : cluster_index_specification
395 : :
396 : : %type <list> func_name handler_name qual_Op qual_all_Op subquery_Op
397 : : opt_inline_handler opt_validator validator_clause
398 : : opt_collate
399 : :
400 : : %type <range> qualified_name insert_target OptConstrFromTable
401 : :
402 : : %type <str> all_Op MathOp
403 : :
404 : : %type <str> row_security_cmd RowSecurityDefaultForCmd
405 : : %type <boolean> RowSecurityDefaultPermissive
406 : : %type <node> RowSecurityOptionalWithCheck RowSecurityOptionalExpr
407 : : %type <list> RowSecurityDefaultToRole RowSecurityOptionalToRole
408 : :
409 : : %type <str> iso_level opt_encoding
410 : : %type <rolespec> grantee
411 : : %type <list> grantee_list
412 : : %type <accesspriv> privilege
413 : : %type <list> privileges privilege_list
414 : : %type <privtarget> privilege_target
415 : : %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
416 : : %type <list> function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
417 : : %type <ival> defacl_privilege_target
418 : : %type <defelt> DefACLOption
419 : : %type <list> DefACLOptionList
420 : : %type <ival> import_qualification_type
421 : : %type <importqual> import_qualification
422 : : %type <node> vacuum_relation
423 : : %type <selectlimit> opt_select_limit select_limit limit_clause
424 : :
425 : : %type <list> parse_toplevel stmtmulti routine_body_stmt_list
426 : : OptTableElementList TableElementList OptInherit definition
427 : : OptTypedTableElementList TypedTableElementList
428 : : reloptions opt_reloptions
429 : : OptWith opt_definition func_args func_args_list
430 : : func_args_with_defaults func_args_with_defaults_list
431 : : aggr_args aggr_args_list
432 : : func_as createfunc_opt_list opt_createfunc_opt_list alterfunc_opt_list
433 : : old_aggr_definition old_aggr_list
434 : : oper_argtypes RuleActionList RuleActionMulti
435 : : opt_column_list columnList opt_name_list
436 : : sort_clause opt_sort_clause sortby_list index_params
437 : : stats_params
438 : : opt_include opt_c_include index_including_params
439 : : name_list role_list from_clause from_list opt_array_bounds
440 : : qualified_name_list any_name any_name_list type_name_list
441 : : any_operator expr_list attrs
442 : : distinct_clause opt_distinct_clause
443 : : target_list opt_target_list insert_column_list set_target_list
444 : : merge_values_clause
445 : : set_clause_list set_clause
446 : : def_list operator_def_list indirection opt_indirection
447 : : reloption_list TriggerFuncArgs opclass_item_list opclass_drop_list
448 : : opclass_purpose opt_opfamily transaction_mode_list_or_empty
449 : : OptTableFuncElementList TableFuncElementList opt_type_modifiers
450 : : prep_type_clause
451 : : execute_param_clause using_clause returning_clause
452 : : opt_enum_val_list enum_val_list table_func_column_list
453 : : create_generic_options alter_generic_options
454 : : relation_expr_list dostmt_opt_list
455 : : transform_element_list transform_type_list
456 : : TriggerTransitions TriggerReferencing
457 : : vacuum_relation_list opt_vacuum_relation_list
458 : : drop_option_list pub_obj_list
459 : :
460 : : %type <node> opt_routine_body
461 : : %type <groupclause> group_clause
462 : : %type <list> group_by_list
463 : : %type <node> group_by_item empty_grouping_set rollup_clause cube_clause
464 : : %type <node> grouping_sets_clause
465 : :
466 : : %type <list> opt_fdw_options fdw_options
467 : : %type <defelt> fdw_option
468 : :
469 : : %type <range> OptTempTableName
470 : : %type <into> into_clause create_as_target create_mv_target
471 : :
472 : : %type <defelt> createfunc_opt_item common_func_opt_item dostmt_opt_item
473 : : %type <fun_param> func_arg func_arg_with_default table_func_column aggr_arg
474 : : %type <fun_param_mode> arg_class
475 : : %type <typnam> func_return func_type
476 : :
477 : : %type <boolean> opt_trusted opt_restart_seqs
478 : : %type <ival> OptTemp
479 : : %type <ival> OptNoLog
480 : : %type <oncommit> OnCommitOption
481 : :
482 : : %type <ival> for_locking_strength
483 : : %type <node> for_locking_item
484 : : %type <list> for_locking_clause opt_for_locking_clause for_locking_items
485 : : %type <list> locked_rels_list
486 : : %type <setquantifier> set_quantifier
487 : :
488 : : %type <node> join_qual
489 : : %type <jtype> join_type
490 : :
491 : : %type <list> extract_list overlay_list position_list
492 : : %type <list> substr_list trim_list
493 : : %type <list> opt_interval interval_second
494 : : %type <str> unicode_normal_form
495 : :
496 : : %type <boolean> opt_instead
497 : : %type <boolean> opt_unique opt_verbose opt_full
498 : : %type <boolean> opt_freeze opt_analyze opt_default opt_recheck
499 : : %type <defelt> opt_binary copy_delimiter
500 : :
501 : : %type <boolean> copy_from opt_program
502 : :
503 : : %type <ival> event cursor_options opt_hold opt_set_data
504 : : %type <objtype> object_type_any_name object_type_name object_type_name_on_any_name
505 : : drop_type_name
506 : :
507 : : %type <node> fetch_args select_limit_value
508 : : offset_clause select_offset_value
509 : : select_fetch_first_value I_or_F_const
510 : : %type <ival> row_or_rows first_or_next
511 : :
512 : : %type <list> OptSeqOptList SeqOptList OptParenthesizedSeqOptList
513 : : %type <defelt> SeqOptElem
514 : :
515 : : %type <istmt> insert_rest
516 : : %type <infer> opt_conf_expr
517 : : %type <onconflict> opt_on_conflict
518 : : %type <mergewhen> merge_insert merge_update merge_delete
519 : :
520 : : %type <mergematch> merge_when_tgt_matched merge_when_tgt_not_matched
521 : : %type <node> merge_when_clause opt_merge_when_condition
522 : : %type <list> merge_when_list
523 : :
524 : : %type <vsetstmt> generic_set set_rest set_rest_more generic_reset reset_rest
525 : : SetResetClause FunctionSetResetClause
526 : :
527 : : %type <node> TableElement TypedTableElement ConstraintElem TableFuncElement
528 : : %type <node> columnDef columnOptions optionalPeriodName
529 : : %type <defelt> def_elem reloption_elem old_aggr_elem operator_def_elem
530 : : %type <node> def_arg columnElem where_clause where_or_current_clause
531 : : a_expr b_expr c_expr AexprConst indirection_el opt_slice_bound
532 : : columnref in_expr having_clause func_table xmltable array_expr
533 : : OptWhereClause operator_def_arg
534 : : %type <list> opt_column_and_period_list
535 : : %type <list> rowsfrom_item rowsfrom_list opt_col_def_list
536 : : %type <boolean> opt_ordinality opt_without_overlaps
537 : : %type <list> ExclusionConstraintList ExclusionConstraintElem
538 : : %type <list> func_arg_list func_arg_list_opt
539 : : %type <node> func_arg_expr
540 : : %type <list> row explicit_row implicit_row type_list array_expr_list
541 : : %type <node> case_expr case_arg when_clause case_default
542 : : %type <list> when_clause_list
543 : : %type <node> opt_search_clause opt_cycle_clause
544 : : %type <ival> sub_type opt_materialized
545 : : %type <node> NumericOnly
546 : : %type <list> NumericOnly_list
547 : : %type <alias> alias_clause opt_alias_clause opt_alias_clause_for_join_using
548 : : %type <list> func_alias_clause
549 : : %type <sortby> sortby
550 : : %type <ielem> index_elem index_elem_options
551 : : %type <selem> stats_param
552 : : %type <node> table_ref
553 : : %type <jexpr> joined_table
554 : : %type <range> relation_expr
555 : : %type <range> extended_relation_expr
556 : : %type <range> relation_expr_opt_alias
557 : : %type <node> tablesample_clause opt_repeatable_clause
558 : : %type <target> target_el set_target insert_column_item
559 : :
560 : : %type <str> generic_option_name
561 : : %type <node> generic_option_arg
562 : : %type <defelt> generic_option_elem alter_generic_option_elem
563 : : %type <list> generic_option_list alter_generic_option_list
564 : :
565 : : %type <ival> reindex_target_relation reindex_target_all
566 : : %type <list> opt_reindex_option_list
567 : :
568 : : %type <node> copy_generic_opt_arg copy_generic_opt_arg_list_item
569 : : %type <defelt> copy_generic_opt_elem
570 : : %type <list> copy_generic_opt_list copy_generic_opt_arg_list
571 : : %type <list> copy_options
572 : :
573 : : %type <typnam> Typename SimpleTypename ConstTypename
574 : : GenericType Numeric opt_float JsonType
575 : : Character ConstCharacter
576 : : CharacterWithLength CharacterWithoutLength
577 : : ConstDatetime ConstInterval
578 : : Bit ConstBit BitWithLength BitWithoutLength
579 : : %type <str> character
580 : : %type <str> extract_arg
581 : : %type <boolean> opt_varying opt_timezone opt_no_inherit
582 : :
583 : : %type <ival> Iconst SignedIconst
584 : : %type <str> Sconst comment_text notify_payload
585 : : %type <str> RoleId opt_boolean_or_string
586 : : %type <list> var_list
587 : : %type <str> ColId ColLabel BareColLabel
588 : : %type <str> NonReservedWord NonReservedWord_or_Sconst
589 : : %type <str> var_name type_function_name param_name
590 : : %type <str> createdb_opt_name plassign_target
591 : : %type <node> var_value zone_value
592 : : %type <rolespec> auth_ident RoleSpec opt_granted_by
593 : : %type <publicationobjectspec> PublicationObjSpec
594 : :
595 : : %type <keyword> unreserved_keyword type_func_name_keyword
596 : : %type <keyword> col_name_keyword reserved_keyword
597 : : %type <keyword> bare_label_keyword
598 : :
599 : : %type <node> TableConstraint TableLikeClause
600 : : %type <ival> TableLikeOptionList TableLikeOption
601 : : %type <str> column_compression opt_column_compression column_storage opt_column_storage
602 : : %type <list> ColQualList
603 : : %type <node> ColConstraint ColConstraintElem ConstraintAttr
604 : : %type <ival> key_match
605 : : %type <keyaction> key_delete key_update key_action
606 : : %type <keyactions> key_actions
607 : : %type <ival> ConstraintAttributeSpec ConstraintAttributeElem
608 : : %type <str> ExistingIndex
609 : :
610 : : %type <list> constraints_set_list
611 : : %type <boolean> constraints_set_mode
612 : : %type <str> OptTableSpace OptConsTableSpace
613 : : %type <rolespec> OptTableSpaceOwner
614 : : %type <ival> opt_check_option
615 : :
616 : : %type <str> opt_provider security_label
617 : :
618 : : %type <target> xml_attribute_el
619 : : %type <list> xml_attribute_list xml_attributes
620 : : %type <node> xml_root_version opt_xml_root_standalone
621 : : %type <node> xmlexists_argument
622 : : %type <ival> document_or_content
623 : : %type <boolean> xml_indent_option xml_whitespace_option
624 : : %type <list> xmltable_column_list xmltable_column_option_list
625 : : %type <node> xmltable_column_el
626 : : %type <defelt> xmltable_column_option_el
627 : : %type <list> xml_namespace_list
628 : : %type <target> xml_namespace_el
629 : :
630 : : %type <node> func_application func_expr_common_subexpr
631 : : %type <node> func_expr func_expr_windowless
632 : : %type <node> common_table_expr
633 : : %type <with> with_clause opt_with_clause
634 : : %type <list> cte_list
635 : :
636 : : %type <list> within_group_clause
637 : : %type <node> filter_clause
638 : : %type <list> window_clause window_definition_list opt_partition_clause
639 : : %type <windef> window_definition over_clause window_specification
640 : : opt_frame_clause frame_extent frame_bound
641 : : %type <ival> opt_window_exclusion_clause
642 : : %type <str> opt_existing_window_name
643 : : %type <boolean> opt_if_not_exists
644 : : %type <boolean> opt_unique_null_treatment
645 : : %type <ival> generated_when override_kind
646 : : %type <partspec> PartitionSpec OptPartitionSpec
647 : : %type <partelem> part_elem
648 : : %type <list> part_params
649 : : %type <partboundspec> PartitionBoundSpec
650 : : %type <singlepartspec> SinglePartitionSpec
651 : : %type <list> partitions_list
652 : : %type <list> hash_partbound
653 : : %type <defelt> hash_partbound_elem
654 : :
655 : : %type <node> json_format_clause
656 : : json_format_clause_opt
657 : : json_value_expr
658 : : json_returning_clause_opt
659 : : json_name_and_value
660 : : json_aggregate_func
661 : : json_argument
662 : : json_behavior
663 : : json_on_error_clause_opt
664 : : json_table
665 : : json_table_column_definition
666 : : json_table_column_path_clause_opt
667 : : %type <list> json_name_and_value_list
668 : : json_value_expr_list
669 : : json_array_aggregate_order_by_clause_opt
670 : : json_arguments
671 : : json_behavior_clause_opt
672 : : json_passing_clause_opt
673 : : json_table_column_definition_list
674 : : %type <str> json_table_path_name_opt
675 : : %type <ival> json_behavior_type
676 : : json_predicate_type_constraint
677 : : json_quotes_clause_opt
678 : : json_wrapper_behavior
679 : : %type <boolean> json_key_uniqueness_constraint_opt
680 : : json_object_constructor_null_clause_opt
681 : : json_array_constructor_null_clause_opt
682 : :
683 : :
684 : : /*
685 : : * Non-keyword token types. These are hard-wired into the "flex" lexer.
686 : : * They must be listed first so that their numeric codes do not depend on
687 : : * the set of keywords. PL/pgSQL depends on this so that it can share the
688 : : * same lexer. If you add/change tokens here, fix PL/pgSQL to match!
689 : : *
690 : : * UIDENT and USCONST are reduced to IDENT and SCONST in parser.c, so that
691 : : * they need no productions here; but we must assign token codes to them.
692 : : *
693 : : * DOT_DOT is unused in the core SQL grammar, and so will always provoke
694 : : * parse errors. It is needed by PL/pgSQL.
695 : : */
696 : : %token <str> IDENT UIDENT FCONST SCONST USCONST BCONST XCONST Op
697 : : %token <ival> ICONST PARAM
698 : : %token TYPECAST DOT_DOT COLON_EQUALS EQUALS_GREATER
699 : : %token LESS_EQUALS GREATER_EQUALS NOT_EQUALS
700 : :
701 : : /*
702 : : * If you want to make any keyword changes, update the keyword table in
703 : : * src/include/parser/kwlist.h and add new keywords to the appropriate one
704 : : * of the reserved-or-not-so-reserved keyword lists, below; search
705 : : * this file for "Keyword category lists".
706 : : */
707 : :
708 : : /* ordinary key words in alphabetical order */
709 : : %token <keyword> ABORT_P ABSENT ABSOLUTE_P ACCESS ACTION ADD_P ADMIN AFTER
710 : : AGGREGATE ALL ALSO ALTER ALWAYS ANALYSE ANALYZE AND ANY ARRAY AS ASC
711 : : ASENSITIVE ASSERTION ASSIGNMENT ASYMMETRIC ATOMIC AT ATTACH ATTRIBUTE AUTHORIZATION
712 : :
713 : : BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT
714 : : BOOLEAN_P BOTH BREADTH BY
715 : :
716 : : CACHE CALL CALLED CASCADE CASCADED CASE CAST CATALOG_P CHAIN CHAR_P
717 : : CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE
718 : : CLUSTER COALESCE COLLATE COLLATION COLUMN COLUMNS COMMENT COMMENTS COMMIT
719 : : COMMITTED COMPRESSION CONCURRENTLY CONDITIONAL CONFIGURATION CONFLICT
720 : : CONNECTION CONSTRAINT CONSTRAINTS CONTENT_P CONTINUE_P CONVERSION_P COPY
721 : : COST CREATE CROSS CSV CUBE CURRENT_P
722 : : CURRENT_CATALOG CURRENT_DATE CURRENT_ROLE CURRENT_SCHEMA
723 : : CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE
724 : :
725 : : DATA_P DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS
726 : : DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS DEPENDS DEPTH DESC
727 : : DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
728 : : DOUBLE_P DROP
729 : :
730 : : EACH ELSE EMPTY_P ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ERROR_P ESCAPE
731 : : EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
732 : : EXTENSION EXTERNAL EXTRACT
733 : :
734 : : FALSE_P FAMILY FETCH FILTER FINALIZE FIRST_P FLOAT_P FOLLOWING FOR
735 : : FORCE FOREIGN FORMAT FORWARD FREEZE FROM FULL FUNCTION FUNCTIONS
736 : :
737 : : GENERATED GLOBAL GRANT GRANTED GREATEST GROUP_P GROUPING GROUPS
738 : :
739 : : HANDLER HAVING HEADER_P HOLD HOUR_P
740 : :
741 : : IDENTITY_P IF_P ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IMPORT_P IN_P INCLUDE
742 : : INCLUDING INCREMENT INDENT INDEX INDEXES INHERIT INHERITS INITIALLY INLINE_P
743 : : INNER_P INOUT INPUT_P INSENSITIVE INSERT INSTEAD INT_P INTEGER
744 : : INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION
745 : :
746 : : JOIN JSON JSON_ARRAY JSON_ARRAYAGG JSON_EXISTS JSON_OBJECT JSON_OBJECTAGG
747 : : JSON_QUERY JSON_SCALAR JSON_SERIALIZE JSON_TABLE JSON_VALUE
748 : :
749 : : KEEP KEY KEYS
750 : :
751 : : LABEL LANGUAGE LARGE_P LAST_P LATERAL_P
752 : : LEADING LEAKPROOF LEAST LEFT LEVEL LIKE LIMIT LISTEN LOAD LOCAL
753 : : LOCALTIME LOCALTIMESTAMP LOCATION LOCK_P LOCKED LOGGED
754 : :
755 : : MAPPING MATCH MATCHED MATERIALIZED MAXVALUE MERGE MERGE_ACTION METHOD
756 : : MINUTE_P MINVALUE MODE MONTH_P MOVE
757 : :
758 : : NAME_P NAMES NATIONAL NATURAL NCHAR NESTED NEW NEXT NFC NFD NFKC NFKD NO
759 : : NONE NORMALIZE NORMALIZED
760 : : NOT NOTHING NOTIFY NOTNULL NOWAIT NULL_P NULLIF
761 : : NULLS_P NUMERIC
762 : :
763 : : OBJECT_P OF OFF OFFSET OIDS OLD OMIT ON ONLY OPERATOR OPTION OPTIONS OR
764 : : ORDER ORDINALITY OTHERS OUT_P OUTER_P
765 : : OVER OVERLAPS OVERLAY OVERRIDING OWNED OWNER
766 : :
767 : : PARALLEL PARAMETER PARSER PARTIAL PARTITION PARTITIONS PASSING PASSWORD PATH
768 : : PERIOD PLACING PLAN PLANS POLICY
769 : :
770 : : POSITION PRECEDING PRECISION PRESERVE PREPARE PREPARED PRIMARY
771 : : PRIOR PRIVILEGES PROCEDURAL PROCEDURE PROCEDURES PROGRAM PUBLICATION
772 : :
773 : : QUOTE QUOTES
774 : :
775 : : RANGE READ REAL REASSIGN RECHECK RECURSIVE REF_P REFERENCES REFERENCING
776 : : REFRESH REINDEX RELATIVE_P RELEASE RENAME REPEATABLE REPLACE REPLICA
777 : : RESET RESTART RESTRICT RETURN RETURNING RETURNS REVOKE RIGHT ROLE ROLLBACK ROLLUP
778 : : ROUTINE ROUTINES ROW ROWS RULE
779 : :
780 : : SAVEPOINT SCALAR SCHEMA SCHEMAS SCROLL SEARCH SECOND_P SECURITY SELECT
781 : : SEQUENCE SEQUENCES
782 : : SERIALIZABLE SERVER SESSION SESSION_USER SET SETS SETOF SHARE SHOW
783 : : SIMILAR SIMPLE SKIP SMALLINT SNAPSHOT SOME SPLIT SOURCE SQL_P STABLE STANDALONE_P
784 : : START STATEMENT STATISTICS STDIN STDOUT STORAGE STORED STRICT_P STRING_P STRIP_P
785 : : SUBSCRIPTION SUBSTRING SUPPORT SYMMETRIC SYSID SYSTEM_P SYSTEM_USER
786 : :
787 : : TABLE TABLES TABLESAMPLE TABLESPACE TARGET TEMP TEMPLATE TEMPORARY TEXT_P THEN
788 : : TIES TIME TIMESTAMP TO TRAILING TRANSACTION TRANSFORM
789 : : TREAT TRIGGER TRIM TRUE_P
790 : : TRUNCATE TRUSTED TYPE_P TYPES_P
791 : :
792 : : UESCAPE UNBOUNDED UNCONDITIONAL UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN
793 : : UNLISTEN UNLOGGED UNTIL UPDATE USER USING
794 : :
795 : : VACUUM VALID VALIDATE VALIDATOR VALUE_P VALUES VARCHAR VARIADIC VARYING
796 : : VERBOSE VERSION_P VIEW VIEWS VOLATILE
797 : :
798 : : WHEN WHERE WHITESPACE_P WINDOW WITH WITHIN WITHOUT WORK WRAPPER WRITE
799 : :
800 : : XML_P XMLATTRIBUTES XMLCONCAT XMLELEMENT XMLEXISTS XMLFOREST XMLNAMESPACES
801 : : XMLPARSE XMLPI XMLROOT XMLSERIALIZE XMLTABLE
802 : :
803 : : YEAR_P YES_P
804 : :
805 : : ZONE
806 : :
807 : : /*
808 : : * The grammar thinks these are keywords, but they are not in the kwlist.h
809 : : * list and so can never be entered directly. The filter in parser.c
810 : : * creates these tokens when required (based on looking one token ahead).
811 : : *
812 : : * NOT_LA exists so that productions such as NOT LIKE can be given the same
813 : : * precedence as LIKE; otherwise they'd effectively have the same precedence
814 : : * as NOT, at least with respect to their left-hand subexpression.
815 : : * FORMAT_LA, NULLS_LA, WITH_LA, and WITHOUT_LA are needed to make the grammar
816 : : * LALR(1).
817 : : */
818 : : %token FORMAT_LA NOT_LA NULLS_LA WITH_LA WITHOUT_LA
819 : :
820 : : /*
821 : : * The grammar likewise thinks these tokens are keywords, but they are never
822 : : * generated by the scanner. Rather, they can be injected by parser.c as
823 : : * the initial token of the string (using the lookahead-token mechanism
824 : : * implemented there). This provides a way to tell the grammar to parse
825 : : * something other than the usual list of SQL commands.
826 : : */
827 : : %token MODE_TYPE_NAME
828 : : %token MODE_PLPGSQL_EXPR
829 : : %token MODE_PLPGSQL_ASSIGN1
830 : : %token MODE_PLPGSQL_ASSIGN2
831 : : %token MODE_PLPGSQL_ASSIGN3
832 : :
833 : :
834 : : /* Precedence: lowest to highest */
835 : : %left UNION EXCEPT
836 : : %left INTERSECT
837 : : %left OR
838 : : %left AND
839 : : %right NOT
840 : : %nonassoc IS ISNULL NOTNULL /* IS sets precedence for IS NULL, etc */
841 : : %nonassoc '<' '>' '=' LESS_EQUALS GREATER_EQUALS NOT_EQUALS
842 : : %nonassoc BETWEEN IN_P LIKE ILIKE SIMILAR NOT_LA
843 : : %nonassoc ESCAPE /* ESCAPE must be just above LIKE/ILIKE/SIMILAR */
844 : :
845 : : /*
846 : : * Sometimes it is necessary to assign precedence to keywords that are not
847 : : * really part of the operator hierarchy, in order to resolve grammar
848 : : * ambiguities. It's best to avoid doing so whenever possible, because such
849 : : * assignments have global effect and may hide ambiguities besides the one
850 : : * you intended to solve. (Attaching a precedence to a single rule with
851 : : * %prec is far safer and should be preferred.) If you must give precedence
852 : : * to a new keyword, try very hard to give it the same precedence as IDENT.
853 : : * If the keyword has IDENT's precedence then it clearly acts the same as
854 : : * non-keywords and other similar keywords, thus reducing the risk of
855 : : * unexpected precedence effects.
856 : : *
857 : : * We used to need to assign IDENT an explicit precedence just less than Op,
858 : : * to support target_el without AS. While that's not really necessary since
859 : : * we removed postfix operators, we continue to do so because it provides a
860 : : * reference point for a precedence level that we can assign to other
861 : : * keywords that lack a natural precedence level.
862 : : *
863 : : * We need to do this for PARTITION, RANGE, ROWS, and GROUPS to support
864 : : * opt_existing_window_name (see comment there).
865 : : *
866 : : * The frame_bound productions UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING
867 : : * are even messier: since UNBOUNDED is an unreserved keyword (per spec!),
868 : : * there is no principled way to distinguish these from the productions
869 : : * a_expr PRECEDING/FOLLOWING. We hack this up by giving UNBOUNDED slightly
870 : : * lower precedence than PRECEDING and FOLLOWING. At present this doesn't
871 : : * appear to cause UNBOUNDED to be treated differently from other unreserved
872 : : * keywords anywhere else in the grammar, but it's definitely risky. We can
873 : : * blame any funny behavior of UNBOUNDED on the SQL standard, though.
874 : : *
875 : : * To support CUBE and ROLLUP in GROUP BY without reserving them, we give them
876 : : * an explicit priority lower than '(', so that a rule with CUBE '(' will shift
877 : : * rather than reducing a conflicting rule that takes CUBE as a function name.
878 : : * Using the same precedence as IDENT seems right for the reasons given above.
879 : : *
880 : : * SET is likewise assigned the same precedence as IDENT, to support the
881 : : * relation_expr_opt_alias production (see comment there).
882 : : *
883 : : * KEYS, OBJECT_P, SCALAR, VALUE_P, WITH, and WITHOUT are similarly assigned
884 : : * the same precedence as IDENT. This allows resolving conflicts in the
885 : : * json_predicate_type_constraint and json_key_uniqueness_constraint_opt
886 : : * productions (see comments there).
887 : : *
888 : : * Like the UNBOUNDED PRECEDING/FOLLOWING case, NESTED is assigned a lower
889 : : * precedence than PATH to fix ambiguity in the json_table production.
890 : : */
891 : : %nonassoc UNBOUNDED NESTED /* ideally would have same precedence as IDENT */
892 : : %nonassoc IDENT PARTITION RANGE ROWS GROUPS PRECEDING FOLLOWING CUBE ROLLUP
893 : : SET KEYS OBJECT_P SCALAR VALUE_P WITH WITHOUT PATH
894 : : %left Op OPERATOR /* multi-character ops and user-defined operators */
895 : : %left '+' '-'
896 : : %left '*' '/' '%'
897 : : %left '^'
898 : : /* Unary Operators */
899 : : %left AT /* sets precedence for AT TIME ZONE, AT LOCAL */
900 : : %left COLLATE
901 : : %right UMINUS
902 : : %left '[' ']'
903 : : %left '(' ')'
904 : : %left TYPECAST
905 : : %left '.'
906 : : /*
907 : : * These might seem to be low-precedence, but actually they are not part
908 : : * of the arithmetic hierarchy at all in their use as JOIN operators.
909 : : * We make them high-precedence to support their use as function names.
910 : : * They wouldn't be given a precedence at all, were it not that we need
911 : : * left-associativity among the JOIN rules themselves.
912 : : */
913 : : %left JOIN CROSS LEFT FULL RIGHT INNER_P NATURAL
914 : :
915 : : %%
916 : :
917 : : /*
918 : : * The target production for the whole parse.
919 : : *
920 : : * Ordinarily we parse a list of statements, but if we see one of the
921 : : * special MODE_XXX symbols as first token, we parse something else.
922 : : * The options here correspond to enum RawParseMode, which see for details.
923 : : */
924 : : parse_toplevel:
925 : : stmtmulti
926 : : {
5389 tgl@sss.pgh.pa.us 927 :CBC 339324 : pg_yyget_extra(yyscanner)->parsetree = $1;
928 : : (void) yynerrs; /* suppress compiler warning */
929 : : }
930 : : | MODE_TYPE_NAME Typename
931 : : {
1196 932 : 5195 : pg_yyget_extra(yyscanner)->parsetree = list_make1($2);
933 : : }
934 : : | MODE_PLPGSQL_EXPR PLpgSQL_Expr
935 : : {
936 : 16645 : pg_yyget_extra(yyscanner)->parsetree =
937 : 16645 : list_make1(makeRawStmt($2, 0));
938 : : }
939 : : | MODE_PLPGSQL_ASSIGN1 PLAssignStmt
940 : : {
941 : 3513 : PLAssignStmt *n = (PLAssignStmt *) $2;
942 : :
943 : 3513 : n->nnames = 1;
944 : 3513 : pg_yyget_extra(yyscanner)->parsetree =
945 : 3513 : list_make1(makeRawStmt((Node *) n, 0));
946 : : }
947 : : | MODE_PLPGSQL_ASSIGN2 PLAssignStmt
948 : : {
949 : 310 : PLAssignStmt *n = (PLAssignStmt *) $2;
950 : :
951 : 310 : n->nnames = 2;
952 : 310 : pg_yyget_extra(yyscanner)->parsetree =
953 : 310 : list_make1(makeRawStmt((Node *) n, 0));
954 : : }
955 : : | MODE_PLPGSQL_ASSIGN3 PLAssignStmt
956 : : {
957 : 14 : PLAssignStmt *n = (PLAssignStmt *) $2;
958 : :
959 : 14 : n->nnames = 3;
960 : 14 : pg_yyget_extra(yyscanner)->parsetree =
961 : 14 : list_make1(makeRawStmt((Node *) n, 0));
962 : : }
963 : : ;
964 : :
965 : : /*
966 : : * At top level, we wrap each stmt with a RawStmt node carrying start location
967 : : * and length of the stmt's text. Notice that the start loc/len are driven
968 : : * entirely from semicolon locations (@2). It would seem natural to use
969 : : * @1 or @3 to get the true start location of a stmt, but that doesn't work
970 : : * for statements that can start with empty nonterminals (opt_with_clause is
971 : : * the main offender here); as noted in the comments for YYLLOC_DEFAULT,
972 : : * we'd get -1 for the location in such cases.
973 : : * We also take care to discard empty statements entirely.
974 : : */
975 : : stmtmulti: stmtmulti ';' toplevel_stmt
976 : : {
2647 977 [ + + ]: 275822 : if ($1 != NIL)
978 : : {
979 : : /* update length of previous stmt */
2561 980 : 275774 : updateRawStmtEnd(llast_node(RawStmt, $1), @2);
981 : : }
5389 982 [ + + ]: 275822 : if ($3 != NULL)
2647 983 : 24326 : $$ = lappend($1, makeRawStmt($3, @2 + 1));
984 : : else
5389 985 : 251496 : $$ = $1;
986 : : }
987 : : | toplevel_stmt
988 : : {
989 [ + + ]: 339327 : if ($1 != NULL)
2647 990 : 339085 : $$ = list_make1(makeRawStmt($1, 0));
991 : : else
7972 bruce@momjian.us 992 : 242 : $$ = NIL;
993 : : }
994 : : ;
995 : :
996 : : /*
997 : : * toplevel_stmt includes BEGIN and END. stmt does not include them, because
998 : : * those words have different meanings in function bodies.
999 : : */
1000 : : toplevel_stmt:
1001 : : stmt
1002 : : | TransactionStmtLegacy
1003 : : ;
1004 : :
1005 : : stmt:
1006 : : AlterEventTrigStmt
1007 : : | AlterCollationStmt
1008 : : | AlterDatabaseStmt
1009 : : | AlterDatabaseSetStmt
1010 : : | AlterDefaultPrivilegesStmt
1011 : : | AlterDomainStmt
1012 : : | AlterEnumStmt
1013 : : | AlterExtensionStmt
1014 : : | AlterExtensionContentsStmt
1015 : : | AlterFdwStmt
1016 : : | AlterForeignServerStmt
1017 : : | AlterFunctionStmt
1018 : : | AlterGroupStmt
1019 : : | AlterObjectDependsStmt
1020 : : | AlterObjectSchemaStmt
1021 : : | AlterOwnerStmt
1022 : : | AlterOperatorStmt
1023 : : | AlterTypeStmt
1024 : : | AlterPolicyStmt
1025 : : | AlterSeqStmt
1026 : : | AlterSystemStmt
1027 : : | AlterTableStmt
1028 : : | AlterTblSpcStmt
1029 : : | AlterCompositeTypeStmt
1030 : : | AlterPublicationStmt
1031 : : | AlterRoleSetStmt
1032 : : | AlterRoleStmt
1033 : : | AlterSubscriptionStmt
1034 : : | AlterStatsStmt
1035 : : | AlterTSConfigurationStmt
1036 : : | AlterTSDictionaryStmt
1037 : : | AlterUserMappingStmt
1038 : : | AnalyzeStmt
1039 : : | CallStmt
1040 : : | CheckPointStmt
1041 : : | ClosePortalStmt
1042 : : | ClusterStmt
1043 : : | CommentStmt
1044 : : | ConstraintsSetStmt
1045 : : | CopyStmt
1046 : : | CreateAmStmt
1047 : : | CreateAsStmt
1048 : : | CreateAssertionStmt
1049 : : | CreateCastStmt
1050 : : | CreateConversionStmt
1051 : : | CreateDomainStmt
1052 : : | CreateExtensionStmt
1053 : : | CreateFdwStmt
1054 : : | CreateForeignServerStmt
1055 : : | CreateForeignTableStmt
1056 : : | CreateFunctionStmt
1057 : : | CreateGroupStmt
1058 : : | CreateMatViewStmt
1059 : : | CreateOpClassStmt
1060 : : | CreateOpFamilyStmt
1061 : : | CreatePublicationStmt
1062 : : | AlterOpFamilyStmt
1063 : : | CreatePolicyStmt
1064 : : | CreatePLangStmt
1065 : : | CreateSchemaStmt
1066 : : | CreateSeqStmt
1067 : : | CreateStmt
1068 : : | CreateSubscriptionStmt
1069 : : | CreateStatsStmt
1070 : : | CreateTableSpaceStmt
1071 : : | CreateTransformStmt
1072 : : | CreateTrigStmt
1073 : : | CreateEventTrigStmt
1074 : : | CreateRoleStmt
1075 : : | CreateUserStmt
1076 : : | CreateUserMappingStmt
1077 : : | CreatedbStmt
1078 : : | DeallocateStmt
1079 : : | DeclareCursorStmt
1080 : : | DefineStmt
1081 : : | DeleteStmt
1082 : : | DiscardStmt
1083 : : | DoStmt
1084 : : | DropCastStmt
1085 : : | DropOpClassStmt
1086 : : | DropOpFamilyStmt
1087 : : | DropOwnedStmt
1088 : : | DropStmt
1089 : : | DropSubscriptionStmt
1090 : : | DropTableSpaceStmt
1091 : : | DropTransformStmt
1092 : : | DropRoleStmt
1093 : : | DropUserMappingStmt
1094 : : | DropdbStmt
1095 : : | ExecuteStmt
1096 : : | ExplainStmt
1097 : : | FetchStmt
1098 : : | GrantStmt
1099 : : | GrantRoleStmt
1100 : : | ImportForeignSchemaStmt
1101 : : | IndexStmt
1102 : : | InsertStmt
1103 : : | ListenStmt
1104 : : | RefreshMatViewStmt
1105 : : | LoadStmt
1106 : : | LockStmt
1107 : : | MergeStmt
1108 : : | NotifyStmt
1109 : : | PrepareStmt
1110 : : | ReassignOwnedStmt
1111 : : | ReindexStmt
1112 : : | RemoveAggrStmt
1113 : : | RemoveFuncStmt
1114 : : | RemoveOperStmt
1115 : : | RenameStmt
1116 : : | RevokeStmt
1117 : : | RevokeRoleStmt
1118 : : | RuleStmt
1119 : : | SecLabelStmt
1120 : : | SelectStmt
1121 : : | TransactionStmt
1122 : : | TruncateStmt
1123 : : | UnlistenStmt
1124 : : | UpdateStmt
1125 : : | VacuumStmt
1126 : : | VariableResetStmt
1127 : : | VariableSetStmt
1128 : : | VariableShowStmt
1129 : : | ViewStmt
1130 : : | /*EMPTY*/
7403 neilc@samurai.com 1131 : 251747 : { $$ = NULL; }
1132 : : ;
1133 : :
1134 : : /*
1135 : : * Generic supporting productions for DDL
1136 : : */
1137 : : opt_single_name:
632 alvherre@alvh.no-ip. 1138 : 2570 : ColId { $$ = $1; }
1139 : 736 : | /* EMPTY */ { $$ = NULL; }
1140 : : ;
1141 : :
1142 : : opt_qualified_name:
1143 : 842 : any_name { $$ = $1; }
1144 : 7203 : | /*EMPTY*/ { $$ = NIL; }
1145 : : ;
1146 : :
1147 : : opt_concurrently:
1148 : 486 : CONCURRENTLY { $$ = true; }
1149 : 3626 : | /*EMPTY*/ { $$ = false; }
1150 : : ;
1151 : :
1152 : : opt_drop_behavior:
1153 : 953 : CASCADE { $$ = DROP_CASCADE; }
1154 : 84 : | RESTRICT { $$ = DROP_RESTRICT; }
1155 : 16842 : | /* EMPTY */ { $$ = DROP_RESTRICT; /* default */ }
1156 : : ;
1157 : :
1158 : : /*****************************************************************************
1159 : : *
1160 : : * CALL statement
1161 : : *
1162 : : *****************************************************************************/
1163 : :
1164 : : CallStmt: CALL func_application
1165 : : {
702 peter@eisentraut.org 1166 : 264 : CallStmt *n = makeNode(CallStmt);
1167 : :
2327 peter_e@gmx.net 1168 : 264 : n->funccall = castNode(FuncCall, $2);
702 peter@eisentraut.org 1169 : 264 : $$ = (Node *) n;
1170 : : }
1171 : : ;
1172 : :
1173 : : /*****************************************************************************
1174 : : *
1175 : : * Create a new Postgres DBMS role
1176 : : *
1177 : : *****************************************************************************/
1178 : :
1179 : : CreateRoleStmt:
1180 : : CREATE ROLE RoleId opt_with OptRoleList
1181 : : {
6865 tgl@sss.pgh.pa.us 1182 : 617 : CreateRoleStmt *n = makeNode(CreateRoleStmt);
1183 : :
6837 1184 : 617 : n->stmt_type = ROLESTMT_ROLE;
6865 1185 : 617 : n->role = $3;
8314 1186 : 617 : n->options = $5;
702 peter@eisentraut.org 1187 : 617 : $$ = (Node *) n;
1188 : : }
1189 : : ;
1190 : :
1191 : :
1192 : : opt_with: WITH
1193 : : | WITH_LA
1194 : : | /*EMPTY*/
1195 : : ;
1196 : :
1197 : : /*
1198 : : * Options for CREATE ROLE and ALTER ROLE (also used by CREATE/ALTER USER
1199 : : * for backwards compatibility). Note: the only option required by SQL99
1200 : : * is "WITH ADMIN name".
1201 : : */
1202 : : OptRoleList:
5303 alvherre@alvh.no-ip. 1203 : 572 : OptRoleList CreateOptRoleElem { $$ = lappend($1, $2); }
6865 tgl@sss.pgh.pa.us 1204 : 849 : | /* EMPTY */ { $$ = NIL; }
1205 : : ;
1206 : :
1207 : : AlterOptRoleList:
5303 alvherre@alvh.no-ip. 1208 : 283 : AlterOptRoleList AlterOptRoleElem { $$ = lappend($1, $2); }
1209 : 193 : | /* EMPTY */ { $$ = NIL; }
1210 : : ;
1211 : :
1212 : : AlterOptRoleElem:
1213 : : PASSWORD Sconst
1214 : : {
6865 tgl@sss.pgh.pa.us 1215 : 81 : $$ = makeDefElem("password",
702 peter@eisentraut.org 1216 : 81 : (Node *) makeString($2), @1);
1217 : : }
1218 : : | PASSWORD NULL_P
1219 : : {
2777 peter_e@gmx.net 1220 : 6 : $$ = makeDefElem("password", NULL, @1);
1221 : : }
1222 : : | ENCRYPTED PASSWORD Sconst
1223 : : {
1224 : : /*
1225 : : * These days, passwords are always stored in encrypted
1226 : : * form, so there is no difference between PASSWORD and
1227 : : * ENCRYPTED PASSWORD.
1228 : : */
2533 heikki.linnakangas@i 1229 : 6 : $$ = makeDefElem("password",
702 peter@eisentraut.org 1230 : 6 : (Node *) makeString($3), @1);
1231 : : }
1232 : : | UNENCRYPTED PASSWORD Sconst
1233 : : {
2533 heikki.linnakangas@i 1234 [ # # ]:UBC 0 : ereport(ERROR,
1235 : : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1236 : : errmsg("UNENCRYPTED PASSWORD is no longer supported"),
1237 : : errhint("Remove UNENCRYPTED to store the password in encrypted form instead."),
1238 : : parser_errposition(@1)));
1239 : : }
1240 : : | INHERIT
1241 : : {
702 peter@eisentraut.org 1242 :CBC 43 : $$ = makeDefElem("inherit", (Node *) makeBoolean(true), @1);
1243 : : }
1244 : : | CONNECTION LIMIT SignedIconst
1245 : : {
1246 : 12 : $$ = makeDefElem("connectionlimit", (Node *) makeInteger($3), @1);
1247 : : }
1248 : : | VALID UNTIL Sconst
1249 : : {
1250 : 1 : $$ = makeDefElem("validUntil", (Node *) makeString($3), @1);
1251 : : }
1252 : : /* Supported but not documented for roles, for use by ALTER GROUP. */
1253 : : | USER role_list
1254 : : {
1255 : 3 : $$ = makeDefElem("rolemembers", (Node *) $2, @1);
1256 : : }
1257 : : | IDENT
1258 : : {
1259 : : /*
1260 : : * We handle identifiers that aren't parser keywords with
1261 : : * the following special-case codes, to avoid bloating the
1262 : : * size of the main parser.
1263 : : */
4779 rhaas@postgresql.org 1264 [ + + ]: 631 : if (strcmp($1, "superuser") == 0)
702 peter@eisentraut.org 1265 : 86 : $$ = makeDefElem("superuser", (Node *) makeBoolean(true), @1);
4779 rhaas@postgresql.org 1266 [ + + ]: 545 : else if (strcmp($1, "nosuperuser") == 0)
702 peter@eisentraut.org 1267 : 50 : $$ = makeDefElem("superuser", (Node *) makeBoolean(false), @1);
4779 rhaas@postgresql.org 1268 [ + + ]: 495 : else if (strcmp($1, "createrole") == 0)
702 peter@eisentraut.org 1269 : 46 : $$ = makeDefElem("createrole", (Node *) makeBoolean(true), @1);
4779 rhaas@postgresql.org 1270 [ + + ]: 449 : else if (strcmp($1, "nocreaterole") == 0)
702 peter@eisentraut.org 1271 : 19 : $$ = makeDefElem("createrole", (Node *) makeBoolean(false), @1);
4779 rhaas@postgresql.org 1272 [ + + ]: 430 : else if (strcmp($1, "replication") == 0)
702 peter@eisentraut.org 1273 : 60 : $$ = makeDefElem("isreplication", (Node *) makeBoolean(true), @1);
4779 rhaas@postgresql.org 1274 [ + + ]: 370 : else if (strcmp($1, "noreplication") == 0)
702 peter@eisentraut.org 1275 : 48 : $$ = makeDefElem("isreplication", (Node *) makeBoolean(false), @1);
4779 rhaas@postgresql.org 1276 [ + + ]: 322 : else if (strcmp($1, "createdb") == 0)
702 peter@eisentraut.org 1277 : 41 : $$ = makeDefElem("createdb", (Node *) makeBoolean(true), @1);
4779 rhaas@postgresql.org 1278 [ + + ]: 281 : else if (strcmp($1, "nocreatedb") == 0)
702 peter@eisentraut.org 1279 : 23 : $$ = makeDefElem("createdb", (Node *) makeBoolean(false), @1);
4779 rhaas@postgresql.org 1280 [ + + ]: 258 : else if (strcmp($1, "login") == 0)
702 peter@eisentraut.org 1281 : 127 : $$ = makeDefElem("canlogin", (Node *) makeBoolean(true), @1);
4779 rhaas@postgresql.org 1282 [ + + ]: 131 : else if (strcmp($1, "nologin") == 0)
702 peter@eisentraut.org 1283 : 43 : $$ = makeDefElem("canlogin", (Node *) makeBoolean(false), @1);
3495 sfrost@snowman.net 1284 [ + + ]: 88 : else if (strcmp($1, "bypassrls") == 0)
702 peter@eisentraut.org 1285 : 36 : $$ = makeDefElem("bypassrls", (Node *) makeBoolean(true), @1);
3495 sfrost@snowman.net 1286 [ + + ]: 52 : else if (strcmp($1, "nobypassrls") == 0)
702 peter@eisentraut.org 1287 : 34 : $$ = makeDefElem("bypassrls", (Node *) makeBoolean(false), @1);
4779 rhaas@postgresql.org 1288 [ + - ]: 18 : else if (strcmp($1, "noinherit") == 0)
1289 : : {
1290 : : /*
1291 : : * Note that INHERIT is a keyword, so it's handled by main parser, but
1292 : : * NOINHERIT is handled here.
1293 : : */
702 peter@eisentraut.org 1294 : 18 : $$ = makeDefElem("inherit", (Node *) makeBoolean(false), @1);
1295 : : }
1296 : : else
4779 rhaas@postgresql.org 1297 [ # # ]:UBC 0 : ereport(ERROR,
1298 : : (errcode(ERRCODE_SYNTAX_ERROR),
1299 : : errmsg("unrecognized role option \"%s\"", $1),
1300 : : parser_errposition(@1)));
1301 : : }
1302 : : ;
1303 : :
1304 : : CreateOptRoleElem:
5303 alvherre@alvh.no-ip. 1305 :CBC 500 : AlterOptRoleElem { $$ = $1; }
1306 : : /* The following are not supported by ALTER ROLE/USER/GROUP */
1307 : : | SYSID Iconst
1308 : : {
702 peter@eisentraut.org 1309 : 3 : $$ = makeDefElem("sysid", (Node *) makeInteger($2), @1);
1310 : : }
1311 : : | ADMIN role_list
1312 : : {
1313 : 11 : $$ = makeDefElem("adminmembers", (Node *) $2, @1);
1314 : : }
1315 : : | ROLE role_list
1316 : : {
1317 : 8 : $$ = makeDefElem("rolemembers", (Node *) $2, @1);
1318 : : }
1319 : : | IN_P ROLE role_list
1320 : : {
1321 : 50 : $$ = makeDefElem("addroleto", (Node *) $3, @1);
1322 : : }
1323 : : | IN_P GROUP_P role_list
1324 : : {
702 peter@eisentraut.org 1325 :UBC 0 : $$ = makeDefElem("addroleto", (Node *) $3, @1);
1326 : : }
1327 : : ;
1328 : :
1329 : :
1330 : : /*****************************************************************************
1331 : : *
1332 : : * Create a new Postgres DBMS user (role with implied login ability)
1333 : : *
1334 : : *****************************************************************************/
1335 : :
1336 : : CreateUserStmt:
1337 : : CREATE USER RoleId opt_with OptRoleList
1338 : : {
6865 tgl@sss.pgh.pa.us 1339 :CBC 220 : CreateRoleStmt *n = makeNode(CreateRoleStmt);
1340 : :
6837 1341 : 220 : n->stmt_type = ROLESTMT_USER;
6865 1342 : 220 : n->role = $3;
6837 1343 : 220 : n->options = $5;
702 peter@eisentraut.org 1344 : 220 : $$ = (Node *) n;
1345 : : }
1346 : : ;
1347 : :
1348 : :
1349 : : /*****************************************************************************
1350 : : *
1351 : : * Alter a postgresql DBMS role
1352 : : *
1353 : : *****************************************************************************/
1354 : :
1355 : : AlterRoleStmt:
1356 : : ALTER ROLE RoleSpec opt_with AlterOptRoleList
1357 : : {
6865 tgl@sss.pgh.pa.us 1358 : 153 : AlterRoleStmt *n = makeNode(AlterRoleStmt);
1359 : :
1360 : 153 : n->role = $3;
6837 1361 : 153 : n->action = +1; /* add, if there are members */
6865 1362 : 153 : n->options = $5;
702 peter@eisentraut.org 1363 : 153 : $$ = (Node *) n;
1364 : : }
1365 : : | ALTER USER RoleSpec opt_with AlterOptRoleList
1366 : : {
2449 peter_e@gmx.net 1367 : 40 : AlterRoleStmt *n = makeNode(AlterRoleStmt);
1368 : :
1369 : 40 : n->role = $3;
1370 : 40 : n->action = +1; /* add, if there are members */
1371 : 40 : n->options = $5;
702 peter@eisentraut.org 1372 : 40 : $$ = (Node *) n;
1373 : : }
1374 : : ;
1375 : :
1376 : : opt_in_database:
5303 alvherre@alvh.no-ip. 1377 : 41 : /* EMPTY */ { $$ = NULL; }
1404 peter@eisentraut.org 1378 :UBC 0 : | IN_P DATABASE name { $$ = $3; }
1379 : : ;
1380 : :
1381 : : AlterRoleSetStmt:
1382 : : ALTER ROLE RoleSpec opt_in_database SetResetClause
1383 : : {
6865 tgl@sss.pgh.pa.us 1384 :CBC 22 : AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
1385 : :
1386 : 22 : n->role = $3;
5303 alvherre@alvh.no-ip. 1387 : 22 : n->database = $4;
1388 : 22 : n->setstmt = $5;
702 peter@eisentraut.org 1389 : 22 : $$ = (Node *) n;
1390 : : }
1391 : : | ALTER ROLE ALL opt_in_database SetResetClause
1392 : : {
4074 peter_e@gmx.net 1393 : 2 : AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
1394 : :
1395 : 2 : n->role = NULL;
1396 : 2 : n->database = $4;
1397 : 2 : n->setstmt = $5;
702 peter@eisentraut.org 1398 : 2 : $$ = (Node *) n;
1399 : : }
1400 : : | ALTER USER RoleSpec opt_in_database SetResetClause
1401 : : {
2449 peter_e@gmx.net 1402 : 13 : AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
1403 : :
6865 tgl@sss.pgh.pa.us 1404 : 13 : n->role = $3;
2449 peter_e@gmx.net 1405 : 13 : n->database = $4;
1406 : 13 : n->setstmt = $5;
702 peter@eisentraut.org 1407 : 13 : $$ = (Node *) n;
1408 : : }
1409 : : | ALTER USER ALL opt_in_database SetResetClause
1410 : : {
6865 tgl@sss.pgh.pa.us 1411 : 2 : AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
1412 : :
2449 peter_e@gmx.net 1413 : 2 : n->role = NULL;
1414 : 2 : n->database = $4;
1415 : 2 : n->setstmt = $5;
702 peter@eisentraut.org 1416 : 2 : $$ = (Node *) n;
1417 : : }
1418 : : ;
1419 : :
1420 : :
1421 : : /*****************************************************************************
1422 : : *
1423 : : * Drop a postgresql DBMS role
1424 : : *
1425 : : * XXX Ideally this would have CASCADE/RESTRICT options, but a role
1426 : : * might own objects in multiple databases, and there is presently no way to
1427 : : * implement cascading to other databases. So we always behave as RESTRICT.
1428 : : *****************************************************************************/
1429 : :
1430 : : DropRoleStmt:
1431 : : DROP ROLE role_list
1432 : : {
6865 tgl@sss.pgh.pa.us 1433 : 522 : DropRoleStmt *n = makeNode(DropRoleStmt);
1434 : :
2433 peter_e@gmx.net 1435 : 522 : n->missing_ok = false;
6865 tgl@sss.pgh.pa.us 1436 : 522 : n->roles = $3;
702 peter@eisentraut.org 1437 : 522 : $$ = (Node *) n;
1438 : : }
1439 : : | DROP ROLE IF_P EXISTS role_list
1440 : : {
6644 andrew@dunslane.net 1441 : 67 : DropRoleStmt *n = makeNode(DropRoleStmt);
1442 : :
2433 peter_e@gmx.net 1443 : 67 : n->missing_ok = true;
6644 andrew@dunslane.net 1444 : 67 : n->roles = $5;
702 peter@eisentraut.org 1445 : 67 : $$ = (Node *) n;
1446 : : }
1447 : : | DROP USER role_list
1448 : : {
6865 tgl@sss.pgh.pa.us 1449 : 198 : DropRoleStmt *n = makeNode(DropRoleStmt);
1450 : :
2433 peter_e@gmx.net 1451 : 198 : n->missing_ok = false;
6865 tgl@sss.pgh.pa.us 1452 : 198 : n->roles = $3;
702 peter@eisentraut.org 1453 : 198 : $$ = (Node *) n;
1454 : : }
1455 : : | DROP USER IF_P EXISTS role_list
1456 : : {
6644 andrew@dunslane.net 1457 : 18 : DropRoleStmt *n = makeNode(DropRoleStmt);
1458 : :
1459 : 18 : n->roles = $5;
2433 peter_e@gmx.net 1460 : 18 : n->missing_ok = true;
702 peter@eisentraut.org 1461 : 18 : $$ = (Node *) n;
1462 : : }
1463 : : | DROP GROUP_P role_list
1464 : : {
2449 peter_e@gmx.net 1465 : 18 : DropRoleStmt *n = makeNode(DropRoleStmt);
1466 : :
2433 1467 : 18 : n->missing_ok = false;
2449 1468 : 18 : n->roles = $3;
702 peter@eisentraut.org 1469 : 18 : $$ = (Node *) n;
1470 : : }
1471 : : | DROP GROUP_P IF_P EXISTS role_list
1472 : : {
2449 peter_e@gmx.net 1473 : 3 : DropRoleStmt *n = makeNode(DropRoleStmt);
1474 : :
2433 1475 : 3 : n->missing_ok = true;
2449 1476 : 3 : n->roles = $5;
702 peter@eisentraut.org 1477 : 3 : $$ = (Node *) n;
1478 : : }
1479 : : ;
1480 : :
1481 : :
1482 : : /*****************************************************************************
1483 : : *
1484 : : * Create a postgresql group (role without login ability)
1485 : : *
1486 : : *****************************************************************************/
1487 : :
1488 : : CreateGroupStmt:
1489 : : CREATE GROUP_P RoleId opt_with OptRoleList
1490 : : {
6865 tgl@sss.pgh.pa.us 1491 : 12 : CreateRoleStmt *n = makeNode(CreateRoleStmt);
1492 : :
6837 1493 : 12 : n->stmt_type = ROLESTMT_GROUP;
6865 1494 : 12 : n->role = $3;
8312 1495 : 12 : n->options = $5;
702 peter@eisentraut.org 1496 : 12 : $$ = (Node *) n;
1497 : : }
1498 : : ;
1499 : :
1500 : :
1501 : : /*****************************************************************************
1502 : : *
1503 : : * Alter a postgresql group
1504 : : *
1505 : : *****************************************************************************/
1506 : :
1507 : : AlterGroupStmt:
1508 : : ALTER GROUP_P RoleSpec add_drop USER role_list
1509 : : {
6865 tgl@sss.pgh.pa.us 1510 : 15 : AlterRoleStmt *n = makeNode(AlterRoleStmt);
1511 : :
1512 : 15 : n->role = $3;
7972 bruce@momjian.us 1513 : 15 : n->action = $4;
6865 tgl@sss.pgh.pa.us 1514 : 15 : n->options = list_make1(makeDefElem("rolemembers",
1515 : : (Node *) $6, @6));
702 peter@eisentraut.org 1516 : 15 : $$ = (Node *) n;
1517 : : }
1518 : : ;
1519 : :
6291 tgl@sss.pgh.pa.us 1520 : 40 : add_drop: ADD_P { $$ = +1; }
6865 1521 : 75 : | DROP { $$ = -1; }
1522 : : ;
1523 : :
1524 : :
1525 : : /*****************************************************************************
1526 : : *
1527 : : * Manipulate a schema
1528 : : *
1529 : : *****************************************************************************/
1530 : :
1531 : : CreateSchemaStmt:
1532 : : CREATE SCHEMA opt_single_name AUTHORIZATION RoleSpec OptSchemaEltList
1533 : : {
8060 1534 : 79 : CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
1535 : :
1536 : : /* One can omit the schema name or the authorization id. */
3324 alvherre@alvh.no-ip. 1537 : 79 : n->schemaname = $3;
1538 : 79 : n->authrole = $5;
7100 tgl@sss.pgh.pa.us 1539 : 79 : n->schemaElts = $6;
4211 1540 : 79 : n->if_not_exists = false;
702 peter@eisentraut.org 1541 : 79 : $$ = (Node *) n;
1542 : : }
1543 : : | CREATE SCHEMA ColId OptSchemaEltList
1544 : : {
8060 tgl@sss.pgh.pa.us 1545 : 391 : CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
1546 : :
1547 : : /* ...but not both */
1548 : 391 : n->schemaname = $3;
3324 alvherre@alvh.no-ip. 1549 : 391 : n->authrole = NULL;
7100 tgl@sss.pgh.pa.us 1550 : 391 : n->schemaElts = $4;
4211 1551 : 391 : n->if_not_exists = false;
702 peter@eisentraut.org 1552 : 391 : $$ = (Node *) n;
1553 : : }
1554 : : | CREATE SCHEMA IF_P NOT EXISTS opt_single_name AUTHORIZATION RoleSpec OptSchemaEltList
1555 : : {
4211 tgl@sss.pgh.pa.us 1556 : 9 : CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
1557 : :
1558 : : /* schema name can be omitted here, too */
3324 alvherre@alvh.no-ip. 1559 : 9 : n->schemaname = $6;
1560 : 9 : n->authrole = $8;
4211 tgl@sss.pgh.pa.us 1561 [ - + ]: 9 : if ($9 != NIL)
4211 tgl@sss.pgh.pa.us 1562 [ # # ]:UBC 0 : ereport(ERROR,
1563 : : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1564 : : errmsg("CREATE SCHEMA IF NOT EXISTS cannot include schema elements"),
1565 : : parser_errposition(@9)));
4211 tgl@sss.pgh.pa.us 1566 :CBC 9 : n->schemaElts = $9;
1567 : 9 : n->if_not_exists = true;
702 peter@eisentraut.org 1568 : 9 : $$ = (Node *) n;
1569 : : }
1570 : : | CREATE SCHEMA IF_P NOT EXISTS ColId OptSchemaEltList
1571 : : {
4211 tgl@sss.pgh.pa.us 1572 : 17 : CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
1573 : :
1574 : : /* ...but not here */
1575 : 17 : n->schemaname = $6;
3324 alvherre@alvh.no-ip. 1576 : 17 : n->authrole = NULL;
4211 tgl@sss.pgh.pa.us 1577 [ + + ]: 17 : if ($7 != NIL)
1578 [ + - ]: 3 : ereport(ERROR,
1579 : : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1580 : : errmsg("CREATE SCHEMA IF NOT EXISTS cannot include schema elements"),
1581 : : parser_errposition(@7)));
1582 : 14 : n->schemaElts = $7;
1583 : 14 : n->if_not_exists = true;
702 peter@eisentraut.org 1584 : 14 : $$ = (Node *) n;
1585 : : }
1586 : : ;
1587 : :
1588 : : OptSchemaEltList:
1589 : : OptSchemaEltList schema_stmt
1590 : : {
4210 tgl@sss.pgh.pa.us 1591 [ + + ]: 254 : if (@$ < 0) /* see comments for YYLLOC_DEFAULT */
1592 : 118 : @$ = @2;
1593 : 254 : $$ = lappend($1, $2);
1594 : : }
1595 : : | /* EMPTY */
1596 : 496 : { $$ = NIL; }
1597 : : ;
1598 : :
1599 : : /*
1600 : : * schema_stmt are the ones that can show up inside a CREATE SCHEMA
1601 : : * statement (in addition to by themselves).
1602 : : */
1603 : : schema_stmt:
1604 : : CreateStmt
1605 : : | IndexStmt
1606 : : | CreateSeqStmt
1607 : : | CreateTrigStmt
1608 : : | GrantStmt
1609 : : | ViewStmt
1610 : : ;
1611 : :
1612 : :
1613 : : /*****************************************************************************
1614 : : *
1615 : : * Set PG internal variable
1616 : : * SET name TO 'var_value'
1617 : : * Include SQL syntax (thomas 1997-10-22):
1618 : : * SET TIME ZONE 'var_value'
1619 : : *
1620 : : *****************************************************************************/
1621 : :
1622 : : VariableSetStmt:
1623 : : SET set_rest
1624 : : {
8003 1625 : 9315 : VariableSetStmt *n = $2;
1626 : :
1627 : 9315 : n->is_local = false;
9715 bruce@momjian.us 1628 : 9315 : $$ = (Node *) n;
1629 : : }
1630 : : | SET LOCAL set_rest
1631 : : {
8003 tgl@sss.pgh.pa.us 1632 : 554 : VariableSetStmt *n = $3;
1633 : :
1634 : 554 : n->is_local = true;
9715 bruce@momjian.us 1635 : 554 : $$ = (Node *) n;
1636 : : }
1637 : : | SET SESSION set_rest
1638 : : {
8003 tgl@sss.pgh.pa.us 1639 : 40 : VariableSetStmt *n = $3;
1640 : :
1641 : 40 : n->is_local = false;
9715 bruce@momjian.us 1642 : 40 : $$ = (Node *) n;
1643 : : }
1644 : : ;
1645 : :
1646 : : set_rest:
1647 : : TRANSACTION transaction_mode_list
1648 : : {
4442 rhaas@postgresql.org 1649 : 264 : VariableSetStmt *n = makeNode(VariableSetStmt);
1650 : :
1651 : 264 : n->kind = VAR_SET_MULTI;
1652 : 264 : n->name = "TRANSACTION";
1653 : 264 : n->args = $2;
1654 : 264 : $$ = n;
1655 : : }
1656 : : | SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list
1657 : : {
1658 : 6 : VariableSetStmt *n = makeNode(VariableSetStmt);
1659 : :
1660 : 6 : n->kind = VAR_SET_MULTI;
1661 : 6 : n->name = "SESSION CHARACTERISTICS";
1662 : 6 : n->args = $5;
1663 : 6 : $$ = n;
1664 : : }
1665 : : | set_rest_more
1666 : : ;
1667 : :
1668 : : generic_set:
1669 : : var_name TO var_list
1670 : : {
9249 vadim4o@yahoo.com 1671 : 2195 : VariableSetStmt *n = makeNode(VariableSetStmt);
1672 : :
6068 tgl@sss.pgh.pa.us 1673 : 2195 : n->kind = VAR_SET_VALUE;
8003 1674 : 2195 : n->name = $1;
1675 : 2195 : n->args = $3;
1676 : 2195 : $$ = n;
1677 : : }
1678 : : | var_name '=' var_list
1679 : : {
8542 peter_e@gmx.net 1680 : 6307 : VariableSetStmt *n = makeNode(VariableSetStmt);
1681 : :
6068 tgl@sss.pgh.pa.us 1682 : 6307 : n->kind = VAR_SET_VALUE;
8003 1683 : 6307 : n->name = $1;
1684 : 6307 : n->args = $3;
492 akorotkov@postgresql 1685 : 6307 : $$ = n;
1686 : : }
1687 : : | var_name TO DEFAULT
1688 : : {
6068 tgl@sss.pgh.pa.us 1689 : 63 : VariableSetStmt *n = makeNode(VariableSetStmt);
1690 : :
1691 : 63 : n->kind = VAR_SET_DEFAULT;
1692 : 63 : n->name = $1;
1693 : 63 : $$ = n;
1694 : : }
1695 : : | var_name '=' DEFAULT
1696 : : {
1697 : 3 : VariableSetStmt *n = makeNode(VariableSetStmt);
1698 : :
1699 : 3 : n->kind = VAR_SET_DEFAULT;
1700 : 3 : n->name = $1;
1701 : 3 : $$ = n;
1702 : : }
1703 : : ;
1704 : :
1705 : : set_rest_more: /* Generic SET syntaxes: */
1250 peter@eisentraut.org 1706 : 8513 : generic_set {$$ = $1;}
1707 : : | var_name FROM CURRENT_P
1708 : : {
6068 tgl@sss.pgh.pa.us 1709 :UBC 0 : VariableSetStmt *n = makeNode(VariableSetStmt);
1710 : :
1711 : 0 : n->kind = VAR_SET_CURRENT;
1712 : 0 : n->name = $1;
1713 : 0 : $$ = n;
1714 : : }
1715 : : /* Special syntaxes mandated by SQL standard: */
1716 : : | TIME ZONE zone_value
1717 : : {
9396 scrappy@hub.org 1718 :CBC 46 : VariableSetStmt *n = makeNode(VariableSetStmt);
1719 : :
6068 tgl@sss.pgh.pa.us 1720 : 46 : n->kind = VAR_SET_VALUE;
8003 1721 : 46 : n->name = "timezone";
8072 lockhart@fourpalms.o 1722 [ + + ]: 46 : if ($3 != NULL)
7259 neilc@samurai.com 1723 : 40 : n->args = list_make1($3);
1724 : : else
6068 tgl@sss.pgh.pa.us 1725 : 6 : n->kind = VAR_SET_DEFAULT;
8003 1726 : 46 : $$ = n;
1727 : : }
1728 : : | CATALOG_P Sconst
1729 : : {
5648 peter_e@gmx.net 1730 [ # # ]:UBC 0 : ereport(ERROR,
1731 : : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1732 : : errmsg("current database cannot be changed"),
1733 : : parser_errposition(@2)));
1734 : : $$ = NULL; /*not reached*/
1735 : : }
1736 : : | SCHEMA Sconst
1737 : : {
1738 : 0 : VariableSetStmt *n = makeNode(VariableSetStmt);
1739 : :
1740 : 0 : n->kind = VAR_SET_VALUE;
1741 : 0 : n->name = "search_path";
1742 : 0 : n->args = list_make1(makeStringConst($2, @2));
1743 : 0 : $$ = n;
1744 : : }
1745 : : | NAMES opt_encoding
1746 : : {
8003 tgl@sss.pgh.pa.us 1747 : 0 : VariableSetStmt *n = makeNode(VariableSetStmt);
1748 : :
6068 1749 : 0 : n->kind = VAR_SET_VALUE;
8003 1750 : 0 : n->name = "client_encoding";
1751 [ # # ]: 0 : if ($2 != NULL)
5708 1752 : 0 : n->args = list_make1(makeStringConst($2, @2));
1753 : : else
6068 1754 : 0 : n->kind = VAR_SET_DEFAULT;
8003 1755 : 0 : $$ = n;
1756 : : }
1757 : : | ROLE NonReservedWord_or_Sconst
1758 : : {
6838 tgl@sss.pgh.pa.us 1759 :CBC 411 : VariableSetStmt *n = makeNode(VariableSetStmt);
1760 : :
6068 1761 : 411 : n->kind = VAR_SET_VALUE;
6838 1762 : 411 : n->name = "role";
5708 1763 : 411 : n->args = list_make1(makeStringConst($2, @2));
6838 1764 : 411 : $$ = n;
1765 : : }
1766 : : | SESSION AUTHORIZATION NonReservedWord_or_Sconst
1767 : : {
8003 1768 : 1247 : VariableSetStmt *n = makeNode(VariableSetStmt);
1769 : :
6068 1770 : 1247 : n->kind = VAR_SET_VALUE;
8003 1771 : 1247 : n->name = "session_authorization";
5708 1772 : 1247 : n->args = list_make1(makeStringConst($3, @3));
8003 1773 : 1247 : $$ = n;
1774 : : }
1775 : : | SESSION AUTHORIZATION DEFAULT
1776 : : {
8014 1777 : 2 : VariableSetStmt *n = makeNode(VariableSetStmt);
1778 : :
6068 1779 : 2 : n->kind = VAR_SET_DEFAULT;
8014 1780 : 2 : n->name = "session_authorization";
8003 1781 : 2 : $$ = n;
1782 : : }
1783 : : | XML_P OPTION document_or_content
1784 : : {
6289 peter_e@gmx.net 1785 : 6 : VariableSetStmt *n = makeNode(VariableSetStmt);
1786 : :
6068 tgl@sss.pgh.pa.us 1787 : 6 : n->kind = VAR_SET_VALUE;
6289 peter_e@gmx.net 1788 : 6 : n->name = "xmloption";
5708 tgl@sss.pgh.pa.us 1789 [ + + ]: 6 : n->args = list_make1(makeStringConst($3 == XMLOPTION_DOCUMENT ? "DOCUMENT" : "CONTENT", @3));
6289 peter_e@gmx.net 1790 : 6 : $$ = n;
1791 : : }
1792 : : /* Special syntaxes invented by PostgreSQL: */
1793 : : | TRANSACTION SNAPSHOT Sconst
1794 : : {
4558 tgl@sss.pgh.pa.us 1795 : 24 : VariableSetStmt *n = makeNode(VariableSetStmt);
1796 : :
1797 : 24 : n->kind = VAR_SET_MULTI;
1798 : 24 : n->name = "TRANSACTION SNAPSHOT";
1799 : 24 : n->args = list_make1(makeStringConst($3, @3));
1800 : 24 : $$ = n;
1801 : : }
1802 : : ;
1803 : :
6068 1804 : 10600 : var_name: ColId { $$ = $1; }
1805 : : | var_name '.' ColId
3836 peter_e@gmx.net 1806 : 193 : { $$ = psprintf("%s.%s", $1, $3); }
1807 : : ;
1808 : :
7259 neilc@samurai.com 1809 : 8502 : var_list: var_value { $$ = list_make1($1); }
7972 bruce@momjian.us 1810 : 89 : | var_list ',' var_value { $$ = lappend($1, $3); }
1811 : : ;
1812 : :
1813 : : var_value: opt_boolean_or_string
5708 tgl@sss.pgh.pa.us 1814 : 6428 : { $$ = makeStringConst($1, @1); }
1815 : : | NumericOnly
1816 : 2163 : { $$ = makeAConst($1, @1); }
1817 : : ;
1818 : :
7465 peter_e@gmx.net 1819 :UBC 0 : iso_level: READ UNCOMMITTED { $$ = "read uncommitted"; }
7465 peter_e@gmx.net 1820 :CBC 442 : | READ COMMITTED { $$ = "read committed"; }
1821 : 1235 : | REPEATABLE READ { $$ = "repeatable read"; }
7972 bruce@momjian.us 1822 : 1610 : | SERIALIZABLE { $$ = "serializable"; }
1823 : : ;
1824 : :
1825 : : opt_boolean_or_string:
1826 : 274 : TRUE_P { $$ = "true"; }
1827 : 629 : | FALSE_P { $$ = "false"; }
1828 : 964 : | ON { $$ = "on"; }
1829 : : /*
1830 : : * OFF is also accepted as a boolean value, but is handled by
1831 : : * the NonReservedWord rule. The action for booleans and strings
1832 : : * is the same, so we don't need to distinguish them here.
1833 : : */
3969 tgl@sss.pgh.pa.us 1834 : 12728 : | NonReservedWord_or_Sconst { $$ = $1; }
1835 : : ;
1836 : :
1837 : : /* Timezone values can be:
1838 : : * - a string such as 'pst8pdt'
1839 : : * - an identifier such as "pst8pdt"
1840 : : * - an integer or floating point number
1841 : : * - a time interval per SQL99
1842 : : * ColId gives reduce/reduce errors against ConstInterval and LOCAL,
1843 : : * so use IDENT (meaning we reject anything that is a key word).
1844 : : */
1845 : : zone_value:
1846 : : Sconst
1847 : : {
5708 1848 : 27 : $$ = makeStringConst($1, @1);
1849 : : }
1850 : : | IDENT
1851 : : {
1852 : 1 : $$ = makeStringConst($1, @1);
1853 : : }
1854 : : | ConstInterval Sconst opt_interval
1855 : : {
702 peter@eisentraut.org 1856 :UBC 0 : TypeName *t = $1;
1857 : :
5694 tgl@sss.pgh.pa.us 1858 [ # # ]: 0 : if ($3 != NIL)
1859 : : {
702 peter@eisentraut.org 1860 : 0 : A_Const *n = (A_Const *) linitial($3);
1861 : :
821 1862 [ # # ]: 0 : if ((n->val.ival.ival & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0)
7575 tgl@sss.pgh.pa.us 1863 [ # # ]: 0 : ereport(ERROR,
1864 : : (errcode(ERRCODE_SYNTAX_ERROR),
1865 : : errmsg("time zone interval must be HOUR or HOUR TO MINUTE"),
1866 : : parser_errposition(@3)));
1867 : : }
5694 1868 : 0 : t->typmods = $3;
5708 1869 : 0 : $$ = makeStringConstCast($2, @2, t);
1870 : : }
1871 : : | ConstInterval '(' Iconst ')' Sconst
1872 : : {
702 peter@eisentraut.org 1873 : 0 : TypeName *t = $1;
1874 : :
3466 bruce@momjian.us 1875 : 0 : t->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1),
1876 : : makeIntConst($3, @3));
5708 tgl@sss.pgh.pa.us 1877 : 0 : $$ = makeStringConstCast($5, @5, t);
1878 : : }
5708 tgl@sss.pgh.pa.us 1879 :CBC 12 : | NumericOnly { $$ = makeAConst($1, @1); }
7972 bruce@momjian.us 1880 : 6 : | DEFAULT { $$ = NULL; }
7972 bruce@momjian.us 1881 :UBC 0 : | LOCAL { $$ = NULL; }
1882 : : ;
1883 : :
1884 : : opt_encoding:
1885 : 0 : Sconst { $$ = $1; }
1886 : 0 : | DEFAULT { $$ = NULL; }
1887 : 0 : | /*EMPTY*/ { $$ = NULL; }
1888 : : ;
1889 : :
1890 : : NonReservedWord_or_Sconst:
3969 tgl@sss.pgh.pa.us 1891 :CBC 22331 : NonReservedWord { $$ = $1; }
5632 meskes@postgresql.or 1892 : 2388 : | Sconst { $$ = $1; }
1893 : : ;
1894 : :
1895 : : VariableResetStmt:
3512 fujii@postgresql.org 1896 : 1997 : RESET reset_rest { $$ = (Node *) $2; }
1897 : : ;
1898 : :
1899 : : reset_rest:
1900 : 1619 : generic_reset { $$ = $1; }
1901 : : | TIME ZONE
1902 : : {
6068 tgl@sss.pgh.pa.us 1903 : 6 : VariableSetStmt *n = makeNode(VariableSetStmt);
1904 : :
1905 : 6 : n->kind = VAR_RESET;
3512 fujii@postgresql.org 1906 : 6 : n->name = "timezone";
1907 : 6 : $$ = n;
1908 : : }
1909 : : | TRANSACTION ISOLATION LEVEL
1910 : : {
6068 tgl@sss.pgh.pa.us 1911 :UBC 0 : VariableSetStmt *n = makeNode(VariableSetStmt);
1912 : :
1913 : 0 : n->kind = VAR_RESET;
3512 fujii@postgresql.org 1914 : 0 : n->name = "transaction_isolation";
1915 : 0 : $$ = n;
1916 : : }
1917 : : | SESSION AUTHORIZATION
1918 : : {
6068 tgl@sss.pgh.pa.us 1919 :CBC 372 : VariableSetStmt *n = makeNode(VariableSetStmt);
1920 : :
1921 : 372 : n->kind = VAR_RESET;
3512 fujii@postgresql.org 1922 : 372 : n->name = "session_authorization";
1923 : 372 : $$ = n;
1924 : : }
1925 : : ;
1926 : :
1927 : : generic_reset:
1928 : : var_name
1929 : : {
6068 tgl@sss.pgh.pa.us 1930 : 1635 : VariableSetStmt *n = makeNode(VariableSetStmt);
1931 : :
1932 : 1635 : n->kind = VAR_RESET;
3512 fujii@postgresql.org 1933 : 1635 : n->name = $1;
1934 : 1635 : $$ = n;
1935 : : }
1936 : : | ALL
1937 : : {
6068 tgl@sss.pgh.pa.us 1938 : 8 : VariableSetStmt *n = makeNode(VariableSetStmt);
1939 : :
1940 : 8 : n->kind = VAR_RESET_ALL;
3512 fujii@postgresql.org 1941 : 8 : $$ = n;
1942 : : }
1943 : : ;
1944 : :
1945 : : /* SetResetClause allows SET or RESET without LOCAL */
1946 : : SetResetClause:
6068 tgl@sss.pgh.pa.us 1947 : 560 : SET set_rest { $$ = $2; }
1948 : 14 : | VariableResetStmt { $$ = (VariableSetStmt *) $1; }
1949 : : ;
1950 : :
1951 : : /* SetResetClause allows SET or RESET without LOCAL */
1952 : : FunctionSetResetClause:
4442 rhaas@postgresql.org 1953 : 50 : SET set_rest_more { $$ = $2; }
1954 : 6 : | VariableResetStmt { $$ = (VariableSetStmt *) $1; }
1955 : : ;
1956 : :
1957 : :
1958 : : VariableShowStmt:
1959 : : SHOW var_name
1960 : : {
6068 tgl@sss.pgh.pa.us 1961 : 397 : VariableShowStmt *n = makeNode(VariableShowStmt);
1962 : :
8003 1963 : 397 : n->name = $2;
9715 bruce@momjian.us 1964 : 397 : $$ = (Node *) n;
1965 : : }
1966 : : | SHOW TIME ZONE
1967 : : {
6068 tgl@sss.pgh.pa.us 1968 : 4 : VariableShowStmt *n = makeNode(VariableShowStmt);
1969 : :
8003 1970 : 4 : n->name = "timezone";
9663 lockhart@fourpalms.o 1971 : 4 : $$ = (Node *) n;
1972 : : }
1973 : : | SHOW TRANSACTION ISOLATION LEVEL
1974 : : {
6068 tgl@sss.pgh.pa.us 1975 : 1 : VariableShowStmt *n = makeNode(VariableShowStmt);
1976 : :
7765 peter_e@gmx.net 1977 : 1 : n->name = "transaction_isolation";
9249 vadim4o@yahoo.com 1978 : 1 : $$ = (Node *) n;
1979 : : }
1980 : : | SHOW SESSION AUTHORIZATION
1981 : : {
6068 tgl@sss.pgh.pa.us 1982 :UBC 0 : VariableShowStmt *n = makeNode(VariableShowStmt);
1983 : :
8014 1984 : 0 : n->name = "session_authorization";
1985 : 0 : $$ = (Node *) n;
1986 : : }
1987 : : | SHOW ALL
1988 : : {
6068 1989 : 0 : VariableShowStmt *n = makeNode(VariableShowStmt);
1990 : :
8003 1991 : 0 : n->name = "all";
8347 bruce@momjian.us 1992 : 0 : $$ = (Node *) n;
1993 : : }
1994 : : ;
1995 : :
1996 : :
1997 : : ConstraintsSetStmt:
1998 : : SET CONSTRAINTS constraints_set_list constraints_set_mode
1999 : : {
8964 JanWieck@Yahoo.com 2000 :CBC 52 : ConstraintsSetStmt *n = makeNode(ConstraintsSetStmt);
2001 : :
2002 : 52 : n->constraints = $3;
4548 peter_e@gmx.net 2003 : 52 : n->deferred = $4;
8964 JanWieck@Yahoo.com 2004 : 52 : $$ = (Node *) n;
2005 : : }
2006 : : ;
2007 : :
2008 : : constraints_set_list:
7972 bruce@momjian.us 2009 : 28 : ALL { $$ = NIL; }
6562 2010 : 24 : | qualified_name_list { $$ = $1; }
2011 : : ;
2012 : :
2013 : : constraints_set_mode:
2433 peter_e@gmx.net 2014 : 34 : DEFERRED { $$ = true; }
2015 : 18 : | IMMEDIATE { $$ = false; }
2016 : : ;
2017 : :
2018 : :
2019 : : /*
2020 : : * Checkpoint statement
2021 : : */
2022 : : CheckPointStmt:
2023 : : CHECKPOINT
2024 : : {
8561 vadim4o@yahoo.com 2025 : 104 : CheckPointStmt *n = makeNode(CheckPointStmt);
2026 : :
702 peter@eisentraut.org 2027 : 104 : $$ = (Node *) n;
2028 : : }
2029 : : ;
2030 : :
2031 : :
2032 : : /*****************************************************************************
2033 : : *
2034 : : * DISCARD { ALL | TEMP | PLANS | SEQUENCES }
2035 : : *
2036 : : *****************************************************************************/
2037 : :
2038 : : DiscardStmt:
2039 : : DISCARD ALL
2040 : : {
6198 neilc@samurai.com 2041 : 3 : DiscardStmt *n = makeNode(DiscardStmt);
2042 : :
2043 : 3 : n->target = DISCARD_ALL;
2044 : 3 : $$ = (Node *) n;
2045 : : }
2046 : : | DISCARD TEMP
2047 : : {
2048 : 4 : DiscardStmt *n = makeNode(DiscardStmt);
2049 : :
2050 : 4 : n->target = DISCARD_TEMP;
2051 : 4 : $$ = (Node *) n;
2052 : : }
2053 : : | DISCARD TEMPORARY
2054 : : {
6198 neilc@samurai.com 2055 :UBC 0 : DiscardStmt *n = makeNode(DiscardStmt);
2056 : :
2057 : 0 : n->target = DISCARD_TEMP;
2058 : 0 : $$ = (Node *) n;
2059 : : }
2060 : : | DISCARD PLANS
2061 : : {
6198 neilc@samurai.com 2062 :CBC 2 : DiscardStmt *n = makeNode(DiscardStmt);
2063 : :
2064 : 2 : n->target = DISCARD_PLANS;
2065 : 2 : $$ = (Node *) n;
2066 : : }
2067 : : | DISCARD SEQUENCES
2068 : : {
3846 rhaas@postgresql.org 2069 : 6 : DiscardStmt *n = makeNode(DiscardStmt);
2070 : :
2071 : 6 : n->target = DISCARD_SEQUENCES;
2072 : 6 : $$ = (Node *) n;
2073 : : }
2074 : :
2075 : : ;
2076 : :
2077 : :
2078 : : /*****************************************************************************
2079 : : *
2080 : : * ALTER [ TABLE | INDEX | SEQUENCE | VIEW | MATERIALIZED VIEW | FOREIGN TABLE ] variations
2081 : : *
2082 : : * Note: we accept all subcommands for each of the variants, and sort
2083 : : * out what's really legal at execution time.
2084 : : *****************************************************************************/
2085 : :
2086 : : AlterTableStmt:
2087 : : ALTER TABLE relation_expr alter_table_cmds
2088 : : {
8825 lockhart@fourpalms.o 2089 : 10946 : AlterTableStmt *n = makeNode(AlterTableStmt);
2090 : :
8060 tgl@sss.pgh.pa.us 2091 : 10946 : n->relation = $3;
7284 2092 : 10946 : n->cmds = $4;
1373 michael@paquier.xyz 2093 : 10946 : n->objtype = OBJECT_TABLE;
4465 simon@2ndQuadrant.co 2094 : 10946 : n->missing_ok = false;
702 peter@eisentraut.org 2095 : 10946 : $$ = (Node *) n;
2096 : : }
2097 : : | ALTER TABLE IF_P EXISTS relation_expr alter_table_cmds
2098 : : {
4465 simon@2ndQuadrant.co 2099 : 27 : AlterTableStmt *n = makeNode(AlterTableStmt);
2100 : :
2101 : 27 : n->relation = $5;
2102 : 27 : n->cmds = $6;
1373 michael@paquier.xyz 2103 : 27 : n->objtype = OBJECT_TABLE;
4465 simon@2ndQuadrant.co 2104 : 27 : n->missing_ok = true;
702 peter@eisentraut.org 2105 : 27 : $$ = (Node *) n;
2106 : : }
2107 : : | ALTER TABLE relation_expr partition_cmd
2108 : : {
2685 rhaas@postgresql.org 2109 : 1566 : AlterTableStmt *n = makeNode(AlterTableStmt);
2110 : :
2111 : 1566 : n->relation = $3;
2112 : 1566 : n->cmds = list_make1($4);
1373 michael@paquier.xyz 2113 : 1566 : n->objtype = OBJECT_TABLE;
2685 rhaas@postgresql.org 2114 : 1566 : n->missing_ok = false;
702 peter@eisentraut.org 2115 : 1566 : $$ = (Node *) n;
2116 : : }
2117 : : | ALTER TABLE IF_P EXISTS relation_expr partition_cmd
2118 : : {
2685 rhaas@postgresql.org 2119 :UBC 0 : AlterTableStmt *n = makeNode(AlterTableStmt);
2120 : :
2121 : 0 : n->relation = $5;
2122 : 0 : n->cmds = list_make1($6);
1373 michael@paquier.xyz 2123 : 0 : n->objtype = OBJECT_TABLE;
2685 rhaas@postgresql.org 2124 : 0 : n->missing_ok = true;
702 peter@eisentraut.org 2125 : 0 : $$ = (Node *) n;
2126 : : }
2127 : : | ALTER TABLE ALL IN_P TABLESPACE name SET TABLESPACE name opt_nowait
2128 : : {
3524 sfrost@snowman.net 2129 :ECB (6) : AlterTableMoveAllStmt *n =
3524 sfrost@snowman.net 2130 :CBC 6 : makeNode(AlterTableMoveAllStmt);
2131 : :
2132 : 6 : n->orig_tablespacename = $6;
2133 : 6 : n->objtype = OBJECT_TABLE;
2134 : 6 : n->roles = NIL;
2135 : 6 : n->new_tablespacename = $9;
2136 : 6 : n->nowait = $10;
702 peter@eisentraut.org 2137 : 6 : $$ = (Node *) n;
2138 : : }
2139 : : | ALTER TABLE ALL IN_P TABLESPACE name OWNED BY role_list SET TABLESPACE name opt_nowait
2140 : : {
3524 sfrost@snowman.net 2141 :EUB : AlterTableMoveAllStmt *n =
3524 sfrost@snowman.net 2142 :UBC 0 : makeNode(AlterTableMoveAllStmt);
2143 : :
2144 : 0 : n->orig_tablespacename = $6;
2145 : 0 : n->objtype = OBJECT_TABLE;
2146 : 0 : n->roles = $9;
2147 : 0 : n->new_tablespacename = $12;
2148 : 0 : n->nowait = $13;
702 peter@eisentraut.org 2149 : 0 : $$ = (Node *) n;
2150 : : }
2151 : : | ALTER INDEX qualified_name alter_table_cmds
2152 : : {
7177 bruce@momjian.us 2153 :CBC 113 : AlterTableStmt *n = makeNode(AlterTableStmt);
2154 : :
2155 : 113 : n->relation = $3;
2156 : 113 : n->cmds = $4;
1373 michael@paquier.xyz 2157 : 113 : n->objtype = OBJECT_INDEX;
4465 simon@2ndQuadrant.co 2158 : 113 : n->missing_ok = false;
702 peter@eisentraut.org 2159 : 113 : $$ = (Node *) n;
2160 : : }
2161 : : | ALTER INDEX IF_P EXISTS qualified_name alter_table_cmds
2162 : : {
4465 simon@2ndQuadrant.co 2163 :UBC 0 : AlterTableStmt *n = makeNode(AlterTableStmt);
2164 : :
2165 : 0 : n->relation = $5;
2166 : 0 : n->cmds = $6;
1373 michael@paquier.xyz 2167 : 0 : n->objtype = OBJECT_INDEX;
4465 simon@2ndQuadrant.co 2168 : 0 : n->missing_ok = true;
702 peter@eisentraut.org 2169 : 0 : $$ = (Node *) n;
2170 : : }
2171 : : | ALTER INDEX qualified_name index_partition_cmd
2172 : : {
2277 alvherre@alvh.no-ip. 2173 :CBC 195 : AlterTableStmt *n = makeNode(AlterTableStmt);
2174 : :
2175 : 195 : n->relation = $3;
2176 : 195 : n->cmds = list_make1($4);
1373 michael@paquier.xyz 2177 : 195 : n->objtype = OBJECT_INDEX;
2277 alvherre@alvh.no-ip. 2178 : 195 : n->missing_ok = false;
702 peter@eisentraut.org 2179 : 195 : $$ = (Node *) n;
2180 : : }
2181 : : | ALTER INDEX ALL IN_P TABLESPACE name SET TABLESPACE name opt_nowait
2182 : : {
3524 sfrost@snowman.net 2183 :ECB (3) : AlterTableMoveAllStmt *n =
3524 sfrost@snowman.net 2184 :CBC 3 : makeNode(AlterTableMoveAllStmt);
2185 : :
2186 : 3 : n->orig_tablespacename = $6;
2187 : 3 : n->objtype = OBJECT_INDEX;
2188 : 3 : n->roles = NIL;
2189 : 3 : n->new_tablespacename = $9;
2190 : 3 : n->nowait = $10;
702 peter@eisentraut.org 2191 : 3 : $$ = (Node *) n;
2192 : : }
2193 : : | ALTER INDEX ALL IN_P TABLESPACE name OWNED BY role_list SET TABLESPACE name opt_nowait
2194 : : {
3524 sfrost@snowman.net 2195 :EUB : AlterTableMoveAllStmt *n =
3524 sfrost@snowman.net 2196 :UBC 0 : makeNode(AlterTableMoveAllStmt);
2197 : :
2198 : 0 : n->orig_tablespacename = $6;
2199 : 0 : n->objtype = OBJECT_INDEX;
2200 : 0 : n->roles = $9;
2201 : 0 : n->new_tablespacename = $12;
2202 : 0 : n->nowait = $13;
702 peter@eisentraut.org 2203 : 0 : $$ = (Node *) n;
2204 : : }
2205 : : | ALTER SEQUENCE qualified_name alter_table_cmds
2206 : : {
5782 tgl@sss.pgh.pa.us 2207 :CBC 37 : AlterTableStmt *n = makeNode(AlterTableStmt);
2208 : :
2209 : 37 : n->relation = $3;
2210 : 37 : n->cmds = $4;
1373 michael@paquier.xyz 2211 : 37 : n->objtype = OBJECT_SEQUENCE;
4465 simon@2ndQuadrant.co 2212 : 37 : n->missing_ok = false;
702 peter@eisentraut.org 2213 : 37 : $$ = (Node *) n;
2214 : : }
2215 : : | ALTER SEQUENCE IF_P EXISTS qualified_name alter_table_cmds
2216 : : {
4465 simon@2ndQuadrant.co 2217 :UBC 0 : AlterTableStmt *n = makeNode(AlterTableStmt);
2218 : :
2219 : 0 : n->relation = $5;
2220 : 0 : n->cmds = $6;
1373 michael@paquier.xyz 2221 : 0 : n->objtype = OBJECT_SEQUENCE;
4465 simon@2ndQuadrant.co 2222 : 0 : n->missing_ok = true;
702 peter@eisentraut.org 2223 : 0 : $$ = (Node *) n;
2224 : : }
2225 : : | ALTER VIEW qualified_name alter_table_cmds
2226 : : {
5782 tgl@sss.pgh.pa.us 2227 :CBC 120 : AlterTableStmt *n = makeNode(AlterTableStmt);
2228 : :
2229 : 120 : n->relation = $3;
2230 : 120 : n->cmds = $4;
1373 michael@paquier.xyz 2231 : 120 : n->objtype = OBJECT_VIEW;
4465 simon@2ndQuadrant.co 2232 : 120 : n->missing_ok = false;
702 peter@eisentraut.org 2233 : 120 : $$ = (Node *) n;
2234 : : }
2235 : : | ALTER VIEW IF_P EXISTS qualified_name alter_table_cmds
2236 : : {
4465 simon@2ndQuadrant.co 2237 :UBC 0 : AlterTableStmt *n = makeNode(AlterTableStmt);
2238 : :
2239 : 0 : n->relation = $5;
2240 : 0 : n->cmds = $6;
1373 michael@paquier.xyz 2241 : 0 : n->objtype = OBJECT_VIEW;
4465 simon@2ndQuadrant.co 2242 : 0 : n->missing_ok = true;
702 peter@eisentraut.org 2243 : 0 : $$ = (Node *) n;
2244 : : }
2245 : : | ALTER MATERIALIZED VIEW qualified_name alter_table_cmds
2246 : : {
4060 kgrittn@postgresql.o 2247 :CBC 24 : AlterTableStmt *n = makeNode(AlterTableStmt);
2248 : :
2249 : 24 : n->relation = $4;
2250 : 24 : n->cmds = $5;
1373 michael@paquier.xyz 2251 : 24 : n->objtype = OBJECT_MATVIEW;
4060 kgrittn@postgresql.o 2252 : 24 : n->missing_ok = false;
702 peter@eisentraut.org 2253 : 24 : $$ = (Node *) n;
2254 : : }
2255 : : | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name alter_table_cmds
2256 : : {
4060 kgrittn@postgresql.o 2257 :UBC 0 : AlterTableStmt *n = makeNode(AlterTableStmt);
2258 : :
2259 : 0 : n->relation = $6;
2260 : 0 : n->cmds = $7;
1373 michael@paquier.xyz 2261 : 0 : n->objtype = OBJECT_MATVIEW;
4060 kgrittn@postgresql.o 2262 : 0 : n->missing_ok = true;
702 peter@eisentraut.org 2263 : 0 : $$ = (Node *) n;
2264 : : }
2265 : : | ALTER MATERIALIZED VIEW ALL IN_P TABLESPACE name SET TABLESPACE name opt_nowait
2266 : : {
3524 sfrost@snowman.net 2267 :ECB (6) : AlterTableMoveAllStmt *n =
3524 sfrost@snowman.net 2268 :CBC 6 : makeNode(AlterTableMoveAllStmt);
2269 : :
2270 : 6 : n->orig_tablespacename = $7;
2271 : 6 : n->objtype = OBJECT_MATVIEW;
2272 : 6 : n->roles = NIL;
2273 : 6 : n->new_tablespacename = $10;
2274 : 6 : n->nowait = $11;
702 peter@eisentraut.org 2275 : 6 : $$ = (Node *) n;
2276 : : }
2277 : : | ALTER MATERIALIZED VIEW ALL IN_P TABLESPACE name OWNED BY role_list SET TABLESPACE name opt_nowait
2278 : : {
3524 sfrost@snowman.net 2279 :EUB : AlterTableMoveAllStmt *n =
3524 sfrost@snowman.net 2280 :UBC 0 : makeNode(AlterTableMoveAllStmt);
2281 : :
2282 : 0 : n->orig_tablespacename = $7;
2283 : 0 : n->objtype = OBJECT_MATVIEW;
2284 : 0 : n->roles = $10;
2285 : 0 : n->new_tablespacename = $13;
2286 : 0 : n->nowait = $14;
702 peter@eisentraut.org 2287 : 0 : $$ = (Node *) n;
2288 : : }
2289 : : | ALTER FOREIGN TABLE relation_expr alter_table_cmds
2290 : : {
1403 peter@eisentraut.org 2291 :CBC 183 : AlterTableStmt *n = makeNode(AlterTableStmt);
2292 : :
2293 : 183 : n->relation = $4;
2294 : 183 : n->cmds = $5;
1373 michael@paquier.xyz 2295 : 183 : n->objtype = OBJECT_FOREIGN_TABLE;
1403 peter@eisentraut.org 2296 : 183 : n->missing_ok = false;
702 2297 : 183 : $$ = (Node *) n;
2298 : : }
2299 : : | ALTER FOREIGN TABLE IF_P EXISTS relation_expr alter_table_cmds
2300 : : {
1403 2301 : 54 : AlterTableStmt *n = makeNode(AlterTableStmt);
2302 : :
2303 : 54 : n->relation = $6;
2304 : 54 : n->cmds = $7;
1373 michael@paquier.xyz 2305 : 54 : n->objtype = OBJECT_FOREIGN_TABLE;
1403 peter@eisentraut.org 2306 : 54 : n->missing_ok = true;
702 2307 : 54 : $$ = (Node *) n;
2308 : : }
2309 : : ;
2310 : :
2311 : : alter_table_cmds:
7259 neilc@samurai.com 2312 : 11504 : alter_table_cmd { $$ = list_make1($1); }
7284 tgl@sss.pgh.pa.us 2313 : 459 : | alter_table_cmds ',' alter_table_cmd { $$ = lappend($1, $3); }
2314 : : ;
2315 : :
2316 : : partitions_list:
7 akorotkov@postgresql 2317 :GNC 126 : SinglePartitionSpec { $$ = list_make1($1); }
2318 : 261 : | partitions_list ',' SinglePartitionSpec { $$ = lappend($1, $3); }
2319 : : ;
2320 : :
2321 : : SinglePartitionSpec:
2322 : : PARTITION qualified_name PartitionBoundSpec
2323 : : {
2324 : 387 : SinglePartitionSpec *n = makeNode(SinglePartitionSpec);
2325 : :
2326 : 387 : n->name = $2;
2327 : 387 : n->bound = $3;
2328 : :
2329 : 387 : $$ = n;
2330 : : }
2331 : : ;
2332 : :
2333 : : partition_cmd:
2334 : : /* ALTER TABLE <name> ATTACH PARTITION <table_name> FOR VALUES */
2335 : : ATTACH PARTITION qualified_name PartitionBoundSpec
2336 : : {
2685 rhaas@postgresql.org 2337 :CBC 1106 : AlterTableCmd *n = makeNode(AlterTableCmd);
2338 : 1106 : PartitionCmd *cmd = makeNode(PartitionCmd);
2339 : :
2340 : 1106 : n->subtype = AT_AttachPartition;
2341 : 1106 : cmd->name = $3;
2513 tgl@sss.pgh.pa.us 2342 : 1106 : cmd->bound = $4;
7 akorotkov@postgresql 2343 :GNC 1106 : cmd->partlist = NULL;
1116 alvherre@alvh.no-ip. 2344 :CBC 1106 : cmd->concurrent = false;
2685 rhaas@postgresql.org 2345 : 1106 : n->def = (Node *) cmd;
2346 : :
2347 : 1106 : $$ = (Node *) n;
2348 : : }
2349 : : /* ALTER TABLE <name> DETACH PARTITION <partition_name> [CONCURRENTLY] */
2350 : : | DETACH PARTITION qualified_name opt_concurrently
2351 : : {
2352 : 267 : AlterTableCmd *n = makeNode(AlterTableCmd);
2353 : 267 : PartitionCmd *cmd = makeNode(PartitionCmd);
2354 : :
2355 : 267 : n->subtype = AT_DetachPartition;
2356 : 267 : cmd->name = $3;
2513 tgl@sss.pgh.pa.us 2357 : 267 : cmd->bound = NULL;
7 akorotkov@postgresql 2358 :GNC 267 : cmd->partlist = NULL;
1116 alvherre@alvh.no-ip. 2359 :CBC 267 : cmd->concurrent = $4;
2685 rhaas@postgresql.org 2360 : 267 : n->def = (Node *) cmd;
2361 : :
1116 alvherre@alvh.no-ip. 2362 : 267 : $$ = (Node *) n;
2363 : : }
2364 : : | DETACH PARTITION qualified_name FINALIZE
2365 : : {
2366 : 7 : AlterTableCmd *n = makeNode(AlterTableCmd);
2367 : 7 : PartitionCmd *cmd = makeNode(PartitionCmd);
2368 : :
2369 : 7 : n->subtype = AT_DetachPartitionFinalize;
2370 : 7 : cmd->name = $3;
2371 : 7 : cmd->bound = NULL;
7 akorotkov@postgresql 2372 :GNC 7 : cmd->partlist = NULL;
2373 : 7 : cmd->concurrent = false;
2374 : 7 : n->def = (Node *) cmd;
2375 : 7 : $$ = (Node *) n;
2376 : : }
2377 : : /* ALTER TABLE <name> SPLIT PARTITION <partition_name> INTO () */
2378 : : | SPLIT PARTITION qualified_name INTO '(' partitions_list ')'
2379 : : {
2380 : 126 : AlterTableCmd *n = makeNode(AlterTableCmd);
2381 : 126 : PartitionCmd *cmd = makeNode(PartitionCmd);
2382 : :
2383 : 126 : n->subtype = AT_SplitPartition;
2384 : 126 : cmd->name = $3;
2385 : 126 : cmd->bound = NULL;
2386 : 126 : cmd->partlist = $6;
2387 : 126 : cmd->concurrent = false;
2388 : 126 : n->def = (Node *) cmd;
2389 : 126 : $$ = (Node *) n;
2390 : : }
2391 : : /* ALTER TABLE <name> MERGE PARTITIONS () INTO <partition_name> */
2392 : : | MERGE PARTITIONS '(' qualified_name_list ')' INTO qualified_name
2393 : : {
2394 : 60 : AlterTableCmd *n = makeNode(AlterTableCmd);
2395 : 60 : PartitionCmd *cmd = makeNode(PartitionCmd);
2396 : :
2397 : 60 : n->subtype = AT_MergePartitions;
2398 : 60 : cmd->name = $7;
2399 : 60 : cmd->bound = NULL;
2400 : 60 : cmd->partlist = $4;
1116 alvherre@alvh.no-ip. 2401 :CBC 60 : cmd->concurrent = false;
2402 : 60 : n->def = (Node *) cmd;
2685 rhaas@postgresql.org 2403 : 60 : $$ = (Node *) n;
2404 : : }
2405 : : ;
2406 : :
2407 : : index_partition_cmd:
2408 : : /* ALTER INDEX <name> ATTACH PARTITION <index_name> */
2409 : : ATTACH PARTITION qualified_name
2410 : : {
2277 alvherre@alvh.no-ip. 2411 : 195 : AlterTableCmd *n = makeNode(AlterTableCmd);
2412 : 195 : PartitionCmd *cmd = makeNode(PartitionCmd);
2413 : :
2414 : 195 : n->subtype = AT_AttachPartition;
2415 : 195 : cmd->name = $3;
2416 : 195 : cmd->bound = NULL;
7 akorotkov@postgresql 2417 :GNC 195 : cmd->partlist = NULL;
1116 alvherre@alvh.no-ip. 2418 :CBC 195 : cmd->concurrent = false;
2277 2419 : 195 : n->def = (Node *) cmd;
2420 : :
2421 : 195 : $$ = (Node *) n;
2422 : : }
2423 : : ;
2424 : :
2425 : : alter_table_cmd:
2426 : : /* ALTER TABLE <name> ADD <coldef> */
2427 : : ADD_P columnDef
2428 : : {
5242 tgl@sss.pgh.pa.us 2429 : 82 : AlterTableCmd *n = makeNode(AlterTableCmd);
2430 : :
2431 : 82 : n->subtype = AT_AddColumn;
2432 : 82 : n->def = $2;
3182 andrew@dunslane.net 2433 : 82 : n->missing_ok = false;
702 peter@eisentraut.org 2434 : 82 : $$ = (Node *) n;
2435 : : }
2436 : : /* ALTER TABLE <name> ADD IF NOT EXISTS <coldef> */
2437 : : | ADD_P IF_P NOT EXISTS columnDef
2438 : : {
3182 andrew@dunslane.net 2439 :UBC 0 : AlterTableCmd *n = makeNode(AlterTableCmd);
2440 : :
2441 : 0 : n->subtype = AT_AddColumn;
2442 : 0 : n->def = $5;
2443 : 0 : n->missing_ok = true;
702 peter@eisentraut.org 2444 : 0 : $$ = (Node *) n;
2445 : : }
2446 : : /* ALTER TABLE <name> ADD COLUMN <coldef> */
2447 : : | ADD_P COLUMN columnDef
2448 : : {
7284 tgl@sss.pgh.pa.us 2449 :CBC 858 : AlterTableCmd *n = makeNode(AlterTableCmd);
2450 : :
2451 : 858 : n->subtype = AT_AddColumn;
2452 : 858 : n->def = $3;
3182 andrew@dunslane.net 2453 : 858 : n->missing_ok = false;
702 peter@eisentraut.org 2454 : 858 : $$ = (Node *) n;
2455 : : }
2456 : : /* ALTER TABLE <name> ADD COLUMN IF NOT EXISTS <coldef> */
2457 : : | ADD_P COLUMN IF_P NOT EXISTS columnDef
2458 : : {
3182 andrew@dunslane.net 2459 : 30 : AlterTableCmd *n = makeNode(AlterTableCmd);
2460 : :
2461 : 30 : n->subtype = AT_AddColumn;
2462 : 30 : n->def = $6;
2463 : 30 : n->missing_ok = true;
702 peter@eisentraut.org 2464 : 30 : $$ = (Node *) n;
2465 : : }
2466 : : /* ALTER TABLE <name> ALTER [COLUMN] <colname> {SET DEFAULT <expr>|DROP DEFAULT} */
2467 : : | ALTER opt_column ColId alter_column_default
2468 : : {
7284 tgl@sss.pgh.pa.us 2469 : 266 : AlterTableCmd *n = makeNode(AlterTableCmd);
2470 : :
2471 : 266 : n->subtype = AT_ColumnDefault;
2472 : 266 : n->name = $3;
2473 : 266 : n->def = $4;
702 peter@eisentraut.org 2474 : 266 : $$ = (Node *) n;
2475 : : }
2476 : : /* ALTER TABLE <name> ALTER [COLUMN] <colname> DROP NOT NULL */
2477 : : | ALTER opt_column ColId DROP NOT NULL_P
2478 : : {
7284 tgl@sss.pgh.pa.us 2479 : 132 : AlterTableCmd *n = makeNode(AlterTableCmd);
2480 : :
2481 : 132 : n->subtype = AT_DropNotNull;
2482 : 132 : n->name = $3;
702 peter@eisentraut.org 2483 : 132 : $$ = (Node *) n;
2484 : : }
2485 : : /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET NOT NULL */
2486 : : | ALTER opt_column ColId SET NOT NULL_P
2487 : : {
7284 tgl@sss.pgh.pa.us 2488 : 193 : AlterTableCmd *n = makeNode(AlterTableCmd);
2489 : :
2490 : 193 : n->subtype = AT_SetNotNull;
2491 : 193 : n->name = $3;
702 peter@eisentraut.org 2492 : 193 : $$ = (Node *) n;
2493 : : }
2494 : : /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET EXPRESSION AS <expr> */
2495 : : | ALTER opt_column ColId SET EXPRESSION AS '(' a_expr ')'
2496 : : {
101 peter@eisentraut.org 2497 :GNC 33 : AlterTableCmd *n = makeNode(AlterTableCmd);
2498 : :
2499 : 33 : n->subtype = AT_SetExpression;
2500 : 33 : n->name = $3;
2501 : 33 : n->def = $8;
2502 : 33 : $$ = (Node *) n;
2503 : : }
2504 : : /* ALTER TABLE <name> ALTER [COLUMN] <colname> DROP EXPRESSION */
2505 : : | ALTER opt_column ColId DROP EXPRESSION
2506 : : {
1552 peter@eisentraut.org 2507 :CBC 16 : AlterTableCmd *n = makeNode(AlterTableCmd);
2508 : :
2509 : 16 : n->subtype = AT_DropExpression;
2510 : 16 : n->name = $3;
702 2511 : 16 : $$ = (Node *) n;
2512 : : }
2513 : : /* ALTER TABLE <name> ALTER [COLUMN] <colname> DROP EXPRESSION IF EXISTS */
2514 : : | ALTER opt_column ColId DROP EXPRESSION IF_P EXISTS
2515 : : {
1552 2516 : 3 : AlterTableCmd *n = makeNode(AlterTableCmd);
2517 : :
2518 : 3 : n->subtype = AT_DropExpression;
2519 : 3 : n->name = $3;
2520 : 3 : n->missing_ok = true;
702 2521 : 3 : $$ = (Node *) n;
2522 : : }
2523 : : /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET STATISTICS */
2524 : : | ALTER opt_column ColId SET STATISTICS set_statistics_value
2525 : : {
7284 tgl@sss.pgh.pa.us 2526 : 31 : AlterTableCmd *n = makeNode(AlterTableCmd);
2527 : :
2528 : 31 : n->subtype = AT_SetStatistics;
2529 : 31 : n->name = $3;
92 peter@eisentraut.org 2530 :GNC 31 : n->def = $6;
702 peter@eisentraut.org 2531 :CBC 31 : $$ = (Node *) n;
2532 : : }
2533 : : /* ALTER TABLE <name> ALTER [COLUMN] <colnum> SET STATISTICS */
2534 : : | ALTER opt_column Iconst SET STATISTICS set_statistics_value
2535 : : {
2412 simon@2ndQuadrant.co 2536 : 35 : AlterTableCmd *n = makeNode(AlterTableCmd);
2537 : :
2538 [ + + - + ]: 35 : if ($3 <= 0 || $3 > PG_INT16_MAX)
2539 [ + - ]: 3 : ereport(ERROR,
2540 : : (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2541 : : errmsg("column number must be in range from 1 to %d", PG_INT16_MAX),
2542 : : parser_errposition(@3)));
2543 : :
2544 : 32 : n->subtype = AT_SetStatistics;
2545 : 32 : n->num = (int16) $3;
92 peter@eisentraut.org 2546 :GNC 32 : n->def = $6;
702 peter@eisentraut.org 2547 :CBC 32 : $$ = (Node *) n;
2548 : : }
2549 : : /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET ( column_parameter = value [, ... ] ) */
2550 : : | ALTER opt_column ColId SET reloptions
2551 : : {
5369 tgl@sss.pgh.pa.us 2552 : 19 : AlterTableCmd *n = makeNode(AlterTableCmd);
2553 : :
5196 rhaas@postgresql.org 2554 : 19 : n->subtype = AT_SetOptions;
5369 tgl@sss.pgh.pa.us 2555 : 19 : n->name = $3;
5196 rhaas@postgresql.org 2556 : 19 : n->def = (Node *) $5;
702 peter@eisentraut.org 2557 : 19 : $$ = (Node *) n;
2558 : : }
2559 : : /* ALTER TABLE <name> ALTER [COLUMN] <colname> RESET ( column_parameter [, ... ] ) */
2560 : : | ALTER opt_column ColId RESET reloptions
2561 : : {
5196 rhaas@postgresql.org 2562 : 3 : AlterTableCmd *n = makeNode(AlterTableCmd);
2563 : :
2564 : 3 : n->subtype = AT_ResetOptions;
2565 : 3 : n->name = $3;
2566 : 3 : n->def = (Node *) $5;
702 peter@eisentraut.org 2567 : 3 : $$ = (Node *) n;
2568 : : }
2569 : : /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET STORAGE <storagemode> */
2570 : : | ALTER opt_column ColId SET column_storage
2571 : : {
7284 tgl@sss.pgh.pa.us 2572 : 106 : AlterTableCmd *n = makeNode(AlterTableCmd);
2573 : :
2574 : 106 : n->subtype = AT_SetStorage;
2575 : 106 : n->name = $3;
641 peter@eisentraut.org 2576 : 106 : n->def = (Node *) makeString($5);
702 2577 : 106 : $$ = (Node *) n;
2578 : : }
2579 : : /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET COMPRESSION <cm> */
2580 : : | ALTER opt_column ColId SET column_compression
2581 : : {
1053 tgl@sss.pgh.pa.us 2582 : 33 : AlterTableCmd *n = makeNode(AlterTableCmd);
2583 : :
2584 : 33 : n->subtype = AT_SetCompression;
2585 : 33 : n->name = $3;
2586 : 33 : n->def = (Node *) makeString($5);
702 peter@eisentraut.org 2587 : 33 : $$ = (Node *) n;
2588 : : }
2589 : : /* ALTER TABLE <name> ALTER [COLUMN] <colname> ADD GENERATED ... AS IDENTITY ... */
2590 : : | ALTER opt_column ColId ADD_P GENERATED generated_when AS IDENTITY_P OptParenthesizedSeqOptList
2591 : : {
2565 peter_e@gmx.net 2592 : 77 : AlterTableCmd *n = makeNode(AlterTableCmd);
2593 : 77 : Constraint *c = makeNode(Constraint);
2594 : :
2595 : 77 : c->contype = CONSTR_IDENTITY;
2596 : 77 : c->generated_when = $6;
2597 : 77 : c->options = $9;
2598 : 77 : c->location = @5;
2599 : :
2600 : 77 : n->subtype = AT_AddIdentity;
2601 : 77 : n->name = $3;
2602 : 77 : n->def = (Node *) c;
2603 : :
702 peter@eisentraut.org 2604 : 77 : $$ = (Node *) n;
2605 : : }
2606 : : /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET <sequence options>/RESET */
2607 : : | ALTER opt_column ColId alter_identity_column_option_list
2608 : : {
2565 peter_e@gmx.net 2609 : 31 : AlterTableCmd *n = makeNode(AlterTableCmd);
2610 : :
2611 : 31 : n->subtype = AT_SetIdentity;
2612 : 31 : n->name = $3;
2613 : 31 : n->def = (Node *) $4;
702 peter@eisentraut.org 2614 : 31 : $$ = (Node *) n;
2615 : : }
2616 : : /* ALTER TABLE <name> ALTER [COLUMN] <colname> DROP IDENTITY */
2617 : : | ALTER opt_column ColId DROP IDENTITY_P
2618 : : {
2565 peter_e@gmx.net 2619 : 25 : AlterTableCmd *n = makeNode(AlterTableCmd);
2620 : :
2621 : 25 : n->subtype = AT_DropIdentity;
2622 : 25 : n->name = $3;
2623 : 25 : n->missing_ok = false;
702 peter@eisentraut.org 2624 : 25 : $$ = (Node *) n;
2625 : : }
2626 : : /* ALTER TABLE <name> ALTER [COLUMN] <colname> DROP IDENTITY IF EXISTS */
2627 : : | ALTER opt_column ColId DROP IDENTITY_P IF_P EXISTS
2628 : : {
2565 peter_e@gmx.net 2629 : 3 : AlterTableCmd *n = makeNode(AlterTableCmd);
2630 : :
2631 : 3 : n->subtype = AT_DropIdentity;
2632 : 3 : n->name = $3;
2633 : 3 : n->missing_ok = true;
702 peter@eisentraut.org 2634 : 3 : $$ = (Node *) n;
2635 : : }
2636 : : /* ALTER TABLE <name> DROP [COLUMN] IF EXISTS <colname> [RESTRICT|CASCADE] */
2637 : : | DROP opt_column IF_P EXISTS ColId opt_drop_behavior
2638 : : {
5382 andrew@dunslane.net 2639 : 9 : AlterTableCmd *n = makeNode(AlterTableCmd);
2640 : :
2641 : 9 : n->subtype = AT_DropColumn;
2642 : 9 : n->name = $5;
2643 : 9 : n->behavior = $6;
2433 peter_e@gmx.net 2644 : 9 : n->missing_ok = true;
702 peter@eisentraut.org 2645 : 9 : $$ = (Node *) n;
2646 : : }
2647 : : /* ALTER TABLE <name> DROP [COLUMN] <colname> [RESTRICT|CASCADE] */
2648 : : | DROP opt_column ColId opt_drop_behavior
2649 : : {
7284 tgl@sss.pgh.pa.us 2650 : 767 : AlterTableCmd *n = makeNode(AlterTableCmd);
2651 : :
2652 : 767 : n->subtype = AT_DropColumn;
2653 : 767 : n->name = $3;
2654 : 767 : n->behavior = $4;
2433 peter_e@gmx.net 2655 : 767 : n->missing_ok = false;
702 peter@eisentraut.org 2656 : 767 : $$ = (Node *) n;
2657 : : }
2658 : : /*
2659 : : * ALTER TABLE <name> ALTER [COLUMN] <colname> [SET DATA] TYPE <typename>
2660 : : * [ USING <expression> ]
2661 : : */
2662 : : | ALTER opt_column ColId opt_set_data TYPE_P Typename opt_collate_clause alter_using
2663 : : {
7284 tgl@sss.pgh.pa.us 2664 : 421 : AlterTableCmd *n = makeNode(AlterTableCmd);
4785 2665 : 421 : ColumnDef *def = makeNode(ColumnDef);
2666 : :
7284 2667 : 421 : n->subtype = AT_AlterColumnType;
2668 : 421 : n->name = $3;
4785 2669 : 421 : n->def = (Node *) def;
2670 : : /* We only use these fields of the ColumnDef node */
2671 : 421 : def->typeName = $6;
2672 : 421 : def->collClause = (CollateClause *) $7;
2673 : 421 : def->raw_default = $8;
3797 2674 : 421 : def->location = @3;
702 peter@eisentraut.org 2675 : 421 : $$ = (Node *) n;
2676 : : }
2677 : : /* ALTER FOREIGN TABLE <name> ALTER [COLUMN] <colname> OPTIONS */
2678 : : | ALTER opt_column ColId alter_generic_options
2679 : : {
4636 rhaas@postgresql.org 2680 : 25 : AlterTableCmd *n = makeNode(AlterTableCmd);
2681 : :
2682 : 25 : n->subtype = AT_AlterColumnGenericOptions;
2683 : 25 : n->name = $3;
2684 : 25 : n->def = (Node *) $4;
702 peter@eisentraut.org 2685 : 25 : $$ = (Node *) n;
2686 : : }
2687 : : /* ALTER TABLE <name> ADD CONSTRAINT ... */
2688 : : | ADD_P TableConstraint
2689 : : {
7284 tgl@sss.pgh.pa.us 2690 : 5679 : AlterTableCmd *n = makeNode(AlterTableCmd);
2691 : :
2692 : 5679 : n->subtype = AT_AddConstraint;
2693 : 5679 : n->def = $2;
702 peter@eisentraut.org 2694 : 5679 : $$ = (Node *) n;
2695 : : }
2696 : : /* ALTER TABLE <name> ALTER CONSTRAINT ... */
2697 : : | ALTER CONSTRAINT name ConstraintAttributeSpec
2698 : : {
3942 simon@2ndQuadrant.co 2699 : 66 : AlterTableCmd *n = makeNode(AlterTableCmd);
2700 : 66 : Constraint *c = makeNode(Constraint);
2701 : :
2702 : 66 : n->subtype = AT_AlterConstraint;
2703 : 66 : n->def = (Node *) c;
2704 : 66 : c->contype = CONSTR_FOREIGN; /* others not supported, yet */
2705 : 66 : c->conname = $3;
2706 : 66 : processCASbits($4, @4, "ALTER CONSTRAINT statement",
2707 : : &c->deferrable,
2708 : : &c->initdeferred,
2709 : : NULL, NULL, yyscanner);
702 peter@eisentraut.org 2710 : 66 : $$ = (Node *) n;
2711 : : }
2712 : : /* ALTER TABLE <name> VALIDATE CONSTRAINT ... */
2713 : : | VALIDATE CONSTRAINT name
2714 : : {
4814 simon@2ndQuadrant.co 2715 : 194 : AlterTableCmd *n = makeNode(AlterTableCmd);
2716 : :
2717 : 194 : n->subtype = AT_ValidateConstraint;
2718 : 194 : n->name = $3;
702 peter@eisentraut.org 2719 : 194 : $$ = (Node *) n;
2720 : : }
2721 : : /* ALTER TABLE <name> DROP CONSTRAINT IF EXISTS <name> [RESTRICT|CASCADE] */
2722 : : | DROP CONSTRAINT IF_P EXISTS name opt_drop_behavior
2723 : : {
5382 andrew@dunslane.net 2724 : 9 : AlterTableCmd *n = makeNode(AlterTableCmd);
2725 : :
2726 : 9 : n->subtype = AT_DropConstraint;
2727 : 9 : n->name = $5;
2728 : 9 : n->behavior = $6;
2433 peter_e@gmx.net 2729 : 9 : n->missing_ok = true;
702 peter@eisentraut.org 2730 : 9 : $$ = (Node *) n;
2731 : : }
2732 : : /* ALTER TABLE <name> DROP CONSTRAINT <name> [RESTRICT|CASCADE] */
2733 : : | DROP CONSTRAINT name opt_drop_behavior
2734 : : {
7284 tgl@sss.pgh.pa.us 2735 : 473 : AlterTableCmd *n = makeNode(AlterTableCmd);
2736 : :
2737 : 473 : n->subtype = AT_DropConstraint;
2738 : 473 : n->name = $3;
2739 : 473 : n->behavior = $4;
2433 peter_e@gmx.net 2740 : 473 : n->missing_ok = false;
702 peter@eisentraut.org 2741 : 473 : $$ = (Node *) n;
2742 : : }
2743 : : /* ALTER TABLE <name> SET WITHOUT OIDS, for backward compat */
2744 : : | SET WITHOUT OIDS
2745 : : {
7284 tgl@sss.pgh.pa.us 2746 : 3 : AlterTableCmd *n = makeNode(AlterTableCmd);
2747 : :
2748 : 3 : n->subtype = AT_DropOids;
702 peter@eisentraut.org 2749 : 3 : $$ = (Node *) n;
2750 : : }
2751 : : /* ALTER TABLE <name> CLUSTER ON <indexname> */
2752 : : | CLUSTER ON name
2753 : : {
7284 tgl@sss.pgh.pa.us 2754 : 23 : AlterTableCmd *n = makeNode(AlterTableCmd);
2755 : :
2756 : 23 : n->subtype = AT_ClusterOn;
2757 : 23 : n->name = $3;
702 peter@eisentraut.org 2758 : 23 : $$ = (Node *) n;
2759 : : }
2760 : : /* ALTER TABLE <name> SET WITHOUT CLUSTER */
2761 : : | SET WITHOUT CLUSTER
2762 : : {
7256 bruce@momjian.us 2763 : 9 : AlterTableCmd *n = makeNode(AlterTableCmd);
2764 : :
2765 : 9 : n->subtype = AT_DropCluster;
2766 : 9 : n->name = NULL;
702 peter@eisentraut.org 2767 : 9 : $$ = (Node *) n;
2768 : : }
2769 : : /* ALTER TABLE <name> SET LOGGED */
2770 : : | SET LOGGED
2771 : : {
3523 alvherre@alvh.no-ip. 2772 : 19 : AlterTableCmd *n = makeNode(AlterTableCmd);
2773 : :
2774 : 19 : n->subtype = AT_SetLogged;
702 peter@eisentraut.org 2775 : 19 : $$ = (Node *) n;
2776 : : }
2777 : : /* ALTER TABLE <name> SET UNLOGGED */
2778 : : | SET UNLOGGED
2779 : : {
3523 alvherre@alvh.no-ip. 2780 : 25 : AlterTableCmd *n = makeNode(AlterTableCmd);
2781 : :
2782 : 25 : n->subtype = AT_SetUnLogged;
702 peter@eisentraut.org 2783 : 25 : $$ = (Node *) n;
2784 : : }
2785 : : /* ALTER TABLE <name> ENABLE TRIGGER <trig> */
2786 : : | ENABLE_P TRIGGER name
2787 : : {
6809 tgl@sss.pgh.pa.us 2788 : 61 : AlterTableCmd *n = makeNode(AlterTableCmd);
2789 : :
2790 : 61 : n->subtype = AT_EnableTrig;
2791 : 61 : n->name = $3;
702 peter@eisentraut.org 2792 : 61 : $$ = (Node *) n;
2793 : : }
2794 : : /* ALTER TABLE <name> ENABLE ALWAYS TRIGGER <trig> */
2795 : : | ENABLE_P ALWAYS TRIGGER name
2796 : : {
6236 JanWieck@Yahoo.com 2797 : 20 : AlterTableCmd *n = makeNode(AlterTableCmd);
2798 : :
2799 : 20 : n->subtype = AT_EnableAlwaysTrig;
2800 : 20 : n->name = $4;
702 peter@eisentraut.org 2801 : 20 : $$ = (Node *) n;
2802 : : }
2803 : : /* ALTER TABLE <name> ENABLE REPLICA TRIGGER <trig> */
2804 : : | ENABLE_P REPLICA TRIGGER name
2805 : : {
6236 JanWieck@Yahoo.com 2806 : 8 : AlterTableCmd *n = makeNode(AlterTableCmd);
2807 : :
2808 : 8 : n->subtype = AT_EnableReplicaTrig;
2809 : 8 : n->name = $4;
702 peter@eisentraut.org 2810 : 8 : $$ = (Node *) n;
2811 : : }
2812 : : /* ALTER TABLE <name> ENABLE TRIGGER ALL */
2813 : : | ENABLE_P TRIGGER ALL
2814 : : {
6809 tgl@sss.pgh.pa.us 2815 :UBC 0 : AlterTableCmd *n = makeNode(AlterTableCmd);
2816 : :
2817 : 0 : n->subtype = AT_EnableTrigAll;
702 peter@eisentraut.org 2818 : 0 : $$ = (Node *) n;
2819 : : }
2820 : : /* ALTER TABLE <name> ENABLE TRIGGER USER */
2821 : : | ENABLE_P TRIGGER USER
2822 : : {
6809 tgl@sss.pgh.pa.us 2823 : 0 : AlterTableCmd *n = makeNode(AlterTableCmd);
2824 : :
2825 : 0 : n->subtype = AT_EnableTrigUser;
702 peter@eisentraut.org 2826 : 0 : $$ = (Node *) n;
2827 : : }
2828 : : /* ALTER TABLE <name> DISABLE TRIGGER <trig> */
2829 : : | DISABLE_P TRIGGER name
2830 : : {
6809 tgl@sss.pgh.pa.us 2831 :CBC 69 : AlterTableCmd *n = makeNode(AlterTableCmd);
2832 : :
2833 : 69 : n->subtype = AT_DisableTrig;
2834 : 69 : n->name = $3;
702 peter@eisentraut.org 2835 : 69 : $$ = (Node *) n;
2836 : : }
2837 : : /* ALTER TABLE <name> DISABLE TRIGGER ALL */
2838 : : | DISABLE_P TRIGGER ALL
2839 : : {
6809 tgl@sss.pgh.pa.us 2840 : 6 : AlterTableCmd *n = makeNode(AlterTableCmd);
2841 : :
2842 : 6 : n->subtype = AT_DisableTrigAll;
702 peter@eisentraut.org 2843 : 6 : $$ = (Node *) n;
2844 : : }
2845 : : /* ALTER TABLE <name> DISABLE TRIGGER USER */
2846 : : | DISABLE_P TRIGGER USER
2847 : : {
6809 tgl@sss.pgh.pa.us 2848 : 6 : AlterTableCmd *n = makeNode(AlterTableCmd);
2849 : :
2850 : 6 : n->subtype = AT_DisableTrigUser;
702 peter@eisentraut.org 2851 : 6 : $$ = (Node *) n;
2852 : : }
2853 : : /* ALTER TABLE <name> ENABLE RULE <rule> */
2854 : : | ENABLE_P RULE name
2855 : : {
6236 JanWieck@Yahoo.com 2856 : 4 : AlterTableCmd *n = makeNode(AlterTableCmd);
2857 : :
2858 : 4 : n->subtype = AT_EnableRule;
2859 : 4 : n->name = $3;
702 peter@eisentraut.org 2860 : 4 : $$ = (Node *) n;
2861 : : }
2862 : : /* ALTER TABLE <name> ENABLE ALWAYS RULE <rule> */
2863 : : | ENABLE_P ALWAYS RULE name
2864 : : {
6236 JanWieck@Yahoo.com 2865 :UBC 0 : AlterTableCmd *n = makeNode(AlterTableCmd);
2866 : :
2867 : 0 : n->subtype = AT_EnableAlwaysRule;
2868 : 0 : n->name = $4;
702 peter@eisentraut.org 2869 : 0 : $$ = (Node *) n;
2870 : : }
2871 : : /* ALTER TABLE <name> ENABLE REPLICA RULE <rule> */
2872 : : | ENABLE_P REPLICA RULE name
2873 : : {
6236 JanWieck@Yahoo.com 2874 :CBC 3 : AlterTableCmd *n = makeNode(AlterTableCmd);
2875 : :
2876 : 3 : n->subtype = AT_EnableReplicaRule;
2877 : 3 : n->name = $4;
702 peter@eisentraut.org 2878 : 3 : $$ = (Node *) n;
2879 : : }
2880 : : /* ALTER TABLE <name> DISABLE RULE <rule> */
2881 : : | DISABLE_P RULE name
2882 : : {
6236 JanWieck@Yahoo.com 2883 : 16 : AlterTableCmd *n = makeNode(AlterTableCmd);
2884 : :
2885 : 16 : n->subtype = AT_DisableRule;
2886 : 16 : n->name = $3;
702 peter@eisentraut.org 2887 : 16 : $$ = (Node *) n;
2888 : : }
2889 : : /* ALTER TABLE <name> INHERIT <parent> */
2890 : : | INHERIT qualified_name
2891 : : {
6496 bruce@momjian.us 2892 : 163 : AlterTableCmd *n = makeNode(AlterTableCmd);
2893 : :
6393 tgl@sss.pgh.pa.us 2894 : 163 : n->subtype = AT_AddInherit;
2895 : 163 : n->def = (Node *) $2;
702 peter@eisentraut.org 2896 : 163 : $$ = (Node *) n;
2897 : : }
2898 : : /* ALTER TABLE <name> NO INHERIT <parent> */
2899 : : | NO INHERIT qualified_name
2900 : : {
6496 bruce@momjian.us 2901 : 22 : AlterTableCmd *n = makeNode(AlterTableCmd);
2902 : :
6393 tgl@sss.pgh.pa.us 2903 : 22 : n->subtype = AT_DropInherit;
2904 : 22 : n->def = (Node *) $3;
702 peter@eisentraut.org 2905 : 22 : $$ = (Node *) n;
2906 : : }
2907 : : /* ALTER TABLE <name> OF <type_name> */
2908 : : | OF any_name
2909 : : {
4743 rhaas@postgresql.org 2910 : 33 : AlterTableCmd *n = makeNode(AlterTableCmd);
702 peter@eisentraut.org 2911 : 33 : TypeName *def = makeTypeNameFromNameList($2);
2912 : :
4743 rhaas@postgresql.org 2913 : 33 : def->location = @2;
2914 : 33 : n->subtype = AT_AddOf;
2915 : 33 : n->def = (Node *) def;
702 peter@eisentraut.org 2916 : 33 : $$ = (Node *) n;
2917 : : }
2918 : : /* ALTER TABLE <name> NOT OF */
2919 : : | NOT OF
2920 : : {
4743 rhaas@postgresql.org 2921 : 3 : AlterTableCmd *n = makeNode(AlterTableCmd);
2922 : :
2923 : 3 : n->subtype = AT_DropOf;
702 peter@eisentraut.org 2924 : 3 : $$ = (Node *) n;
2925 : : }
2926 : : /* ALTER TABLE <name> OWNER TO RoleSpec */
2927 : : | OWNER TO RoleSpec
2928 : : {
7177 bruce@momjian.us 2929 : 910 : AlterTableCmd *n = makeNode(AlterTableCmd);
2930 : :
2931 : 910 : n->subtype = AT_ChangeOwner;
3324 alvherre@alvh.no-ip. 2932 : 910 : n->newowner = $3;
702 peter@eisentraut.org 2933 : 910 : $$ = (Node *) n;
2934 : : }
2935 : : /* ALTER TABLE <name> SET ACCESS METHOD { <amname> | DEFAULT } */
2936 : : | SET ACCESS METHOD set_access_method_name
2937 : : {
991 michael@paquier.xyz 2938 : 64 : AlterTableCmd *n = makeNode(AlterTableCmd);
2939 : :
2940 : 64 : n->subtype = AT_SetAccessMethod;
2941 : 64 : n->name = $4;
702 peter@eisentraut.org 2942 : 64 : $$ = (Node *) n;
2943 : : }
2944 : : /* ALTER TABLE <name> SET TABLESPACE <tablespacename> */
2945 : : | SET TABLESPACE name
2946 : : {
7217 tgl@sss.pgh.pa.us 2947 : 66 : AlterTableCmd *n = makeNode(AlterTableCmd);
2948 : :
2949 : 66 : n->subtype = AT_SetTableSpace;
2950 : 66 : n->name = $3;
702 peter@eisentraut.org 2951 : 66 : $$ = (Node *) n;
2952 : : }
2953 : : /* ALTER TABLE <name> SET (...) */
2954 : : | SET reloptions
2955 : : {
6496 bruce@momjian.us 2956 : 291 : AlterTableCmd *n = makeNode(AlterTableCmd);
2957 : :
6495 tgl@sss.pgh.pa.us 2958 : 291 : n->subtype = AT_SetRelOptions;
702 peter@eisentraut.org 2959 : 291 : n->def = (Node *) $2;
2960 : 291 : $$ = (Node *) n;
2961 : : }
2962 : : /* ALTER TABLE <name> RESET (...) */
2963 : : | RESET reloptions
2964 : : {
6495 tgl@sss.pgh.pa.us 2965 : 79 : AlterTableCmd *n = makeNode(AlterTableCmd);
2966 : :
2967 : 79 : n->subtype = AT_ResetRelOptions;
702 peter@eisentraut.org 2968 : 79 : n->def = (Node *) $2;
2969 : 79 : $$ = (Node *) n;
2970 : : }
2971 : : /* ALTER TABLE <name> REPLICA IDENTITY */
2972 : : | REPLICA IDENTITY_P replica_identity
2973 : : {
3810 rhaas@postgresql.org 2974 : 215 : AlterTableCmd *n = makeNode(AlterTableCmd);
2975 : :
2976 : 215 : n->subtype = AT_ReplicaIdentity;
2977 : 215 : n->def = $3;
702 peter@eisentraut.org 2978 : 215 : $$ = (Node *) n;
2979 : : }
2980 : : /* ALTER TABLE <name> ENABLE ROW LEVEL SECURITY */
2981 : : | ENABLE_P ROW LEVEL SECURITY
2982 : : {
3495 sfrost@snowman.net 2983 : 139 : AlterTableCmd *n = makeNode(AlterTableCmd);
2984 : :
2985 : 139 : n->subtype = AT_EnableRowSecurity;
702 peter@eisentraut.org 2986 : 139 : $$ = (Node *) n;
2987 : : }
2988 : : /* ALTER TABLE <name> DISABLE ROW LEVEL SECURITY */
2989 : : | DISABLE_P ROW LEVEL SECURITY
2990 : : {
3495 sfrost@snowman.net 2991 : 5 : AlterTableCmd *n = makeNode(AlterTableCmd);
2992 : :
2993 : 5 : n->subtype = AT_DisableRowSecurity;
702 peter@eisentraut.org 2994 : 5 : $$ = (Node *) n;
2995 : : }
2996 : : /* ALTER TABLE <name> FORCE ROW LEVEL SECURITY */
2997 : : | FORCE ROW LEVEL SECURITY
2998 : : {
3115 sfrost@snowman.net 2999 : 41 : AlterTableCmd *n = makeNode(AlterTableCmd);
3000 : :
3001 : 41 : n->subtype = AT_ForceRowSecurity;
702 peter@eisentraut.org 3002 : 41 : $$ = (Node *) n;
3003 : : }
3004 : : /* ALTER TABLE <name> NO FORCE ROW LEVEL SECURITY */
3005 : : | NO FORCE ROW LEVEL SECURITY
3006 : : {
3115 sfrost@snowman.net 3007 : 16 : AlterTableCmd *n = makeNode(AlterTableCmd);
3008 : :
3009 : 16 : n->subtype = AT_NoForceRowSecurity;
702 peter@eisentraut.org 3010 : 16 : $$ = (Node *) n;
3011 : : }
3012 : : | alter_generic_options
3013 : : {
4852 rhaas@postgresql.org 3014 : 28 : AlterTableCmd *n = makeNode(AlterTableCmd);
3015 : :
3016 : 28 : n->subtype = AT_GenericOptions;
702 peter@eisentraut.org 3017 : 28 : n->def = (Node *) $1;
4852 rhaas@postgresql.org 3018 : 28 : $$ = (Node *) n;
3019 : : }
3020 : : ;
3021 : :
3022 : : alter_column_default:
6012 tgl@sss.pgh.pa.us 3023 : 183 : SET DEFAULT a_expr { $$ = $3; }
7284 3024 : 90 : | DROP DEFAULT { $$ = NULL; }
3025 : : ;
3026 : :
3027 : : opt_collate_clause:
3028 : : COLLATE any_name
3029 : : {
4785 3030 : 6 : CollateClause *n = makeNode(CollateClause);
3031 : :
3032 : 6 : n->arg = NULL;
4783 3033 : 6 : n->collname = $2;
4785 3034 : 6 : n->location = @1;
3035 : 6 : $$ = (Node *) n;
3036 : : }
3037 : 2216 : | /* EMPTY */ { $$ = NULL; }
3038 : : ;
3039 : :
3040 : : alter_using:
7284 3041 : 84 : USING a_expr { $$ = $2; }
3042 : 337 : | /* EMPTY */ { $$ = NULL; }
3043 : : ;
3044 : :
3045 : : replica_identity:
3046 : : NOTHING
3047 : : {
3810 rhaas@postgresql.org 3048 : 18 : ReplicaIdentityStmt *n = makeNode(ReplicaIdentityStmt);
3049 : :
3050 : 18 : n->identity_type = REPLICA_IDENTITY_NOTHING;
3051 : 18 : n->name = NULL;
3052 : 18 : $$ = (Node *) n;
3053 : : }
3054 : : | FULL
3055 : : {
3056 : 69 : ReplicaIdentityStmt *n = makeNode(ReplicaIdentityStmt);
3057 : :
3058 : 69 : n->identity_type = REPLICA_IDENTITY_FULL;
3059 : 69 : n->name = NULL;
3060 : 69 : $$ = (Node *) n;
3061 : : }
3062 : : | DEFAULT
3063 : : {
3064 : 3 : ReplicaIdentityStmt *n = makeNode(ReplicaIdentityStmt);
3065 : :
3066 : 3 : n->identity_type = REPLICA_IDENTITY_DEFAULT;
3067 : 3 : n->name = NULL;
3068 : 3 : $$ = (Node *) n;
3069 : : }
3070 : : | USING INDEX name
3071 : : {
3072 : 125 : ReplicaIdentityStmt *n = makeNode(ReplicaIdentityStmt);
3073 : :
3074 : 125 : n->identity_type = REPLICA_IDENTITY_INDEX;
3075 : 125 : n->name = $3;
3076 : 125 : $$ = (Node *) n;
3077 : : }
3078 : : ;
3079 : :
3080 : : reloptions:
4548 peter_e@gmx.net 3081 : 1235 : '(' reloption_list ')' { $$ = $2; }
3082 : : ;
3083 : :
5550 alvherre@alvh.no-ip. 3084 : 446 : opt_reloptions: WITH reloptions { $$ = $2; }
3085 : 9763 : | /* EMPTY */ { $$ = NIL; }
3086 : : ;
3087 : :
3088 : : reloption_list:
3089 : 1235 : reloption_elem { $$ = list_make1($1); }
3090 : 110 : | reloption_list ',' reloption_elem { $$ = lappend($1, $3); }
3091 : : ;
3092 : :
3093 : : /* This should match def_elem and also allow qualified names */
3094 : : reloption_elem:
3095 : : ColLabel '=' def_arg
3096 : : {
2777 peter_e@gmx.net 3097 : 1061 : $$ = makeDefElem($1, (Node *) $3, @1);
3098 : : }
3099 : : | ColLabel
3100 : : {
3101 : 250 : $$ = makeDefElem($1, NULL, @1);
3102 : : }
3103 : : | ColLabel '.' ColLabel '=' def_arg
3104 : : {
5489 tgl@sss.pgh.pa.us 3105 : 31 : $$ = makeDefElemExtended($1, $3, (Node *) $5,
2777 peter_e@gmx.net 3106 : 31 : DEFELEM_UNSPEC, @1);
3107 : : }
3108 : : | ColLabel '.' ColLabel
3109 : : {
3110 : 3 : $$ = makeDefElemExtended($1, $3, NULL, DEFELEM_UNSPEC, @1);
3111 : : }
3112 : : ;
3113 : :
3114 : : alter_identity_column_option_list:
3115 : : alter_identity_column_option
2565 3116 : 31 : { $$ = list_make1($1); }
3117 : : | alter_identity_column_option_list alter_identity_column_option
3118 : 30 : { $$ = lappend($1, $2); }
3119 : : ;
3120 : :
3121 : : alter_identity_column_option:
3122 : : RESTART
3123 : : {
3124 : 12 : $$ = makeDefElem("restart", NULL, @1);
3125 : : }
3126 : : | RESTART opt_with NumericOnly
3127 : : {
702 peter@eisentraut.org 3128 :UBC 0 : $$ = makeDefElem("restart", (Node *) $3, @1);
3129 : : }
3130 : : | SET SeqOptElem
3131 : : {
2565 peter_e@gmx.net 3132 [ + - ]:CBC 27 : if (strcmp($2->defname, "as") == 0 ||
3133 [ + - ]: 27 : strcmp($2->defname, "restart") == 0 ||
3134 [ - + ]: 27 : strcmp($2->defname, "owned_by") == 0)
2565 peter_e@gmx.net 3135 [ # # ]:UBC 0 : ereport(ERROR,
3136 : : (errcode(ERRCODE_SYNTAX_ERROR),
3137 : : errmsg("sequence option \"%s\" not supported here", $2->defname),
3138 : : parser_errposition(@2)));
2565 peter_e@gmx.net 3139 :CBC 27 : $$ = $2;
3140 : : }
3141 : : | SET GENERATED generated_when
3142 : : {
3143 : 22 : $$ = makeDefElem("generated", (Node *) makeInteger($3), @1);
3144 : : }
3145 : : ;
3146 : :
3147 : : set_statistics_value:
92 peter@eisentraut.org 3148 :GNC 79 : SignedIconst { $$ = (Node *) makeInteger($1); }
92 peter@eisentraut.org 3149 :UNC 0 : | DEFAULT { $$ = NULL; }
3150 : : ;
3151 : :
3152 : : set_access_method_name:
37 michael@paquier.xyz 3153 :GNC 46 : ColId { $$ = $1; }
3154 : 18 : | DEFAULT { $$ = NULL; }
3155 : : ;
3156 : :
3157 : : PartitionBoundSpec:
3158 : : /* a HASH partition */
3159 : : FOR VALUES WITH '(' hash_partbound ')'
3160 : : {
3161 : : ListCell *lc;
2348 rhaas@postgresql.org 3162 :CBC 349 : PartitionBoundSpec *n = makeNode(PartitionBoundSpec);
3163 : :
3164 : 349 : n->strategy = PARTITION_STRATEGY_HASH;
3165 : 349 : n->modulus = n->remainder = -1;
3166 : :
3167 [ + - + + : 1047 : foreach (lc, $5)
+ + ]
3168 : : {
3169 : 698 : DefElem *opt = lfirst_node(DefElem, lc);
3170 : :
3171 [ + + ]: 698 : if (strcmp(opt->defname, "modulus") == 0)
3172 : : {
3173 [ - + ]: 349 : if (n->modulus != -1)
2348 rhaas@postgresql.org 3174 [ # # ]:UBC 0 : ereport(ERROR,
3175 : : (errcode(ERRCODE_DUPLICATE_OBJECT),
3176 : : errmsg("modulus for hash partition provided more than once"),
3177 : : parser_errposition(opt->location)));
2348 rhaas@postgresql.org 3178 :CBC 349 : n->modulus = defGetInt32(opt);
3179 : : }
3180 [ + - ]: 349 : else if (strcmp(opt->defname, "remainder") == 0)
3181 : : {
3182 [ - + ]: 349 : if (n->remainder != -1)
2348 rhaas@postgresql.org 3183 [ # # ]:UBC 0 : ereport(ERROR,
3184 : : (errcode(ERRCODE_DUPLICATE_OBJECT),
3185 : : errmsg("remainder for hash partition provided more than once"),
3186 : : parser_errposition(opt->location)));
2348 rhaas@postgresql.org 3187 :CBC 349 : n->remainder = defGetInt32(opt);
3188 : : }
3189 : : else
2348 rhaas@postgresql.org 3190 [ # # ]:UBC 0 : ereport(ERROR,
3191 : : (errcode(ERRCODE_SYNTAX_ERROR),
3192 : : errmsg("unrecognized hash partition bound specification \"%s\"",
3193 : : opt->defname),
3194 : : parser_errposition(opt->location)));
3195 : : }
3196 : :
2348 rhaas@postgresql.org 3197 [ - + ]:CBC 349 : if (n->modulus == -1)
2348 rhaas@postgresql.org 3198 [ # # ]:UBC 0 : ereport(ERROR,
3199 : : (errcode(ERRCODE_SYNTAX_ERROR),
3200 : : errmsg("modulus for hash partition must be specified")));
2348 rhaas@postgresql.org 3201 [ - + ]:CBC 349 : if (n->remainder == -1)
2348 rhaas@postgresql.org 3202 [ # # ]:UBC 0 : ereport(ERROR,
3203 : : (errcode(ERRCODE_SYNTAX_ERROR),
3204 : : errmsg("remainder for hash partition must be specified")));
3205 : :
2348 rhaas@postgresql.org 3206 :CBC 349 : n->location = @3;
3207 : :
3208 : 349 : $$ = n;
3209 : : }
3210 : :
3211 : : /* a LIST partition */
3212 : : | FOR VALUES IN_P '(' expr_list ')'
3213 : : {
2685 3214 : 2380 : PartitionBoundSpec *n = makeNode(PartitionBoundSpec);
3215 : :
3216 : 2380 : n->strategy = PARTITION_STRATEGY_LIST;
2410 3217 : 2380 : n->is_default = false;
2685 3218 : 2380 : n->listdatums = $5;
3219 : 2380 : n->location = @3;
3220 : :
2513 tgl@sss.pgh.pa.us 3221 : 2380 : $$ = n;
3222 : : }
3223 : :
3224 : : /* a RANGE partition */
3225 : : | FOR VALUES FROM '(' expr_list ')' TO '(' expr_list ')'
3226 : : {
2685 rhaas@postgresql.org 3227 : 2513 : PartitionBoundSpec *n = makeNode(PartitionBoundSpec);
3228 : :
3229 : 2513 : n->strategy = PARTITION_STRATEGY_RANGE;
2410 3230 : 2513 : n->is_default = false;
2685 3231 : 2513 : n->lowerdatums = $5;
3232 : 2513 : n->upperdatums = $9;
3233 : 2513 : n->location = @3;
3234 : :
2410 3235 : 2513 : $$ = n;
3236 : : }
3237 : :
3238 : : /* a DEFAULT partition */
3239 : : | DEFAULT
3240 : : {
3241 : 397 : PartitionBoundSpec *n = makeNode(PartitionBoundSpec);
3242 : :
3243 : 397 : n->is_default = true;
3244 : 397 : n->location = @1;
3245 : :
2513 tgl@sss.pgh.pa.us 3246 : 397 : $$ = n;
3247 : : }
3248 : : ;
3249 : :
3250 : : hash_partbound_elem:
3251 : : NonReservedWord Iconst
3252 : : {
702 peter@eisentraut.org 3253 : 698 : $$ = makeDefElem($1, (Node *) makeInteger($2), @1);
3254 : : }
3255 : : ;
3256 : :
3257 : : hash_partbound:
3258 : : hash_partbound_elem
3259 : : {
2348 rhaas@postgresql.org 3260 : 349 : $$ = list_make1($1);
3261 : : }
3262 : : | hash_partbound ',' hash_partbound_elem
3263 : : {
3264 : 349 : $$ = lappend($1, $3);
3265 : : }
3266 : : ;
3267 : :
3268 : : /*****************************************************************************
3269 : : *
3270 : : * ALTER TYPE
3271 : : *
3272 : : * really variants of the ALTER TABLE subcommands with different spellings
3273 : : *****************************************************************************/
3274 : :
3275 : : AlterCompositeTypeStmt:
3276 : : ALTER TYPE_P any_name alter_type_cmds
3277 : : {
4949 peter_e@gmx.net 3278 : 104 : AlterTableStmt *n = makeNode(AlterTableStmt);
3279 : :
3280 : : /* can't use qualified_name, sigh */
3281 : 104 : n->relation = makeRangeVarFromAnyName($3, @3, yyscanner);
3282 : 104 : n->cmds = $4;
1373 michael@paquier.xyz 3283 : 104 : n->objtype = OBJECT_TYPE;
702 peter@eisentraut.org 3284 : 104 : $$ = (Node *) n;
3285 : : }
3286 : : ;
3287 : :
3288 : : alter_type_cmds:
4949 peter_e@gmx.net 3289 : 104 : alter_type_cmd { $$ = list_make1($1); }
3290 : 6 : | alter_type_cmds ',' alter_type_cmd { $$ = lappend($1, $3); }
3291 : : ;
3292 : :
3293 : : alter_type_cmd:
3294 : : /* ALTER TYPE <name> ADD ATTRIBUTE <coldef> [RESTRICT|CASCADE] */
3295 : : ADD_P ATTRIBUTE TableFuncElement opt_drop_behavior
3296 : : {
3297 : 32 : AlterTableCmd *n = makeNode(AlterTableCmd);
3298 : :
3299 : 32 : n->subtype = AT_AddColumn;
3300 : 32 : n->def = $3;
4891 3301 : 32 : n->behavior = $4;
702 peter@eisentraut.org 3302 : 32 : $$ = (Node *) n;
3303 : : }
3304 : : /* ALTER TYPE <name> DROP ATTRIBUTE IF EXISTS <attname> [RESTRICT|CASCADE] */
3305 : : | DROP ATTRIBUTE IF_P EXISTS ColId opt_drop_behavior
3306 : : {
4949 peter_e@gmx.net 3307 : 3 : AlterTableCmd *n = makeNode(AlterTableCmd);
3308 : :
3309 : 3 : n->subtype = AT_DropColumn;
3310 : 3 : n->name = $5;
4891 3311 : 3 : n->behavior = $6;
2433 3312 : 3 : n->missing_ok = true;
702 peter@eisentraut.org 3313 : 3 : $$ = (Node *) n;
3314 : : }
3315 : : /* ALTER TYPE <name> DROP ATTRIBUTE <attname> [RESTRICT|CASCADE] */
3316 : : | DROP ATTRIBUTE ColId opt_drop_behavior
3317 : : {
4949 peter_e@gmx.net 3318 : 38 : AlterTableCmd *n = makeNode(AlterTableCmd);
3319 : :
3320 : 38 : n->subtype = AT_DropColumn;
3321 : 38 : n->name = $3;
4891 3322 : 38 : n->behavior = $4;
2433 3323 : 38 : n->missing_ok = false;
702 peter@eisentraut.org 3324 : 38 : $$ = (Node *) n;
3325 : : }
3326 : : /* ALTER TYPE <name> ALTER ATTRIBUTE <attname> [SET DATA] TYPE <typename> [RESTRICT|CASCADE] */
3327 : : | ALTER ATTRIBUTE ColId opt_set_data TYPE_P Typename opt_collate_clause opt_drop_behavior
3328 : : {
4949 peter_e@gmx.net 3329 : 37 : AlterTableCmd *n = makeNode(AlterTableCmd);
4785 tgl@sss.pgh.pa.us 3330 : 37 : ColumnDef *def = makeNode(ColumnDef);
3331 : :
4949 peter_e@gmx.net 3332 : 37 : n->subtype = AT_AlterColumnType;
3333 : 37 : n->name = $3;
4785 tgl@sss.pgh.pa.us 3334 : 37 : n->def = (Node *) def;
3335 : 37 : n->behavior = $8;
3336 : : /* We only use these fields of the ColumnDef node */
3337 : 37 : def->typeName = $6;
3338 : 37 : def->collClause = (CollateClause *) $7;
3339 : 37 : def->raw_default = NULL;
3797 3340 : 37 : def->location = @3;
702 peter@eisentraut.org 3341 : 37 : $$ = (Node *) n;
3342 : : }
3343 : : ;
3344 : :
3345 : :
3346 : : /*****************************************************************************
3347 : : *
3348 : : * QUERY :
3349 : : * close <portalname>
3350 : : *
3351 : : *****************************************************************************/
3352 : :
3353 : : ClosePortalStmt:
3354 : : CLOSE cursor_name
3355 : : {
9715 bruce@momjian.us 3356 : 1023 : ClosePortalStmt *n = makeNode(ClosePortalStmt);
3357 : :
3358 : 1023 : n->portalname = $2;
702 peter@eisentraut.org 3359 : 1023 : $$ = (Node *) n;
3360 : : }
3361 : : | CLOSE ALL
3362 : : {
6212 neilc@samurai.com 3363 : 6 : ClosePortalStmt *n = makeNode(ClosePortalStmt);
3364 : :
3365 : 6 : n->portalname = NULL;
702 peter@eisentraut.org 3366 : 6 : $$ = (Node *) n;
3367 : : }
3368 : : ;
3369 : :
3370 : :
3371 : : /*****************************************************************************
3372 : : *
3373 : : * QUERY :
3374 : : * COPY relname [(columnList)] FROM/TO file [WITH] [(options)]
3375 : : * COPY ( query ) TO file [WITH] [(options)]
3376 : : *
3377 : : * where 'query' can be one of:
3378 : : * { SELECT | UPDATE | INSERT | DELETE }
3379 : : *
3380 : : * and 'file' can be one of:
3381 : : * { PROGRAM 'command' | STDIN | STDOUT | 'filename' }
3382 : : *
3383 : : * In the preferred syntax the options are comma-separated
3384 : : * and use generic identifiers instead of keywords. The pre-9.0
3385 : : * syntax had a hard-wired, space-separated set of options.
3386 : : *
3387 : : * Really old syntax, from versions 7.2 and prior:
3388 : : * COPY [ BINARY ] table FROM/TO file
3389 : : * [ [ USING ] DELIMITERS 'delimiter' ] ]
3390 : : * [ WITH NULL AS 'null string' ]
3391 : : * This option placement is not supported with COPY (query...).
3392 : : *
3393 : : *****************************************************************************/
3394 : :
3395 : : CopyStmt: COPY opt_binary qualified_name opt_column_list
3396 : : copy_from opt_program copy_file_name copy_delimiter opt_with
3397 : : copy_options where_clause
3398 : : {
9715 bruce@momjian.us 3399 : 4648 : CopyStmt *n = makeNode(CopyStmt);
3400 : :
8060 tgl@sss.pgh.pa.us 3401 : 4648 : n->relation = $3;
6437 3402 : 4648 : n->query = NULL;
7941 bruce@momjian.us 3403 : 4648 : n->attlist = $4;
1972 andres@anarazel.de 3404 : 4648 : n->is_from = $5;
3405 : 4648 : n->is_program = $6;
3406 : 4648 : n->filename = $7;
1912 tomas.vondra@postgre 3407 : 4648 : n->whereClause = $11;
3408 : :
4064 heikki.linnakangas@i 3409 [ - + - - ]: 4648 : if (n->is_program && n->filename == NULL)
4064 heikki.linnakangas@i 3410 [ # # ]:UBC 0 : ereport(ERROR,
3411 : : (errcode(ERRCODE_SYNTAX_ERROR),
3412 : : errmsg("STDIN/STDOUT not allowed with PROGRAM"),
3413 : : parser_errposition(@8)));
3414 : :
1912 tomas.vondra@postgre 3415 [ + + + + ]:CBC 4648 : if (!n->is_from && n->whereClause != NULL)
3416 [ + - ]: 3 : ereport(ERROR,
3417 : : (errcode(ERRCODE_SYNTAX_ERROR),
3418 : : errmsg("WHERE clause not allowed with COPY TO"),
3419 : : parser_errposition(@11)));
3420 : :
7969 bruce@momjian.us 3421 : 4645 : n->options = NIL;
3422 : : /* Concatenate user-supplied flags */
3423 [ + + ]: 4645 : if ($2)
3424 : 6 : n->options = lappend(n->options, $2);
1972 andres@anarazel.de 3425 [ - + ]: 4645 : if ($8)
1972 andres@anarazel.de 3426 :UBC 0 : n->options = lappend(n->options, $8);
1972 andres@anarazel.de 3427 [ + + ]:CBC 4645 : if ($10)
3428 : 420 : n->options = list_concat(n->options, $10);
702 peter@eisentraut.org 3429 : 4645 : $$ = (Node *) n;
3430 : : }
3431 : : | COPY '(' PreparableStmt ')' TO opt_program copy_file_name opt_with copy_options
3432 : : {
6437 tgl@sss.pgh.pa.us 3433 : 201 : CopyStmt *n = makeNode(CopyStmt);
3434 : :
3435 : 201 : n->relation = NULL;
3061 teodor@sigaev.ru 3436 : 201 : n->query = $3;
6437 tgl@sss.pgh.pa.us 3437 : 201 : n->attlist = NIL;
3438 : 201 : n->is_from = false;
3061 teodor@sigaev.ru 3439 : 201 : n->is_program = $6;
3440 : 201 : n->filename = $7;
3441 : 201 : n->options = $9;
3442 : :
4064 heikki.linnakangas@i 3443 [ - + - - ]: 201 : if (n->is_program && n->filename == NULL)
4064 heikki.linnakangas@i 3444 [ # # ]:UBC 0 : ereport(ERROR,
3445 : : (errcode(ERRCODE_SYNTAX_ERROR),
3446 : : errmsg("STDIN/STDOUT not allowed with PROGRAM"),
3447 : : parser_errposition(@5)));
3448 : :
702 peter@eisentraut.org 3449 :CBC 201 : $$ = (Node *) n;
3450 : : }
3451 : : ;
3452 : :
3453 : : copy_from:
2433 peter_e@gmx.net 3454 : 777 : FROM { $$ = true; }
3455 : 3871 : | TO { $$ = false; }
3456 : : ;
3457 : :
3458 : : opt_program:
2433 peter_e@gmx.net 3459 :UBC 0 : PROGRAM { $$ = true; }
2433 peter_e@gmx.net 3460 :CBC 4849 : | /* EMPTY */ { $$ = false; }
3461 : : ;
3462 : :
3463 : : /*
3464 : : * copy_file_name NULL indicates stdio is used. Whether stdin or stdout is
3465 : : * used depends on the direction. (It really doesn't make sense to copy from
3466 : : * stdout. We silently correct the "typo".) - AY 9/94
3467 : : */
3468 : : copy_file_name:
7972 bruce@momjian.us 3469 : 206 : Sconst { $$ = $1; }
3470 : 609 : | STDIN { $$ = NULL; }
3471 : 4034 : | STDOUT { $$ = NULL; }
3472 : : ;
3473 : :
5319 tgl@sss.pgh.pa.us 3474 : 4590 : copy_options: copy_opt_list { $$ = $1; }
3475 : 259 : | '(' copy_generic_opt_list ')' { $$ = $2; }
3476 : : ;
3477 : :
3478 : : /* old COPY option syntax */
3479 : : copy_opt_list:
7969 bruce@momjian.us 3480 : 266 : copy_opt_list copy_opt_item { $$ = lappend($1, $2); }
3481 : 4590 : | /* EMPTY */ { $$ = NIL; }
3482 : : ;
3483 : :
3484 : : copy_opt_item:
3485 : : BINARY
3486 : : {
702 peter@eisentraut.org 3487 :UBC 0 : $$ = makeDefElem("format", (Node *) makeString("binary"), @1);
3488 : : }
3489 : : | FREEZE
3490 : : {
702 peter@eisentraut.org 3491 :CBC 25 : $$ = makeDefElem("freeze", (Node *) makeBoolean(true), @1);
3492 : : }
3493 : : | DELIMITER opt_as Sconst
3494 : : {
3495 : 103 : $$ = makeDefElem("delimiter", (Node *) makeString($3), @1);
3496 : : }
3497 : : | NULL_P opt_as Sconst
3498 : : {
3499 : 24 : $$ = makeDefElem("null", (Node *) makeString($3), @1);
3500 : : }
3501 : : | CSV
3502 : : {
3503 : 72 : $$ = makeDefElem("format", (Node *) makeString("csv"), @1);
3504 : : }
3505 : : | HEADER_P
3506 : : {
3507 : 9 : $$ = makeDefElem("header", (Node *) makeBoolean(true), @1);
3508 : : }
3509 : : | QUOTE opt_as Sconst
3510 : : {
3511 : 9 : $$ = makeDefElem("quote", (Node *) makeString($3), @1);
3512 : : }
3513 : : | ESCAPE opt_as Sconst
3514 : : {
3515 : 9 : $$ = makeDefElem("escape", (Node *) makeString($3), @1);
3516 : : }
3517 : : | FORCE QUOTE columnList
3518 : : {
3519 : 6 : $$ = makeDefElem("force_quote", (Node *) $3, @1);
3520 : : }
3521 : : | FORCE QUOTE '*'
3522 : : {
3523 : 3 : $$ = makeDefElem("force_quote", (Node *) makeNode(A_Star), @1);
3524 : : }
3525 : : | FORCE NOT NULL_P columnList
3526 : : {
702 peter@eisentraut.org 3527 :UBC 0 : $$ = makeDefElem("force_not_null", (Node *) $4, @1);
3528 : : }
3529 : : | FORCE NOT NULL_P '*'
3530 : : {
197 andrew@dunslane.net 3531 :UNC 0 : $$ = makeDefElem("force_not_null", (Node *) makeNode(A_Star), @1);
3532 : : }
3533 : : | FORCE NULL_P columnList
3534 : : {
702 peter@eisentraut.org 3535 :UBC 0 : $$ = makeDefElem("force_null", (Node *) $3, @1);
3536 : : }
3537 : : | FORCE NULL_P '*'
3538 : : {
197 andrew@dunslane.net 3539 :UNC 0 : $$ = makeDefElem("force_null", (Node *) makeNode(A_Star), @1);
3540 : : }
3541 : : | ENCODING Sconst
3542 : : {
702 peter@eisentraut.org 3543 :CBC 6 : $$ = makeDefElem("encoding", (Node *) makeString($2), @1);
3544 : : }
3545 : : ;
3546 : :
3547 : : /* The following exist for backward compatibility with very old versions */
3548 : :
3549 : : opt_binary:
3550 : : BINARY
3551 : : {
3552 : 6 : $$ = makeDefElem("format", (Node *) makeString("binary"), @1);
3553 : : }
7969 bruce@momjian.us 3554 : 4642 : | /*EMPTY*/ { $$ = NULL; }
3555 : : ;
3556 : :
3557 : : copy_delimiter:
3558 : : opt_using DELIMITERS Sconst
3559 : : {
702 peter@eisentraut.org 3560 :UBC 0 : $$ = makeDefElem("delimiter", (Node *) makeString($3), @2);
3561 : : }
7969 bruce@momjian.us 3562 :CBC 4648 : | /*EMPTY*/ { $$ = NULL; }
3563 : : ;
3564 : :
3565 : : opt_using:
3566 : : USING
3567 : : | /*EMPTY*/
3568 : : ;
3569 : :
3570 : : /* new COPY option syntax */
3571 : : copy_generic_opt_list:
3572 : : copy_generic_opt_elem
3573 : : {
5319 tgl@sss.pgh.pa.us 3574 : 259 : $$ = list_make1($1);
3575 : : }
3576 : : | copy_generic_opt_list ',' copy_generic_opt_elem
3577 : : {
3578 : 183 : $$ = lappend($1, $3);
3579 : : }
3580 : : ;
3581 : :
3582 : : copy_generic_opt_elem:
3583 : : ColLabel copy_generic_opt_arg
3584 : : {
2777 peter_e@gmx.net 3585 : 442 : $$ = makeDefElem($1, $2, @1);
3586 : : }
3587 : : ;
3588 : :
3589 : : copy_generic_opt_arg:
4923 heikki.linnakangas@i 3590 : 328 : opt_boolean_or_string { $$ = (Node *) makeString($1); }
5319 tgl@sss.pgh.pa.us 3591 :UBC 0 : | NumericOnly { $$ = (Node *) $1; }
5319 tgl@sss.pgh.pa.us 3592 :CBC 27 : | '*' { $$ = (Node *) makeNode(A_Star); }
13 msawada@postgresql.o 3593 :GNC 3 : | DEFAULT { $$ = (Node *) makeString("default"); }
5319 tgl@sss.pgh.pa.us 3594 :CBC 75 : | '(' copy_generic_opt_arg_list ')' { $$ = (Node *) $2; }
3595 : 9 : | /* EMPTY */ { $$ = NULL; }
3596 : : ;
3597 : :
3598 : : copy_generic_opt_arg_list:
3599 : : copy_generic_opt_arg_list_item
3600 : : {
3601 : 75 : $$ = list_make1($1);
3602 : : }
3603 : : | copy_generic_opt_arg_list ',' copy_generic_opt_arg_list_item
3604 : : {
3605 : 6 : $$ = lappend($1, $3);
3606 : : }
3607 : : ;
3608 : :
3609 : : /* beware of emitting non-string list elements here; see commands/define.c */
3610 : : copy_generic_opt_arg_list_item:
4923 heikki.linnakangas@i 3611 : 81 : opt_boolean_or_string { $$ = (Node *) makeString($1); }
3612 : : ;
3613 : :
3614 : :
3615 : : /*****************************************************************************
3616 : : *
3617 : : * QUERY :
3618 : : * CREATE TABLE relname
3619 : : *
3620 : : *****************************************************************************/
3621 : :
3622 : : CreateStmt: CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')'
3623 : : OptInherit OptPartitionSpec table_access_method_clause OptWith
3624 : : OnCommitOption OptTableSpace
3625 : : {
9715 bruce@momjian.us 3626 : 13414 : CreateStmt *n = makeNode(CreateStmt);
3627 : :
4871 rhaas@postgresql.org 3628 : 13414 : $4->relpersistence = $2;
8060 tgl@sss.pgh.pa.us 3629 : 13414 : n->relation = $4;
8500 3630 : 13414 : n->tableElts = $6;
8060 3631 : 13414 : n->inhRelations = $8;
2685 rhaas@postgresql.org 3632 : 13414 : n->partspec = $9;
3311 tgl@sss.pgh.pa.us 3633 : 13414 : n->ofTypename = NULL;
9628 lockhart@fourpalms.o 3634 : 13414 : n->constraints = NIL;
1866 andres@anarazel.de 3635 : 13414 : n->accessMethod = $10;
3636 : 13414 : n->options = $11;
3637 : 13414 : n->oncommit = $12;
3638 : 13414 : n->tablespacename = $13;
5012 rhaas@postgresql.org 3639 : 13414 : n->if_not_exists = false;
702 peter@eisentraut.org 3640 : 13414 : $$ = (Node *) n;
3641 : : }
3642 : : | CREATE OptTemp TABLE IF_P NOT EXISTS qualified_name '('
3643 : : OptTableElementList ')' OptInherit OptPartitionSpec table_access_method_clause
3644 : : OptWith OnCommitOption OptTableSpace
3645 : : {
5012 rhaas@postgresql.org 3646 : 14 : CreateStmt *n = makeNode(CreateStmt);
3647 : :
4871 3648 : 14 : $7->relpersistence = $2;
5012 3649 : 14 : n->relation = $7;
3650 : 14 : n->tableElts = $9;
3651 : 14 : n->inhRelations = $11;
2685 3652 : 14 : n->partspec = $12;
3311 tgl@sss.pgh.pa.us 3653 : 14 : n->ofTypename = NULL;
5012 rhaas@postgresql.org 3654 : 14 : n->constraints = NIL;
1866 andres@anarazel.de 3655 : 14 : n->accessMethod = $13;
3656 : 14 : n->options = $14;
3657 : 14 : n->oncommit = $15;
3658 : 14 : n->tablespacename = $16;
5012 rhaas@postgresql.org 3659 : 14 : n->if_not_exists = true;
702 peter@eisentraut.org 3660 : 14 : $$ = (Node *) n;
3661 : : }
3662 : : | CREATE OptTemp TABLE qualified_name OF any_name
3663 : : OptTypedTableElementList OptPartitionSpec table_access_method_clause
3664 : : OptWith OnCommitOption OptTableSpace
3665 : : {
7924 lockhart@fourpalms.o 3666 : 55 : CreateStmt *n = makeNode(CreateStmt);
3667 : :
4871 rhaas@postgresql.org 3668 : 55 : $4->relpersistence = $2;
7924 lockhart@fourpalms.o 3669 : 55 : n->relation = $4;
5190 peter_e@gmx.net 3670 : 55 : n->tableElts = $7;
3311 tgl@sss.pgh.pa.us 3671 : 55 : n->inhRelations = NIL;
2685 rhaas@postgresql.org 3672 : 55 : n->partspec = $8;
5190 peter_e@gmx.net 3673 : 55 : n->ofTypename = makeTypeNameFromNameList($6);
3674 : 55 : n->ofTypename->location = @6;
7924 lockhart@fourpalms.o 3675 : 55 : n->constraints = NIL;
1866 andres@anarazel.de 3676 : 55 : n->accessMethod = $9;
3677 : 55 : n->options = $10;
3678 : 55 : n->oncommit = $11;
3679 : 55 : n->tablespacename = $12;
5012 rhaas@postgresql.org 3680 : 55 : n->if_not_exists = false;
702 peter@eisentraut.org 3681 : 55 : $$ = (Node *) n;
3682 : : }
3683 : : | CREATE OptTemp TABLE IF_P NOT EXISTS qualified_name OF any_name
3684 : : OptTypedTableElementList OptPartitionSpec table_access_method_clause
3685 : : OptWith OnCommitOption OptTableSpace
3686 : : {
5012 rhaas@postgresql.org 3687 : 3 : CreateStmt *n = makeNode(CreateStmt);
3688 : :
4871 3689 : 3 : $7->relpersistence = $2;
5012 3690 : 3 : n->relation = $7;
3691 : 3 : n->tableElts = $10;
3311 tgl@sss.pgh.pa.us 3692 : 3 : n->inhRelations = NIL;
2685 rhaas@postgresql.org 3693 : 3 : n->partspec = $11;
5012 3694 : 3 : n->ofTypename = makeTypeNameFromNameList($9);
3695 : 3 : n->ofTypename->location = @9;
3696 : 3 : n->constraints = NIL;
1866 andres@anarazel.de 3697 : 3 : n->accessMethod = $12;
3698 : 3 : n->options = $13;
3699 : 3 : n->oncommit = $14;
3700 : 3 : n->tablespacename = $15;
2685 rhaas@postgresql.org 3701 : 3 : n->if_not_exists = true;
702 peter@eisentraut.org 3702 : 3 : $$ = (Node *) n;
3703 : : }
3704 : : | CREATE OptTemp TABLE qualified_name PARTITION OF qualified_name
3705 : : OptTypedTableElementList PartitionBoundSpec OptPartitionSpec
3706 : : table_access_method_clause OptWith OnCommitOption OptTableSpace
3707 : : {
2685 rhaas@postgresql.org 3708 : 4101 : CreateStmt *n = makeNode(CreateStmt);
3709 : :
3710 : 4101 : $4->relpersistence = $2;
3711 : 4101 : n->relation = $4;
3712 : 4101 : n->tableElts = $8;
3713 : 4101 : n->inhRelations = list_make1($7);
2513 tgl@sss.pgh.pa.us 3714 : 4101 : n->partbound = $9;
2685 rhaas@postgresql.org 3715 : 4101 : n->partspec = $10;
3716 : 4101 : n->ofTypename = NULL;
3717 : 4101 : n->constraints = NIL;
1866 andres@anarazel.de 3718 : 4101 : n->accessMethod = $11;
3719 : 4101 : n->options = $12;
3720 : 4101 : n->oncommit = $13;
3721 : 4101 : n->tablespacename = $14;
2685 rhaas@postgresql.org 3722 : 4101 : n->if_not_exists = false;
702 peter@eisentraut.org 3723 : 4101 : $$ = (Node *) n;
3724 : : }
3725 : : | CREATE OptTemp TABLE IF_P NOT EXISTS qualified_name PARTITION OF
3726 : : qualified_name OptTypedTableElementList PartitionBoundSpec OptPartitionSpec
3727 : : table_access_method_clause OptWith OnCommitOption OptTableSpace
3728 : : {
2685 rhaas@postgresql.org 3729 :UBC 0 : CreateStmt *n = makeNode(CreateStmt);
3730 : :
3731 : 0 : $7->relpersistence = $2;
3732 : 0 : n->relation = $7;
3733 : 0 : n->tableElts = $11;
3734 : 0 : n->inhRelations = list_make1($10);
2513 tgl@sss.pgh.pa.us 3735 : 0 : n->partbound = $12;
2685 rhaas@postgresql.org 3736 : 0 : n->partspec = $13;
3737 : 0 : n->ofTypename = NULL;
3738 : 0 : n->constraints = NIL;
1866 andres@anarazel.de 3739 : 0 : n->accessMethod = $14;
3740 : 0 : n->options = $15;
3741 : 0 : n->oncommit = $16;
3742 : 0 : n->tablespacename = $17;
5012 rhaas@postgresql.org 3743 : 0 : n->if_not_exists = true;
702 peter@eisentraut.org 3744 : 0 : $$ = (Node *) n;
3745 : : }
3746 : : ;
3747 : :
3748 : : /*
3749 : : * Redundancy here is needed to avoid shift/reduce conflicts,
3750 : : * since TEMP is not a reserved word. See also OptTempTableName.
3751 : : *
3752 : : * NOTE: we accept both GLOBAL and LOCAL options. They currently do nothing,
3753 : : * but future versions might consider GLOBAL to request SQL-spec-compliant
3754 : : * temp table behavior, so warn about that. Since we have no modules the
3755 : : * LOCAL keyword is really meaningless; furthermore, some other products
3756 : : * implement LOCAL as meaning the same as our default temp table behavior,
3757 : : * so we'll probably continue to treat LOCAL as a noise word.
3758 : : */
4871 rhaas@postgresql.org 3759 :CBC 147 : OptTemp: TEMPORARY { $$ = RELPERSISTENCE_TEMP; }
3760 : 1296 : | TEMP { $$ = RELPERSISTENCE_TEMP; }
4326 simon@2ndQuadrant.co 3761 :UBC 0 : | LOCAL TEMPORARY { $$ = RELPERSISTENCE_TEMP; }
3762 : 0 : | LOCAL TEMP { $$ = RELPERSISTENCE_TEMP; }
3763 : : | GLOBAL TEMPORARY
3764 : : {
4323 tgl@sss.pgh.pa.us 3765 [ # # ]: 0 : ereport(WARNING,
3766 : : (errmsg("GLOBAL is deprecated in temporary table creation"),
3767 : : parser_errposition(@1)));
3768 : 0 : $$ = RELPERSISTENCE_TEMP;
3769 : : }
3770 : : | GLOBAL TEMP
3771 : : {
3772 [ # # ]: 0 : ereport(WARNING,
3773 : : (errmsg("GLOBAL is deprecated in temporary table creation"),
3774 : : parser_errposition(@1)));
3775 : 0 : $$ = RELPERSISTENCE_TEMP;
3776 : : }
4855 rhaas@postgresql.org 3777 :CBC 76 : | UNLOGGED { $$ = RELPERSISTENCE_UNLOGGED; }
4871 3778 : 23764 : | /*EMPTY*/ { $$ = RELPERSISTENCE_PERMANENT; }
3779 : : ;
3780 : :
3781 : : OptTableElementList:
7923 tgl@sss.pgh.pa.us 3782 : 12945 : TableElementList { $$ = $1; }
3783 : 684 : | /*EMPTY*/ { $$ = NIL; }
3784 : : ;
3785 : :
3786 : : OptTypedTableElementList:
5190 peter_e@gmx.net 3787 : 151 : '(' TypedTableElementList ')' { $$ = $2; }
3788 : 4056 : | /*EMPTY*/ { $$ = NIL; }
3789 : : ;
3790 : :
3791 : : TableElementList:
3792 : : TableElement
3793 : : {
7259 neilc@samurai.com 3794 : 12969 : $$ = list_make1($1);
3795 : : }
3796 : : | TableElementList ',' TableElement
3797 : : {
7899 tgl@sss.pgh.pa.us 3798 : 18892 : $$ = lappend($1, $3);
3799 : : }
3800 : : ;
3801 : :
3802 : : TypedTableElementList:
3803 : : TypedTableElement
3804 : : {
5190 peter_e@gmx.net 3805 : 151 : $$ = list_make1($1);
3806 : : }
3807 : : | TypedTableElementList ',' TypedTableElement
3808 : : {
3809 : 34 : $$ = lappend($1, $3);
3810 : : }
3811 : : ;
3812 : :
3813 : : TableElement:
7972 bruce@momjian.us 3814 : 30324 : columnDef { $$ = $1; }
7967 lockhart@fourpalms.o 3815 : 363 : | TableLikeClause { $$ = $1; }
9628 3816 : 1174 : | TableConstraint { $$ = $1; }
3817 : : ;
3818 : :
3819 : : TypedTableElement:
5190 peter_e@gmx.net 3820 : 150 : columnOptions { $$ = $1; }
3821 : 35 : | TableConstraint { $$ = $1; }
3822 : : ;
3823 : :
3824 : : columnDef: ColId Typename opt_column_storage opt_column_compression create_generic_options ColQualList
3825 : : {
9628 lockhart@fourpalms.o 3826 : 31294 : ColumnDef *n = makeNode(ColumnDef);
3827 : :
3828 : 31294 : n->colname = $1;
5386 peter_e@gmx.net 3829 : 31294 : n->typeName = $2;
641 peter@eisentraut.org 3830 : 31294 : n->storage_name = $3;
3831 : 31294 : n->compression = $4;
4785 tgl@sss.pgh.pa.us 3832 : 31294 : n->inhcount = 0;
7875 3833 : 31294 : n->is_local = true;
4785 3834 : 31294 : n->is_not_null = false;
3835 : 31294 : n->is_from_type = false;
54 peter@eisentraut.org 3836 : 31294 : n->storage = 0;
4785 tgl@sss.pgh.pa.us 3837 : 31294 : n->raw_default = NULL;
3838 : 31294 : n->cooked_default = NULL;
3839 : 31294 : n->collOid = InvalidOid;
641 peter@eisentraut.org 3840 : 31294 : n->fdwoptions = $5;
3841 : 31294 : SplitColQualList($6, &n->constraints, &n->collClause,
3842 : : yyscanner);
3797 tgl@sss.pgh.pa.us 3843 : 31294 : n->location = @1;
702 peter@eisentraut.org 3844 : 31294 : $$ = (Node *) n;
3845 : : }
3846 : : ;
3847 : :
3848 : : columnOptions: ColId ColQualList
3849 : : {
2544 sfrost@snowman.net 3850 : 60 : ColumnDef *n = makeNode(ColumnDef);
3851 : :
3852 : 60 : n->colname = $1;
3853 : 60 : n->typeName = NULL;
3854 : 60 : n->inhcount = 0;
3855 : 60 : n->is_local = true;
3856 : 60 : n->is_not_null = false;
3857 : 60 : n->is_from_type = false;
54 peter@eisentraut.org 3858 : 60 : n->storage = 0;
2544 sfrost@snowman.net 3859 : 60 : n->raw_default = NULL;
3860 : 60 : n->cooked_default = NULL;
3861 : 60 : n->collOid = InvalidOid;
3862 : 60 : SplitColQualList($2, &n->constraints, &n->collClause,
3863 : : yyscanner);
3864 : 60 : n->location = @1;
702 peter@eisentraut.org 3865 : 60 : $$ = (Node *) n;
3866 : : }
3867 : : | ColId WITH OPTIONS ColQualList
3868 : : {
5190 peter_e@gmx.net 3869 : 90 : ColumnDef *n = makeNode(ColumnDef);
3870 : :
3871 : 90 : n->colname = $1;
4785 tgl@sss.pgh.pa.us 3872 : 90 : n->typeName = NULL;
3873 : 90 : n->inhcount = 0;
5190 peter_e@gmx.net 3874 : 90 : n->is_local = true;
4785 tgl@sss.pgh.pa.us 3875 : 90 : n->is_not_null = false;
3876 : 90 : n->is_from_type = false;
54 peter@eisentraut.org 3877 : 90 : n->storage = 0;
4785 tgl@sss.pgh.pa.us 3878 : 90 : n->raw_default = NULL;
3879 : 90 : n->cooked_default = NULL;
3880 : 90 : n->collOid = InvalidOid;
3881 : 90 : SplitColQualList($4, &n->constraints, &n->collClause,
3882 : : yyscanner);
3797 3883 : 90 : n->location = @1;
702 peter@eisentraut.org 3884 : 90 : $$ = (Node *) n;
3885 : : }
3886 : : ;
3887 : :
3888 : : column_compression:
1053 tgl@sss.pgh.pa.us 3889 : 68 : COMPRESSION ColId { $$ = $2; }
3890 : 3 : | COMPRESSION DEFAULT { $$ = pstrdup("default"); }
3891 : : ;
3892 : :
3893 : : opt_column_compression:
3894 : 38 : column_compression { $$ = $1; }
3895 : 31286 : | /*EMPTY*/ { $$ = NULL; }
3896 : : ;
3897 : :
3898 : : column_storage:
641 peter@eisentraut.org 3899 : 113 : STORAGE ColId { $$ = $2; }
521 tgl@sss.pgh.pa.us 3900 : 3 : | STORAGE DEFAULT { $$ = pstrdup("default"); }
3901 : : ;
3902 : :
3903 : : opt_column_storage:
641 peter@eisentraut.org 3904 : 10 : column_storage { $$ = $1; }
3905 : 31314 : | /*EMPTY*/ { $$ = NULL; }
3906 : : ;
3907 : :
3908 : : ColQualList:
7972 bruce@momjian.us 3909 : 8511 : ColQualList ColConstraint { $$ = lappend($1, $2); }
3910 : 32038 : | /*EMPTY*/ { $$ = NIL; }
3911 : : ;
3912 : :
3913 : : ColConstraint:
3914 : : CONSTRAINT name ColConstraintElem
3915 : : {
2609 peter_e@gmx.net 3916 : 340 : Constraint *n = castNode(Constraint, $3);
3917 : :
5372 tgl@sss.pgh.pa.us 3918 : 340 : n->conname = $2;
3919 : 340 : n->location = @1;
3920 : 340 : $$ = (Node *) n;
3921 : : }
7972 bruce@momjian.us 3922 : 7779 : | ColConstraintElem { $$ = $1; }
3923 : 87 : | ConstraintAttr { $$ = $1; }
3924 : : | COLLATE any_name
3925 : : {
3926 : : /*
3927 : : * Note: the CollateClause is momentarily included in
3928 : : * the list built by ColQualList, but we split it out
3929 : : * again in SplitColQualList.
3930 : : */
4785 tgl@sss.pgh.pa.us 3931 : 305 : CollateClause *n = makeNode(CollateClause);
3932 : :
3933 : 305 : n->arg = NULL;
4783 3934 : 305 : n->collname = $2;
4785 3935 : 305 : n->location = @1;
3936 : 305 : $$ = (Node *) n;
3937 : : }
3938 : : ;
3939 : :
3940 : : /* DEFAULT NULL is already the default for Postgres.
3941 : : * But define it here and carry it forward into the system
3942 : : * to make it explicit.
3943 : : * - thomas 1998-09-13
3944 : : *
3945 : : * WITH NULL and NULL are not SQL-standard syntax elements,
3946 : : * so leave them out. Use DEFAULT NULL to explicitly indicate
3947 : : * that a column may have that value. WITH NULL leads to
3948 : : * shift/reduce conflicts with WITH TIME ZONE anyway.
3949 : : * - thomas 1999-01-08
3950 : : *
3951 : : * DEFAULT expression must be b_expr not a_expr to prevent shift/reduce
3952 : : * conflict on NOT (since NOT might start a subsequent NOT NULL constraint,
3953 : : * or be part of a_expr NOT LIKE or similar constructs).
3954 : : */
3955 : : ColConstraintElem:
3956 : : NOT NULL_P opt_no_inherit
3957 : : {
8810 3958 : 2991 : Constraint *n = makeNode(Constraint);
3959 : :
3960 : 2991 : n->contype = CONSTR_NOTNULL;
5372 3961 : 2991 : n->location = @1;
233 alvherre@alvh.no-ip. 3962 :GNC 2991 : n->is_no_inherit = $3;
3963 : 2991 : n->skip_validation = false;
3964 : 2991 : n->initially_valid = true;
702 peter@eisentraut.org 3965 :CBC 2991 : $$ = (Node *) n;
3966 : : }
3967 : : | NULL_P
3968 : : {
8810 tgl@sss.pgh.pa.us 3969 : 11 : Constraint *n = makeNode(Constraint);
3970 : :
3971 : 11 : n->contype = CONSTR_NULL;
5372 3972 : 11 : n->location = @1;
702 peter@eisentraut.org 3973 : 11 : $$ = (Node *) n;
3974 : : }
3975 : : | UNIQUE opt_unique_null_treatment opt_definition OptConsTableSpace
3976 : : {
9342 lockhart@fourpalms.o 3977 : 199 : Constraint *n = makeNode(Constraint);
3978 : :
8825 3979 : 199 : n->contype = CONSTR_UNIQUE;
5372 tgl@sss.pgh.pa.us 3980 : 199 : n->location = @1;
801 peter@eisentraut.org 3981 : 199 : n->nulls_not_distinct = !$2;
9342 lockhart@fourpalms.o 3982 : 199 : n->keys = NULL;
801 peter@eisentraut.org 3983 : 199 : n->options = $3;
4828 tgl@sss.pgh.pa.us 3984 : 199 : n->indexname = NULL;
801 peter@eisentraut.org 3985 : 199 : n->indexspace = $4;
702 3986 : 199 : $$ = (Node *) n;
3987 : : }
3988 : : | PRIMARY KEY opt_definition OptConsTableSpace
3989 : : {
8810 tgl@sss.pgh.pa.us 3990 : 2713 : Constraint *n = makeNode(Constraint);
3991 : :
3992 : 2713 : n->contype = CONSTR_PRIMARY;
5372 3993 : 2713 : n->location = @1;
8810 3994 : 2713 : n->keys = NULL;
6496 bruce@momjian.us 3995 : 2713 : n->options = $3;
4828 tgl@sss.pgh.pa.us 3996 : 2713 : n->indexname = NULL;
6496 bruce@momjian.us 3997 : 2713 : n->indexspace = $4;
702 peter@eisentraut.org 3998 : 2713 : $$ = (Node *) n;
3999 : : }
4000 : : | CHECK '(' a_expr ')' opt_no_inherit
4001 : : {
9628 lockhart@fourpalms.o 4002 : 437 : Constraint *n = makeNode(Constraint);
4003 : :
8825 4004 : 437 : n->contype = CONSTR_CHECK;
5372 tgl@sss.pgh.pa.us 4005 : 437 : n->location = @1;
4282 alvherre@alvh.no-ip. 4006 : 437 : n->is_no_inherit = $5;
4007 : 437 : n->raw_expr = $3;
8960 tgl@sss.pgh.pa.us 4008 : 437 : n->cooked_expr = NULL;
3042 rhaas@postgresql.org 4009 : 437 : n->skip_validation = false;
4010 : 437 : n->initially_valid = true;
702 peter@eisentraut.org 4011 : 437 : $$ = (Node *) n;
4012 : : }
4013 : : | DEFAULT b_expr
4014 : : {
8810 tgl@sss.pgh.pa.us 4015 : 818 : Constraint *n = makeNode(Constraint);
4016 : :
4017 : 818 : n->contype = CONSTR_DEFAULT;
5372 4018 : 818 : n->location = @1;
6012 4019 : 818 : n->raw_expr = $2;
8810 4020 : 818 : n->cooked_expr = NULL;
702 peter@eisentraut.org 4021 : 818 : $$ = (Node *) n;
4022 : : }
4023 : : | GENERATED generated_when AS IDENTITY_P OptParenthesizedSeqOptList
4024 : : {
2565 peter_e@gmx.net 4025 : 139 : Constraint *n = makeNode(Constraint);
4026 : :
4027 : 139 : n->contype = CONSTR_IDENTITY;
4028 : 139 : n->generated_when = $2;
4029 : 139 : n->options = $5;
4030 : 139 : n->location = @1;
702 peter@eisentraut.org 4031 : 139 : $$ = (Node *) n;
4032 : : }
4033 : : | GENERATED generated_when AS '(' a_expr ')' STORED
4034 : : {
1842 4035 : 436 : Constraint *n = makeNode(Constraint);
4036 : :
4037 : 436 : n->contype = CONSTR_GENERATED;
4038 : 436 : n->generated_when = $2;
4039 : 436 : n->raw_expr = $5;
4040 : 436 : n->cooked_expr = NULL;
4041 : 436 : n->location = @1;
4042 : :
4043 : : /*
4044 : : * Can't do this in the grammar because of shift/reduce
4045 : : * conflicts. (IDENTITY allows both ALWAYS and BY
4046 : : * DEFAULT, but generated columns only allow ALWAYS.) We
4047 : : * can also give a more useful error message and location.
4048 : : */
1840 4049 [ + + ]: 436 : if ($2 != ATTRIBUTE_IDENTITY_ALWAYS)
4050 [ + - ]: 3 : ereport(ERROR,
4051 : : (errcode(ERRCODE_SYNTAX_ERROR),
4052 : : errmsg("for a generated column, GENERATED ALWAYS must be specified"),
4053 : : parser_errposition(@2)));
4054 : :
702 4055 : 433 : $$ = (Node *) n;
4056 : : }
4057 : : | REFERENCES qualified_name opt_column_list key_match key_actions
4058 : : {
5372 tgl@sss.pgh.pa.us 4059 : 378 : Constraint *n = makeNode(Constraint);
4060 : :
4061 : 378 : n->contype = CONSTR_FOREIGN;
4062 : 378 : n->location = @1;
1005 peter@eisentraut.org 4063 : 378 : n->pktable = $2;
4064 : 378 : n->fk_attrs = NIL;
4065 : 378 : n->pk_attrs = $3;
4066 : 378 : n->fk_matchtype = $4;
858 4067 : 378 : n->fk_upd_action = ($5)->updateAction->action;
4068 : 378 : n->fk_del_action = ($5)->deleteAction->action;
4069 : 378 : n->fk_del_set_cols = ($5)->deleteAction->cols;
1005 4070 : 378 : n->skip_validation = false;
4071 : 378 : n->initially_valid = true;
702 4072 : 378 : $$ = (Node *) n;
4073 : : }
4074 : : ;
4075 : :
4076 : : opt_unique_null_treatment:
801 4077 : 6 : NULLS_P DISTINCT { $$ = true; }
4078 : 15 : | NULLS_P NOT DISTINCT { $$ = false; }
4079 : 3623 : | /*EMPTY*/ { $$ = true; }
4080 : : ;
4081 : :
4082 : : generated_when:
2565 peter_e@gmx.net 4083 : 601 : ALWAYS { $$ = ATTRIBUTE_IDENTITY_ALWAYS; }
4084 : 73 : | BY DEFAULT { $$ = ATTRIBUTE_IDENTITY_BY_DEFAULT; }
4085 : : ;
4086 : :
4087 : : /*
4088 : : * ConstraintAttr represents constraint attributes, which we parse as if
4089 : : * they were independent constraint clauses, in order to avoid shift/reduce
4090 : : * conflicts (since NOT might start either an independent NOT NULL clause
4091 : : * or an attribute). parse_utilcmd.c is responsible for attaching the
4092 : : * attribute information to the preceding "real" constraint node, and for
4093 : : * complaining if attribute clauses appear in the wrong place or wrong
4094 : : * combinations.
4095 : : *
4096 : : * See also ConstraintAttributeSpec, which can be used in places where
4097 : : * there is no parsing conflict. (Note: currently, NOT VALID and NO INHERIT
4098 : : * are allowed clauses in ConstraintAttributeSpec, but not here. Someday we
4099 : : * might need to allow them here too, but for the moment it doesn't seem
4100 : : * useful in the statements that use ConstraintAttr.)
4101 : : */
4102 : : ConstraintAttr:
4103 : : DEFERRABLE
4104 : : {
8821 lockhart@fourpalms.o 4105 : 48 : Constraint *n = makeNode(Constraint);
4106 : :
8810 tgl@sss.pgh.pa.us 4107 : 48 : n->contype = CONSTR_ATTR_DEFERRABLE;
5372 4108 : 48 : n->location = @1;
702 peter@eisentraut.org 4109 : 48 : $$ = (Node *) n;
4110 : : }
4111 : : | NOT DEFERRABLE
4112 : : {
8821 lockhart@fourpalms.o 4113 :UBC 0 : Constraint *n = makeNode(Constraint);
4114 : :
8810 tgl@sss.pgh.pa.us 4115 : 0 : n->contype = CONSTR_ATTR_NOT_DEFERRABLE;
5372 4116 : 0 : n->location = @1;
702 peter@eisentraut.org 4117 : 0 : $$ = (Node *) n;
4118 : : }
4119 : : | INITIALLY DEFERRED
4120 : : {
8810 tgl@sss.pgh.pa.us 4121 :CBC 36 : Constraint *n = makeNode(Constraint);
4122 : :
4123 : 36 : n->contype = CONSTR_ATTR_DEFERRED;
5372 4124 : 36 : n->location = @1;
702 peter@eisentraut.org 4125 : 36 : $$ = (Node *) n;
4126 : : }
4127 : : | INITIALLY IMMEDIATE
4128 : : {
8810 tgl@sss.pgh.pa.us 4129 : 3 : Constraint *n = makeNode(Constraint);
4130 : :
4131 : 3 : n->contype = CONSTR_ATTR_IMMEDIATE;
5372 4132 : 3 : n->location = @1;
702 peter@eisentraut.org 4133 : 3 : $$ = (Node *) n;
4134 : : }
4135 : : ;
4136 : :
4137 : :
4138 : : TableLikeClause:
4139 : : LIKE qualified_name TableLikeOptionList
4140 : : {
4481 peter_e@gmx.net 4141 : 363 : TableLikeClause *n = makeNode(TableLikeClause);
4142 : :
7599 bruce@momjian.us 4143 : 363 : n->relation = $2;
6501 4144 : 363 : n->options = $3;
1230 tgl@sss.pgh.pa.us 4145 : 363 : n->relationOid = InvalidOid;
702 peter@eisentraut.org 4146 : 363 : $$ = (Node *) n;
4147 : : }
4148 : : ;
4149 : :
4150 : : TableLikeOptionList:
5298 andrew@dunslane.net 4151 : 126 : TableLikeOptionList INCLUDING TableLikeOption { $$ = $1 | $3; }
4152 : 1 : | TableLikeOptionList EXCLUDING TableLikeOption { $$ = $1 & ~$3; }
4153 : 363 : | /* EMPTY */ { $$ = 0; }
4154 : : ;
4155 : :
4156 : : TableLikeOption:
2232 alvherre@alvh.no-ip. 4157 : 12 : COMMENTS { $$ = CREATE_TABLE_LIKE_COMMENTS; }
1087 fujii@postgresql.org 4158 : 3 : | COMPRESSION { $$ = CREATE_TABLE_LIKE_COMPRESSION; }
5298 andrew@dunslane.net 4159 : 27 : | CONSTRAINTS { $$ = CREATE_TABLE_LIKE_CONSTRAINTS; }
2232 alvherre@alvh.no-ip. 4160 : 10 : | DEFAULTS { $$ = CREATE_TABLE_LIKE_DEFAULTS; }
2565 peter_e@gmx.net 4161 : 3 : | IDENTITY_P { $$ = CREATE_TABLE_LIKE_IDENTITY; }
1842 peter@eisentraut.org 4162 : 12 : | GENERATED { $$ = CREATE_TABLE_LIKE_GENERATED; }
5298 andrew@dunslane.net 4163 : 25 : | INDEXES { $$ = CREATE_TABLE_LIKE_INDEXES; }
2232 alvherre@alvh.no-ip. 4164 :UBC 0 : | STATISTICS { $$ = CREATE_TABLE_LIKE_STATISTICS; }
5298 andrew@dunslane.net 4165 :CBC 13 : | STORAGE { $$ = CREATE_TABLE_LIKE_STORAGE; }
4166 : 22 : | ALL { $$ = CREATE_TABLE_LIKE_ALL; }
4167 : : ;
4168 : :
4169 : :
4170 : : /* ConstraintElem specifies constraint syntax which is not embedded into
4171 : : * a column definition. ColConstraintElem specifies the embedded form.
4172 : : * - thomas 1997-12-03
4173 : : */
4174 : : TableConstraint:
4175 : : CONSTRAINT name ConstraintElem
4176 : : {
2609 peter_e@gmx.net 4177 : 1708 : Constraint *n = castNode(Constraint, $3);
4178 : :
5372 tgl@sss.pgh.pa.us 4179 : 1708 : n->conname = $2;
4180 : 1708 : n->location = @1;
4181 : 1708 : $$ = (Node *) n;
4182 : : }
7972 bruce@momjian.us 4183 : 5264 : | ConstraintElem { $$ = $1; }
4184 : : ;
4185 : :
4186 : : ConstraintElem:
4187 : : CHECK '(' a_expr ')' ConstraintAttributeSpec
4188 : : {
9628 lockhart@fourpalms.o 4189 : 591 : Constraint *n = makeNode(Constraint);
4190 : :
4191 : 591 : n->contype = CONSTR_CHECK;
5372 tgl@sss.pgh.pa.us 4192 : 591 : n->location = @1;
4282 alvherre@alvh.no-ip. 4193 : 591 : n->raw_expr = $3;
8960 tgl@sss.pgh.pa.us 4194 : 591 : n->cooked_expr = NULL;
4282 alvherre@alvh.no-ip. 4195 : 591 : processCASbits($5, @5, "CHECK",
4196 : : NULL, NULL, &n->skip_validation,
4197 : : &n->is_no_inherit, yyscanner);
4701 4198 : 591 : n->initially_valid = !n->skip_validation;
702 peter@eisentraut.org 4199 : 591 : $$ = (Node *) n;
4200 : : }
4201 : : | NOT NULL_P ColId ConstraintAttributeSpec
4202 : : {
233 alvherre@alvh.no-ip. 4203 :GNC 85 : Constraint *n = makeNode(Constraint);
4204 : :
4205 : 85 : n->contype = CONSTR_NOTNULL;
4206 : 85 : n->location = @1;
4207 : 85 : n->keys = list_make1(makeString($3));
4208 : : /* no NOT VALID support yet */
4209 : 85 : processCASbits($4, @4, "NOT NULL",
4210 : : NULL, NULL, NULL,
4211 : : &n->is_no_inherit, yyscanner);
4212 : 85 : n->initially_valid = true;
4213 : 85 : $$ = (Node *) n;
4214 : : }
4215 : : | UNIQUE opt_unique_null_treatment '(' columnList opt_without_overlaps ')' opt_c_include opt_definition OptConsTableSpace
4216 : : ConstraintAttributeSpec
4217 : : {
9628 lockhart@fourpalms.o 4218 :CBC 256 : Constraint *n = makeNode(Constraint);
4219 : :
4220 : 256 : n->contype = CONSTR_UNIQUE;
5372 tgl@sss.pgh.pa.us 4221 : 256 : n->location = @1;
801 peter@eisentraut.org 4222 : 256 : n->nulls_not_distinct = !$2;
4223 : 256 : n->keys = $4;
81 peter@eisentraut.org 4224 :GNC 256 : n->without_overlaps = $5;
4225 : 256 : n->including = $7;
4226 : 256 : n->options = $8;
4828 tgl@sss.pgh.pa.us 4227 :CBC 256 : n->indexname = NULL;
81 peter@eisentraut.org 4228 :GNC 256 : n->indexspace = $9;
4229 : 256 : processCASbits($10, @10, "UNIQUE",
4230 : : &n->deferrable, &n->initdeferred, NULL,
4231 : : NULL, yyscanner);
702 peter@eisentraut.org 4232 :CBC 256 : $$ = (Node *) n;
4233 : : }
4234 : : | UNIQUE ExistingIndex ConstraintAttributeSpec
4235 : : {
4828 tgl@sss.pgh.pa.us 4236 : 1793 : Constraint *n = makeNode(Constraint);
4237 : :
4238 : 1793 : n->contype = CONSTR_UNIQUE;
4239 : 1793 : n->location = @1;
4240 : 1793 : n->keys = NIL;
2199 teodor@sigaev.ru 4241 : 1793 : n->including = NIL;
4828 tgl@sss.pgh.pa.us 4242 : 1793 : n->options = NIL;
4243 : 1793 : n->indexname = $2;
4244 : 1793 : n->indexspace = NULL;
4687 4245 : 1793 : processCASbits($3, @3, "UNIQUE",
4246 : : &n->deferrable, &n->initdeferred, NULL,
4247 : : NULL, yyscanner);
702 peter@eisentraut.org 4248 : 1793 : $$ = (Node *) n;
4249 : : }
4250 : : | PRIMARY KEY '(' columnList opt_without_overlaps ')' opt_c_include opt_definition OptConsTableSpace
4251 : : ConstraintAttributeSpec
4252 : : {
8810 tgl@sss.pgh.pa.us 4253 : 943 : Constraint *n = makeNode(Constraint);
4254 : :
4255 : 943 : n->contype = CONSTR_PRIMARY;
5372 4256 : 943 : n->location = @1;
8810 4257 : 943 : n->keys = $4;
81 peter@eisentraut.org 4258 :GNC 943 : n->without_overlaps = $5;
4259 : 943 : n->including = $7;
4260 : 943 : n->options = $8;
4828 tgl@sss.pgh.pa.us 4261 :CBC 943 : n->indexname = NULL;
81 peter@eisentraut.org 4262 :GNC 943 : n->indexspace = $9;
4263 : 943 : processCASbits($10, @10, "PRIMARY KEY",
4264 : : &n->deferrable, &n->initdeferred, NULL,
4265 : : NULL, yyscanner);
702 peter@eisentraut.org 4266 :CBC 943 : $$ = (Node *) n;
4267 : : }
4268 : : | PRIMARY KEY ExistingIndex ConstraintAttributeSpec
4269 : : {
4828 tgl@sss.pgh.pa.us 4270 : 2327 : Constraint *n = makeNode(Constraint);
4271 : :
4272 : 2327 : n->contype = CONSTR_PRIMARY;
4273 : 2327 : n->location = @1;
4274 : 2327 : n->keys = NIL;
2199 teodor@sigaev.ru 4275 : 2327 : n->including = NIL;
4828 tgl@sss.pgh.pa.us 4276 : 2327 : n->options = NIL;
4277 : 2327 : n->indexname = $3;
4278 : 2327 : n->indexspace = NULL;
4687 4279 : 2327 : processCASbits($4, @4, "PRIMARY KEY",
4280 : : &n->deferrable, &n->initdeferred, NULL,
4281 : : NULL, yyscanner);
702 peter@eisentraut.org 4282 : 2327 : $$ = (Node *) n;
4283 : : }
4284 : : | EXCLUDE access_method_clause '(' ExclusionConstraintList ')'
4285 : : opt_c_include opt_definition OptConsTableSpace OptWhereClause
4286 : : ConstraintAttributeSpec
4287 : : {
5242 tgl@sss.pgh.pa.us 4288 : 117 : Constraint *n = makeNode(Constraint);
4289 : :
4290 : 117 : n->contype = CONSTR_EXCLUSION;
4291 : 117 : n->location = @1;
1005 peter@eisentraut.org 4292 : 117 : n->access_method = $2;
4293 : 117 : n->exclusions = $4;
4294 : 117 : n->including = $6;
4295 : 117 : n->options = $7;
4296 : 117 : n->indexname = NULL;
4297 : 117 : n->indexspace = $8;
4298 : 117 : n->where_clause = $9;
2199 teodor@sigaev.ru 4299 : 117 : processCASbits($10, @10, "EXCLUDE",
4300 : : &n->deferrable, &n->initdeferred, NULL,
4301 : : NULL, yyscanner);
702 peter@eisentraut.org 4302 : 117 : $$ = (Node *) n;
4303 : : }
4304 : : | FOREIGN KEY '(' columnList optionalPeriodName ')' REFERENCES qualified_name
4305 : : opt_column_and_period_list key_match key_actions ConstraintAttributeSpec
4306 : : {
5372 tgl@sss.pgh.pa.us 4307 : 860 : Constraint *n = makeNode(Constraint);
4308 : :
4309 : 860 : n->contype = CONSTR_FOREIGN;
4310 : 860 : n->location = @1;
21 peter@eisentraut.org 4311 :GNC 860 : n->pktable = $8;
1005 peter@eisentraut.org 4312 :CBC 860 : n->fk_attrs = $4;
21 peter@eisentraut.org 4313 [ + + ]:GNC 860 : if ($5)
4314 : : {
4315 : 143 : n->fk_attrs = lappend(n->fk_attrs, $5);
4316 : 143 : n->fk_with_period = true;
4317 : : }
4318 : 860 : n->pk_attrs = linitial($9);
4319 [ + + ]: 860 : if (lsecond($9))
4320 : : {
4321 : 89 : n->pk_attrs = lappend(n->pk_attrs, lsecond($9));
4322 : 89 : n->pk_with_period = true;
4323 : : }
4324 : 860 : n->fk_matchtype = $10;
4325 : 860 : n->fk_upd_action = ($11)->updateAction->action;
4326 : 860 : n->fk_del_action = ($11)->deleteAction->action;
4327 : 860 : n->fk_del_set_cols = ($11)->deleteAction->cols;
4328 : 860 : processCASbits($12, @12, "FOREIGN KEY",
4329 : : &n->deferrable, &n->initdeferred,
4330 : : &n->skip_validation, NULL,
4331 : : yyscanner);
4687 tgl@sss.pgh.pa.us 4332 :CBC 860 : n->initially_valid = !n->skip_validation;
702 peter@eisentraut.org 4333 : 860 : $$ = (Node *) n;
4334 : : }
4335 : : ;
4336 : :
2433 peter_e@gmx.net 4337 : 114 : opt_no_inherit: NO INHERIT { $$ = true; }
4338 : 3314 : | /* EMPTY */ { $$ = false; }
4339 : : ;
4340 : :
4341 : : opt_without_overlaps:
81 peter@eisentraut.org 4342 :GNC 196 : WITHOUT OVERLAPS { $$ = true; }
4343 : 1003 : | /*EMPTY*/ { $$ = false; }
4344 : : ;
4345 : :
4346 : : opt_column_list:
7972 bruce@momjian.us 4347 :CBC 4424 : '(' columnList ')' { $$ = $2; }
4348 : 16204 : | /*EMPTY*/ { $$ = NIL; }
4349 : : ;
4350 : :
4351 : : columnList:
7259 neilc@samurai.com 4352 : 7328 : columnElem { $$ = list_make1($1); }
7971 bruce@momjian.us 4353 : 12310 : | columnList ',' columnElem { $$ = lappend($1, $3); }
4354 : : ;
4355 : :
4356 : : optionalPeriodName:
21 peter@eisentraut.org 4357 :GNC 232 : ',' PERIOD columnElem { $$ = $3; }
4358 : 1194 : | /*EMPTY*/ { $$ = NULL; }
4359 : : ;
4360 : :
4361 : : opt_column_and_period_list:
4362 : 563 : '(' columnList optionalPeriodName ')' { $$ = list_make2($2, $3); }
4363 : 300 : | /*EMPTY*/ { $$ = list_make2(NIL, NULL); }
4364 : : ;
4365 : :
4366 : : columnElem: ColId
4367 : : {
7909 tgl@sss.pgh.pa.us 4368 :CBC 19870 : $$ = (Node *) makeString($1);
4369 : : }
4370 : : ;
4371 : :
2199 teodor@sigaev.ru 4372 : 84 : opt_c_include: INCLUDE '(' columnList ')' { $$ = $3; }
4373 : 1232 : | /* EMPTY */ { $$ = NIL; }
4374 : : ;
4375 : :
4376 : : key_match: MATCH FULL
4377 : : {
7947 tgl@sss.pgh.pa.us 4378 : 49 : $$ = FKCONSTR_MATCH_FULL;
4379 : : }
4380 : : | MATCH PARTIAL
4381 : : {
7575 tgl@sss.pgh.pa.us 4382 [ # # ]:UBC 0 : ereport(ERROR,
4383 : : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4384 : : errmsg("MATCH PARTIAL not yet implemented"),
4385 : : parser_errposition(@1)));
4386 : : $$ = FKCONSTR_MATCH_PARTIAL;
4387 : : }
4388 : : | MATCH SIMPLE
4389 : : {
4319 tgl@sss.pgh.pa.us 4390 :CBC 3 : $$ = FKCONSTR_MATCH_SIMPLE;
4391 : : }
4392 : : | /*EMPTY*/
4393 : : {
4394 : 1189 : $$ = FKCONSTR_MATCH_SIMPLE;
4395 : : }
4396 : : ;
4397 : :
4398 : : ExclusionConstraintList:
5242 4399 : 117 : ExclusionConstraintElem { $$ = list_make1($1); }
4400 : : | ExclusionConstraintList ',' ExclusionConstraintElem
4401 : 53 : { $$ = lappend($1, $3); }
4402 : : ;
4403 : :
4404 : : ExclusionConstraintElem: index_elem WITH any_operator
4405 : : {
4406 : 170 : $$ = list_make2($1, $3);
4407 : : }
4408 : : /* allow OPERATOR() decoration for the benefit of ruleutils.c */
4409 : : | index_elem WITH OPERATOR '(' any_operator ')'
4410 : : {
5242 tgl@sss.pgh.pa.us 4411 :UBC 0 : $$ = list_make2($1, $5);
4412 : : }
4413 : : ;
4414 : :
4415 : : OptWhereClause:
5242 tgl@sss.pgh.pa.us 4416 :CBC 213 : WHERE '(' a_expr ')' { $$ = $3; }
4417 : 568 : | /*EMPTY*/ { $$ = NULL; }
4418 : : ;
4419 : :
4420 : : key_actions:
4421 : : key_update
4422 : : {
858 peter@eisentraut.org 4423 : 25 : KeyActions *n = palloc(sizeof(KeyActions));
4424 : :
4425 : 25 : n->updateAction = $1;
4426 : 25 : n->deleteAction = palloc(sizeof(KeyAction));
4427 : 25 : n->deleteAction->action = FKCONSTR_ACTION_NOACTION;
4428 : 25 : n->deleteAction->cols = NIL;
4429 : 25 : $$ = n;
4430 : : }
4431 : : | key_delete
4432 : : {
4433 : 80 : KeyActions *n = palloc(sizeof(KeyActions));
4434 : :
4435 : 80 : n->updateAction = palloc(sizeof(KeyAction));
4436 : 80 : n->updateAction->action = FKCONSTR_ACTION_NOACTION;
4437 : 80 : n->updateAction->cols = NIL;
4438 : 80 : n->deleteAction = $1;
4439 : 80 : $$ = n;
4440 : : }
4441 : : | key_update key_delete
4442 : : {
4443 : 75 : KeyActions *n = palloc(sizeof(KeyActions));
4444 : :
4445 : 75 : n->updateAction = $1;
4446 : 75 : n->deleteAction = $2;
4447 : 75 : $$ = n;
4448 : : }
4449 : : | key_delete key_update
4450 : : {
4451 : 66 : KeyActions *n = palloc(sizeof(KeyActions));
4452 : :
4453 : 66 : n->updateAction = $2;
4454 : 66 : n->deleteAction = $1;
4455 : 66 : $$ = n;
4456 : : }
4457 : : | /*EMPTY*/
4458 : : {
4459 : 992 : KeyActions *n = palloc(sizeof(KeyActions));
4460 : :
4461 : 992 : n->updateAction = palloc(sizeof(KeyAction));
4462 : 992 : n->updateAction->action = FKCONSTR_ACTION_NOACTION;
4463 : 992 : n->updateAction->cols = NIL;
4464 : 992 : n->deleteAction = palloc(sizeof(KeyAction));
4465 : 992 : n->deleteAction->action = FKCONSTR_ACTION_NOACTION;
4466 : 992 : n->deleteAction->cols = NIL;
4467 : 992 : $$ = n;
4468 : : }
4469 : : ;
4470 : :
4471 : : key_update: ON UPDATE key_action
4472 : : {
4473 [ + + ]: 169 : if (($3)->cols)
4474 [ + - + - ]: 3 : ereport(ERROR,
4475 : : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4476 : : errmsg("a column list with %s is only supported for ON DELETE actions",
4477 : : ($3)->action == FKCONSTR_ACTION_SETNULL ? "SET NULL" : "SET DEFAULT"),
4478 : : parser_errposition(@1)));
4479 : 166 : $$ = $3;
4480 : : }
4481 : : ;
4482 : :
4483 : : key_delete: ON DELETE_P key_action
4484 : : {
4485 : 221 : $$ = $3;
4486 : : }
4487 : : ;
4488 : :
4489 : : key_action:
4490 : : NO ACTION
4491 : : {
4492 : 37 : KeyAction *n = palloc(sizeof(KeyAction));
4493 : :
4494 : 37 : n->action = FKCONSTR_ACTION_NOACTION;
4495 : 37 : n->cols = NIL;
4496 : 37 : $$ = n;
4497 : : }
4498 : : | RESTRICT
4499 : : {
4500 : 29 : KeyAction *n = palloc(sizeof(KeyAction));
4501 : :
4502 : 29 : n->action = FKCONSTR_ACTION_RESTRICT;
4503 : 29 : n->cols = NIL;
4504 : 29 : $$ = n;
4505 : : }
4506 : : | CASCADE
4507 : : {
4508 : 193 : KeyAction *n = palloc(sizeof(KeyAction));
4509 : :
4510 : 193 : n->action = FKCONSTR_ACTION_CASCADE;
4511 : 193 : n->cols = NIL;
4512 : 193 : $$ = n;
4513 : : }
4514 : : | SET NULL_P opt_column_list
4515 : : {
4516 : 86 : KeyAction *n = palloc(sizeof(KeyAction));
4517 : :
4518 : 86 : n->action = FKCONSTR_ACTION_SETNULL;
4519 : 86 : n->cols = $3;
4520 : 86 : $$ = n;
4521 : : }
4522 : : | SET DEFAULT opt_column_list
4523 : : {
4524 : 45 : KeyAction *n = palloc(sizeof(KeyAction));
4525 : :
4526 : 45 : n->action = FKCONSTR_ACTION_SETDEFAULT;
4527 : 45 : n->cols = $3;
4528 : 45 : $$ = n;
4529 : : }
4530 : : ;
4531 : :
7972 bruce@momjian.us 4532 : 882 : OptInherit: INHERITS '(' qualified_name_list ')' { $$ = $3; }
4533 : 12738 : | /*EMPTY*/ { $$ = NIL; }
4534 : : ;
4535 : :
4536 : : /* Optional partition key specification */
2685 rhaas@postgresql.org 4537 : 2438 : OptPartitionSpec: PartitionSpec { $$ = $1; }
4538 : 15155 : | /*EMPTY*/ { $$ = NULL; }
4539 : : ;
4540 : :
4541 : : PartitionSpec: PARTITION BY ColId '(' part_params ')'
4542 : : {
4543 : 2441 : PartitionSpec *n = makeNode(PartitionSpec);
4544 : :
528 alvherre@alvh.no-ip. 4545 : 2441 : n->strategy = parsePartitionStrategy($3);
2685 rhaas@postgresql.org 4546 : 2438 : n->partParams = $5;
4547 : 2438 : n->location = @1;
4548 : :
4549 : 2438 : $$ = n;
4550 : : }
4551 : : ;
4552 : :
4553 : 2441 : part_params: part_elem { $$ = list_make1($1); }
4554 : 231 : | part_params ',' part_elem { $$ = lappend($1, $3); }
4555 : : ;
4556 : :
4557 : : part_elem: ColId opt_collate opt_qualified_name
4558 : : {
4559 : 2523 : PartitionElem *n = makeNode(PartitionElem);
4560 : :
4561 : 2523 : n->name = $1;
4562 : 2523 : n->expr = NULL;
4563 : 2523 : n->collation = $2;
4564 : 2523 : n->opclass = $3;
4565 : 2523 : n->location = @1;
4566 : 2523 : $$ = n;
4567 : : }
4568 : : | func_expr_windowless opt_collate opt_qualified_name
4569 : : {
4570 : 65 : PartitionElem *n = makeNode(PartitionElem);
4571 : :
4572 : 65 : n->name = NULL;
4573 : 65 : n->expr = $1;
4574 : 65 : n->collation = $2;
4575 : 65 : n->opclass = $3;
4576 : 65 : n->location = @1;
4577 : 65 : $$ = n;
4578 : : }
4579 : : | '(' a_expr ')' opt_collate opt_qualified_name
4580 : : {
4581 : 84 : PartitionElem *n = makeNode(PartitionElem);
4582 : :
4583 : 84 : n->name = NULL;
4584 : 84 : n->expr = $2;
4585 : 84 : n->collation = $4;
4586 : 84 : n->opclass = $5;
4587 : 84 : n->location = @1;
4588 : 84 : $$ = n;
4589 : : }
4590 : : ;
4591 : :
4592 : : table_access_method_clause:
1404 peter@eisentraut.org 4593 : 58 : USING name { $$ = $2; }
1866 andres@anarazel.de 4594 : 18439 : | /*EMPTY*/ { $$ = NULL; }
4595 : : ;
4596 : :
4597 : : /* WITHOUT OIDS is legacy only */
4598 : : OptWith:
5550 alvherre@alvh.no-ip. 4599 : 316 : WITH reloptions { $$ = $2; }
1972 andres@anarazel.de 4600 : 12 : | WITHOUT OIDS { $$ = NIL; }
6495 tgl@sss.pgh.pa.us 4601 : 17887 : | /*EMPTY*/ { $$ = NIL; }
4602 : : ;
4603 : :
7825 4604 : 28 : OnCommitOption: ON COMMIT DROP { $$ = ONCOMMIT_DROP; }
4605 : 49 : | ON COMMIT DELETE_P ROWS { $$ = ONCOMMIT_DELETE_ROWS; }
4606 : 12 : | ON COMMIT PRESERVE ROWS { $$ = ONCOMMIT_PRESERVE_ROWS; }
4607 : 18126 : | /*EMPTY*/ { $$ = ONCOMMIT_NOOP; }
4608 : : ;
4609 : :
7240 4610 : 101 : OptTableSpace: TABLESPACE name { $$ = $2; }
4611 : 21582 : | /*EMPTY*/ { $$ = NULL; }
4612 : : ;
4613 : :
7195 4614 : 33 : OptConsTableSpace: USING INDEX TABLESPACE name { $$ = $4; }
4615 : 4195 : | /*EMPTY*/ { $$ = NULL; }
4616 : : ;
4617 : :
1404 peter@eisentraut.org 4618 : 4120 : ExistingIndex: USING INDEX name { $$ = $3; }
4619 : : ;
4620 : :
4621 : : /*****************************************************************************
4622 : : *
4623 : : * QUERY :
4624 : : * CREATE STATISTICS [[IF NOT EXISTS] stats_name] [(stat types)]
4625 : : * ON expression-list FROM from_list
4626 : : *
4627 : : * Note: the expectation here is that the clauses after ON are a subset of
4628 : : * SELECT syntax, allowing for expressions and joined tables, and probably
4629 : : * someday a WHERE clause. Much less than that is currently implemented,
4630 : : * but the grammar accepts it and then we'll throw FEATURE_NOT_SUPPORTED
4631 : : * errors as necessary at execution.
4632 : : *
4633 : : * Statistics name is optional unless IF NOT EXISTS is specified.
4634 : : *
4635 : : *****************************************************************************/
4636 : :
4637 : : CreateStatsStmt:
4638 : : CREATE STATISTICS opt_qualified_name
4639 : : opt_name_list ON stats_params FROM from_list
4640 : : {
2529 alvherre@alvh.no-ip. 4641 : 274 : CreateStatsStmt *n = makeNode(CreateStatsStmt);
4642 : :
2488 4643 : 274 : n->defnames = $3;
4644 : 274 : n->stat_types = $4;
4645 : 274 : n->exprs = $6;
4646 : 274 : n->relations = $8;
2232 4647 : 274 : n->stxcomment = NULL;
2488 4648 : 274 : n->if_not_exists = false;
702 peter@eisentraut.org 4649 : 274 : $$ = (Node *) n;
4650 : : }
4651 : : | CREATE STATISTICS IF_P NOT EXISTS any_name
4652 : : opt_name_list ON stats_params FROM from_list
4653 : : {
2488 alvherre@alvh.no-ip. 4654 : 6 : CreateStatsStmt *n = makeNode(CreateStatsStmt);
4655 : :
4656 : 6 : n->defnames = $6;
4657 : 6 : n->stat_types = $7;
4658 : 6 : n->exprs = $9;
4659 : 6 : n->relations = $11;
2232 4660 : 6 : n->stxcomment = NULL;
2488 4661 : 6 : n->if_not_exists = true;
702 peter@eisentraut.org 4662 : 6 : $$ = (Node *) n;
4663 : : }
4664 : : ;
4665 : :
4666 : : /*
4667 : : * Statistics attributes can be either simple column references, or arbitrary
4668 : : * expressions in parens. For compatibility with index attributes permitted
4669 : : * in CREATE INDEX, we allow an expression that's just a function call to be
4670 : : * written without parens.
4671 : : */
4672 : :
1115 tomas.vondra@postgre 4673 : 286 : stats_params: stats_param { $$ = list_make1($1); }
4674 : 461 : | stats_params ',' stats_param { $$ = lappend($1, $3); }
4675 : : ;
4676 : :
4677 : : stats_param: ColId
4678 : : {
4679 : 531 : $$ = makeNode(StatsElem);
4680 : 531 : $$->name = $1;
4681 : 531 : $$->expr = NULL;
4682 : : }
4683 : : | func_expr_windowless
4684 : : {
4685 : 10 : $$ = makeNode(StatsElem);
4686 : 10 : $$->name = NULL;
4687 : 10 : $$->expr = $1;
4688 : : }
4689 : : | '(' a_expr ')'
4690 : : {
4691 : 206 : $$ = makeNode(StatsElem);
4692 : 206 : $$->name = NULL;
4693 : 206 : $$->expr = $2;
4694 : : }
4695 : : ;
4696 : :
4697 : : /*****************************************************************************
4698 : : *
4699 : : * QUERY :
4700 : : * ALTER STATISTICS [IF EXISTS] stats_name
4701 : : * SET STATISTICS <SignedIconst>
4702 : : *
4703 : : *****************************************************************************/
4704 : :
4705 : : AlterStatsStmt:
4706 : : ALTER STATISTICS any_name SET STATISTICS set_statistics_value
4707 : : {
1678 4708 : 10 : AlterStatsStmt *n = makeNode(AlterStatsStmt);
4709 : :
4710 : 10 : n->defnames = $3;
4711 : 10 : n->missing_ok = false;
4712 : 10 : n->stxstattarget = $6;
702 peter@eisentraut.org 4713 : 10 : $$ = (Node *) n;
4714 : : }
4715 : : | ALTER STATISTICS IF_P EXISTS any_name SET STATISTICS set_statistics_value
4716 : : {
1678 tomas.vondra@postgre 4717 : 3 : AlterStatsStmt *n = makeNode(AlterStatsStmt);
4718 : :
4719 : 3 : n->defnames = $5;
4720 : 3 : n->missing_ok = true;
4721 : 3 : n->stxstattarget = $8;
702 peter@eisentraut.org 4722 : 3 : $$ = (Node *) n;
4723 : : }
4724 : : ;
4725 : :
4726 : : /*****************************************************************************
4727 : : *
4728 : : * QUERY :
4729 : : * CREATE TABLE relname AS SelectStmt [ WITH [NO] DATA ]
4730 : : *
4731 : : *
4732 : : * Note: SELECT ... INTO is a now-deprecated alternative for this.
4733 : : *
4734 : : *****************************************************************************/
4735 : :
4736 : : CreateAsStmt:
4737 : : CREATE OptTemp TABLE create_as_target AS SelectStmt opt_with_data
4738 : : {
4409 tgl@sss.pgh.pa.us 4739 : 561 : CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt);
4740 : :
4741 : 561 : ctas->query = $6;
4742 : 561 : ctas->into = $4;
1373 michael@paquier.xyz 4743 : 561 : ctas->objtype = OBJECT_TABLE;
4409 tgl@sss.pgh.pa.us 4744 : 561 : ctas->is_select_into = false;
3410 andrew@dunslane.net 4745 : 561 : ctas->if_not_exists = false;
4746 : : /* cram additional flags into the IntoClause */
4525 tgl@sss.pgh.pa.us 4747 : 561 : $4->rel->relpersistence = $2;
4748 : 561 : $4->skipData = !($7);
4409 4749 : 561 : $$ = (Node *) ctas;
4750 : : }
4751 : : | CREATE OptTemp TABLE IF_P NOT EXISTS create_as_target AS SelectStmt opt_with_data
4752 : : {
3410 andrew@dunslane.net 4753 : 25 : CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt);
4754 : :
4755 : 25 : ctas->query = $9;
4756 : 25 : ctas->into = $7;
1373 michael@paquier.xyz 4757 : 25 : ctas->objtype = OBJECT_TABLE;
3410 andrew@dunslane.net 4758 : 25 : ctas->is_select_into = false;
4759 : 25 : ctas->if_not_exists = true;
4760 : : /* cram additional flags into the IntoClause */
4761 : 25 : $7->rel->relpersistence = $2;
4762 : 25 : $7->skipData = !($10);
4763 : 25 : $$ = (Node *) ctas;
4764 : : }
4765 : : ;
4766 : :
4767 : : create_as_target:
4768 : : qualified_name opt_column_list table_access_method_clause
4769 : : OptWith OnCommitOption OptTableSpace
4770 : : {
6263 tgl@sss.pgh.pa.us 4771 : 628 : $$ = makeNode(IntoClause);
4772 : 628 : $$->rel = $1;
4773 : 628 : $$->colNames = $2;
1866 andres@anarazel.de 4774 : 628 : $$->accessMethod = $3;
4775 : 628 : $$->options = $4;
4776 : 628 : $$->onCommit = $5;
4777 : 628 : $$->tableSpaceName = $6;
4020 tgl@sss.pgh.pa.us 4778 : 628 : $$->viewQuery = NULL;
4525 4779 : 628 : $$->skipData = false; /* might get changed later */
4780 : : }
4781 : : ;
4782 : :
4783 : : opt_with_data:
2433 peter_e@gmx.net 4784 : 18 : WITH DATA_P { $$ = true; }
4785 : 105 : | WITH NO DATA_P { $$ = false; }
4786 : 913 : | /*EMPTY*/ { $$ = true; }
4787 : : ;
4788 : :
4789 : :
4790 : : /*****************************************************************************
4791 : : *
4792 : : * QUERY :
4793 : : * CREATE MATERIALIZED VIEW relname AS SelectStmt
4794 : : *
4795 : : *****************************************************************************/
4796 : :
4797 : : CreateMatViewStmt:
4798 : : CREATE OptNoLog MATERIALIZED VIEW create_mv_target AS SelectStmt opt_with_data
4799 : : {
4060 kgrittn@postgresql.o 4800 : 255 : CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt);
4801 : :
4802 : 255 : ctas->query = $7;
4803 : 255 : ctas->into = $5;
1373 michael@paquier.xyz 4804 : 255 : ctas->objtype = OBJECT_MATVIEW;
4060 kgrittn@postgresql.o 4805 : 255 : ctas->is_select_into = false;
3410 andrew@dunslane.net 4806 : 255 : ctas->if_not_exists = false;
4807 : : /* cram additional flags into the IntoClause */
4060 kgrittn@postgresql.o 4808 : 255 : $5->rel->relpersistence = $2;
4809 : 255 : $5->skipData = !($8);
4810 : 255 : $$ = (Node *) ctas;
4811 : : }
4812 : : | CREATE OptNoLog MATERIALIZED VIEW IF_P NOT EXISTS create_mv_target AS SelectStmt opt_with_data
4813 : : {
3410 andrew@dunslane.net 4814 : 24 : CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt);
4815 : :
4816 : 24 : ctas->query = $10;
4817 : 24 : ctas->into = $8;
1373 michael@paquier.xyz 4818 : 24 : ctas->objtype = OBJECT_MATVIEW;
3410 andrew@dunslane.net 4819 : 24 : ctas->is_select_into = false;
4820 : 24 : ctas->if_not_exists = true;
4821 : : /* cram additional flags into the IntoClause */
4822 : 24 : $8->rel->relpersistence = $2;
4823 : 24 : $8->skipData = !($11);
4824 : 24 : $$ = (Node *) ctas;
4825 : : }
4826 : : ;
4827 : :
4828 : : create_mv_target:
4829 : : qualified_name opt_column_list table_access_method_clause opt_reloptions OptTableSpace
4830 : : {
4060 kgrittn@postgresql.o 4831 : 279 : $$ = makeNode(IntoClause);
4832 : 279 : $$->rel = $1;
4833 : 279 : $$->colNames = $2;
1866 andres@anarazel.de 4834 : 279 : $$->accessMethod = $3;
4835 : 279 : $$->options = $4;
4060 kgrittn@postgresql.o 4836 : 279 : $$->onCommit = ONCOMMIT_NOOP;
1866 andres@anarazel.de 4837 : 279 : $$->tableSpaceName = $5;
4020 tgl@sss.pgh.pa.us 4838 : 279 : $$->viewQuery = NULL; /* filled at analysis time */
4060 kgrittn@postgresql.o 4839 : 279 : $$->skipData = false; /* might get changed later */
4840 : : }
4841 : : ;
4842 : :
4060 kgrittn@postgresql.o 4843 :UBC 0 : OptNoLog: UNLOGGED { $$ = RELPERSISTENCE_UNLOGGED; }
4060 kgrittn@postgresql.o 4844 :CBC 279 : | /*EMPTY*/ { $$ = RELPERSISTENCE_PERMANENT; }
4845 : : ;
4846 : :
4847 : :
4848 : : /*****************************************************************************
4849 : : *
4850 : : * QUERY :
4851 : : * REFRESH MATERIALIZED VIEW qualified_name
4852 : : *
4853 : : *****************************************************************************/
4854 : :
4855 : : RefreshMatViewStmt:
4856 : : REFRESH MATERIALIZED VIEW opt_concurrently qualified_name opt_with_data
4857 : : {
4858 : 129 : RefreshMatViewStmt *n = makeNode(RefreshMatViewStmt);
4859 : :
3925 4860 : 129 : n->concurrent = $4;
4861 : 129 : n->relation = $5;
4862 : 129 : n->skipData = !($6);
4060 4863 : 129 : $$ = (Node *) n;
4864 : : }
4865 : : ;
4866 : :
4867 : :
4868 : : /*****************************************************************************
4869 : : *
4870 : : * QUERY :
4871 : : * CREATE SEQUENCE seqname
4872 : : * ALTER SEQUENCE seqname
4873 : : *
4874 : : *****************************************************************************/
4875 : :
4876 : : CreateSeqStmt:
4877 : : CREATE OptTemp SEQUENCE qualified_name OptSeqOptList
4878 : : {
9715 bruce@momjian.us 4879 : 311 : CreateSeqStmt *n = makeNode(CreateSeqStmt);
4880 : :
4871 rhaas@postgresql.org 4881 : 311 : $4->relpersistence = $2;
8060 tgl@sss.pgh.pa.us 4882 : 311 : n->sequence = $4;
8331 bruce@momjian.us 4883 : 311 : n->options = $5;
4988 tgl@sss.pgh.pa.us 4884 : 311 : n->ownerId = InvalidOid;
3519 heikki.linnakangas@i 4885 : 311 : n->if_not_exists = false;
702 peter@eisentraut.org 4886 : 311 : $$ = (Node *) n;
4887 : : }
4888 : : | CREATE OptTemp SEQUENCE IF_P NOT EXISTS qualified_name OptSeqOptList
4889 : : {
3519 heikki.linnakangas@i 4890 : 12 : CreateSeqStmt *n = makeNode(CreateSeqStmt);
4891 : :
4892 : 12 : $7->relpersistence = $2;
4893 : 12 : n->sequence = $7;
4894 : 12 : n->options = $8;
4895 : 12 : n->ownerId = InvalidOid;
4896 : 12 : n->if_not_exists = true;
702 peter@eisentraut.org 4897 : 12 : $$ = (Node *) n;
4898 : : }
4899 : : ;
4900 : :
4901 : : AlterSeqStmt:
4902 : : ALTER SEQUENCE qualified_name SeqOptList
4903 : : {
7696 bruce@momjian.us 4904 : 92 : AlterSeqStmt *n = makeNode(AlterSeqStmt);
4905 : :
4906 : 92 : n->sequence = $3;
4907 : 92 : n->options = $4;
4465 simon@2ndQuadrant.co 4908 : 92 : n->missing_ok = false;
702 peter@eisentraut.org 4909 : 92 : $$ = (Node *) n;
4910 : : }
4911 : : | ALTER SEQUENCE IF_P EXISTS qualified_name SeqOptList
4912 : : {
4465 simon@2ndQuadrant.co 4913 : 6 : AlterSeqStmt *n = makeNode(AlterSeqStmt);
4914 : :
4915 : 6 : n->sequence = $5;
4916 : 6 : n->options = $6;
4917 : 6 : n->missing_ok = true;
702 peter@eisentraut.org 4918 : 6 : $$ = (Node *) n;
4919 : : }
4920 : :
4921 : : ;
4922 : :
5782 tgl@sss.pgh.pa.us 4923 : 123 : OptSeqOptList: SeqOptList { $$ = $1; }
7923 4924 : 200 : | /*EMPTY*/ { $$ = NIL; }
4925 : : ;
4926 : :
2565 peter_e@gmx.net 4927 : 34 : OptParenthesizedSeqOptList: '(' SeqOptList ')' { $$ = $2; }
4928 : 182 : | /*EMPTY*/ { $$ = NIL; }
4929 : : ;
4930 : :
5782 tgl@sss.pgh.pa.us 4931 : 255 : SeqOptList: SeqOptElem { $$ = list_make1($1); }
4932 : 372 : | SeqOptList SeqOptElem { $$ = lappend($1, $2); }
4933 : : ;
4934 : :
4935 : : SeqOptElem: AS SimpleTypename
4936 : : {
702 peter@eisentraut.org 4937 : 95 : $$ = makeDefElem("as", (Node *) $2, @1);
4938 : : }
4939 : : | CACHE NumericOnly
4940 : : {
4941 : 58 : $$ = makeDefElem("cache", (Node *) $2, @1);
4942 : : }
4943 : : | CYCLE
4944 : : {
4945 : 17 : $$ = makeDefElem("cycle", (Node *) makeBoolean(true), @1);
4946 : : }
4947 : : | NO CYCLE
4948 : : {
4949 : 7 : $$ = makeDefElem("cycle", (Node *) makeBoolean(false), @1);
4950 : : }
4951 : : | INCREMENT opt_by NumericOnly
4952 : : {
4953 : 118 : $$ = makeDefElem("increment", (Node *) $3, @1);
4954 : : }
4955 : : | MAXVALUE NumericOnly
4956 : : {
4957 : 34 : $$ = makeDefElem("maxvalue", (Node *) $2, @1);
4958 : : }
4959 : : | MINVALUE NumericOnly
4960 : : {
4961 : 36 : $$ = makeDefElem("minvalue", (Node *) $2, @1);
4962 : : }
4963 : : | NO MAXVALUE
4964 : : {
2777 peter_e@gmx.net 4965 : 47 : $$ = makeDefElem("maxvalue", NULL, @1);
4966 : : }
4967 : : | NO MINVALUE
4968 : : {
4969 : 47 : $$ = makeDefElem("minvalue", NULL, @1);
4970 : : }
4971 : : | OWNED BY any_name
4972 : : {
702 peter@eisentraut.org 4973 : 36 : $$ = makeDefElem("owned_by", (Node *) $3, @1);
4974 : : }
4975 : : | SEQUENCE NAME_P any_name
4976 : : {
4977 : : /* not documented, only used by pg_dump */
4978 : 19 : $$ = makeDefElem("sequence_name", (Node *) $3, @1);
4979 : : }
4980 : : | START opt_with NumericOnly
4981 : : {
4982 : 107 : $$ = makeDefElem("start", (Node *) $3, @1);
4983 : : }
4984 : : | RESTART
4985 : : {
2777 peter_e@gmx.net 4986 : 3 : $$ = makeDefElem("restart", NULL, @1);
4987 : : }
4988 : : | RESTART opt_with NumericOnly
4989 : : {
702 peter@eisentraut.org 4990 : 30 : $$ = makeDefElem("restart", (Node *) $3, @1);
4991 : : }
4992 : : ;
4993 : :
4994 : : opt_by: BY
4995 : : | /* EMPTY */
4996 : : ;
4997 : :
4998 : : NumericOnly:
948 4999 : 158 : FCONST { $$ = (Node *) makeFloat($1); }
948 peter@eisentraut.org 5000 :UBC 0 : | '+' FCONST { $$ = (Node *) makeFloat($2); }
5001 : : | '-' FCONST
5002 : : {
702 peter@eisentraut.org 5003 :CBC 10 : Float *f = makeFloat($2);
5004 : :
948 5005 : 10 : doNegateFloat(f);
5006 : 10 : $$ = (Node *) f;
5007 : : }
5008 : 5275 : | SignedIconst { $$ = (Node *) makeInteger($1); }
5009 : : ;
5010 : :
5054 rhaas@postgresql.org 5011 : 40 : NumericOnly_list: NumericOnly { $$ = list_make1($1); }
5012 : 3 : | NumericOnly_list ',' NumericOnly { $$ = lappend($1, $3); }
5013 : : ;
5014 : :
5015 : : /*****************************************************************************
5016 : : *
5017 : : * QUERIES :
5018 : : * CREATE [OR REPLACE] [TRUSTED] [PROCEDURAL] LANGUAGE ...
5019 : : * DROP [PROCEDURAL] LANGUAGE ...
5020 : : *
5021 : : *****************************************************************************/
5022 : :
5023 : : CreatePLangStmt:
5024 : : CREATE opt_or_replace opt_trusted opt_procedural LANGUAGE name
5025 : : {
5026 : : /*
5027 : : * We now interpret parameterless CREATE LANGUAGE as
5028 : : * CREATE EXTENSION. "OR REPLACE" is silently translated
5029 : : * to "IF NOT EXISTS", which isn't quite the same, but
5030 : : * seems more useful than throwing an error. We just
5031 : : * ignore TRUSTED, as the previous code would have too.
5032 : : */
1537 tgl@sss.pgh.pa.us 5033 :UBC 0 : CreateExtensionStmt *n = makeNode(CreateExtensionStmt);
5034 : :
5035 : 0 : n->if_not_exists = $2;
5036 : 0 : n->extname = $6;
5037 : 0 : n->options = NIL;
702 peter@eisentraut.org 5038 : 0 : $$ = (Node *) n;
5039 : : }
5040 : : | CREATE opt_or_replace opt_trusted opt_procedural LANGUAGE name
5041 : : HANDLER handler_name opt_inline_handler opt_validator
5042 : : {
9665 vadim4o@yahoo.com 5043 :CBC 60 : CreatePLangStmt *n = makeNode(CreatePLangStmt);
5044 : :
5164 tgl@sss.pgh.pa.us 5045 : 60 : n->replace = $2;
5046 : 60 : n->plname = $6;
5047 : 60 : n->plhandler = $8;
5048 : 60 : n->plinline = $9;
5049 : 60 : n->plvalidator = $10;
5050 : 60 : n->pltrusted = $3;
702 peter@eisentraut.org 5051 : 60 : $$ = (Node *) n;
5052 : : }
5053 : : ;
5054 : :
5055 : : opt_trusted:
2433 peter_e@gmx.net 5056 : 45 : TRUSTED { $$ = true; }
5057 : 18 : | /*EMPTY*/ { $$ = false; }
5058 : : ;
5059 : :
5060 : : /* This ought to be just func_name, but that causes reduce/reduce conflicts
5061 : : * (CREATE LANGUAGE is the only place where func_name isn't followed by '(').
5062 : : * Work around by using simple names, instead.
5063 : : */
5064 : : handler_name:
7249 tgl@sss.pgh.pa.us 5065 : 243 : name { $$ = list_make1(makeString($1)); }
5066 : 1 : | name attrs { $$ = lcons(makeString($1), $2); }
5067 : : ;
5068 : :
5069 : : opt_inline_handler:
5318 5070 : 51 : INLINE_P handler_name { $$ = $2; }
5071 : 9 : | /*EMPTY*/ { $$ = NIL; }
5072 : : ;
5073 : :
5074 : : validator_clause:
6796 5075 : 51 : VALIDATOR handler_name { $$ = $2; }
5528 peter_e@gmx.net 5076 :UBC 0 : | NO VALIDATOR { $$ = NIL; }
5077 : : ;
5078 : :
5079 : : opt_validator:
5528 peter_e@gmx.net 5080 :CBC 51 : validator_clause { $$ = $1; }
6796 tgl@sss.pgh.pa.us 5081 : 9 : | /*EMPTY*/ { $$ = NIL; }
5082 : : ;
5083 : :
5084 : : opt_procedural:
5085 : : PROCEDURAL
5086 : : | /*EMPTY*/
5087 : : ;
5088 : :
5089 : : /*****************************************************************************
5090 : : *
5091 : : * QUERY:
5092 : : * CREATE TABLESPACE tablespace LOCATION '/path/to/tablespace/'
5093 : : *
5094 : : *****************************************************************************/
5095 : :
5096 : : CreateTableSpaceStmt: CREATE TABLESPACE name OptTableSpaceOwner LOCATION Sconst opt_reloptions
5097 : : {
7240 5098 : 56 : CreateTableSpaceStmt *n = makeNode(CreateTableSpaceStmt);
5099 : :
5100 : 56 : n->tablespacename = $3;
5101 : 56 : n->owner = $4;
5102 : 56 : n->location = $6;
3739 sfrost@snowman.net 5103 : 56 : n->options = $7;
7240 tgl@sss.pgh.pa.us 5104 : 56 : $$ = (Node *) n;
5105 : : }
5106 : : ;
5107 : :
3324 alvherre@alvh.no-ip. 5108 :GBC 1 : OptTableSpaceOwner: OWNER RoleSpec { $$ = $2; }
7240 tgl@sss.pgh.pa.us 5109 :CBC 55 : | /*EMPTY */ { $$ = NULL; }
5110 : : ;
5111 : :
5112 : : /*****************************************************************************
5113 : : *
5114 : : * QUERY :
5115 : : * DROP TABLESPACE <tablespace>
5116 : : *
5117 : : * No need for drop behaviour as we cannot implement dependencies for
5118 : : * objects in other databases; we can only support RESTRICT.
5119 : : *
5120 : : ****************************************************************************/
5121 : :
5122 : : DropTableSpaceStmt: DROP TABLESPACE name
5123 : : {
5124 : 32 : DropTableSpaceStmt *n = makeNode(DropTableSpaceStmt);
5125 : :
5126 : 32 : n->tablespacename = $3;
6512 andrew@dunslane.net 5127 : 32 : n->missing_ok = false;
5128 : 32 : $$ = (Node *) n;
5129 : : }
5130 : : | DROP TABLESPACE IF_P EXISTS name
5131 : : {
6512 andrew@dunslane.net 5132 :UBC 0 : DropTableSpaceStmt *n = makeNode(DropTableSpaceStmt);
5133 : :
5134 : 0 : n->tablespacename = $5;
5135 : 0 : n->missing_ok = true;
7240 tgl@sss.pgh.pa.us 5136 : 0 : $$ = (Node *) n;
5137 : : }
5138 : : ;
5139 : :
5140 : : /*****************************************************************************
5141 : : *
5142 : : * QUERY:
5143 : : * CREATE EXTENSION extension
5144 : : * [ WITH ] [ SCHEMA schema ] [ VERSION version ]
5145 : : *
5146 : : *****************************************************************************/
5147 : :
5148 : : CreateExtensionStmt: CREATE EXTENSION name opt_with create_extension_opt_list
5149 : : {
4814 tgl@sss.pgh.pa.us 5150 :CBC 206 : CreateExtensionStmt *n = makeNode(CreateExtensionStmt);
5151 : :
5152 : 206 : n->extname = $3;
4790 5153 : 206 : n->if_not_exists = false;
4814 5154 : 206 : n->options = $5;
5155 : 206 : $$ = (Node *) n;
5156 : : }
5157 : : | CREATE EXTENSION IF_P NOT EXISTS name opt_with create_extension_opt_list
5158 : : {
4790 5159 : 7 : CreateExtensionStmt *n = makeNode(CreateExtensionStmt);
5160 : :
5161 : 7 : n->extname = $6;
5162 : 7 : n->if_not_exists = true;
5163 : 7 : n->options = $8;
5164 : 7 : $$ = (Node *) n;
5165 : : }
5166 : : ;
5167 : :
5168 : : create_extension_opt_list:
5169 : : create_extension_opt_list create_extension_opt_item
4814 5170 : 48 : { $$ = lappend($1, $2); }
5171 : : | /* EMPTY */
5172 : 213 : { $$ = NIL; }
5173 : : ;
5174 : :
5175 : : create_extension_opt_item:
5176 : : SCHEMA name
5177 : : {
702 peter@eisentraut.org 5178 : 22 : $$ = makeDefElem("schema", (Node *) makeString($2), @1);
5179 : : }
5180 : : | VERSION_P NonReservedWord_or_Sconst
5181 : : {
5182 : 6 : $$ = makeDefElem("new_version", (Node *) makeString($2), @1);
5183 : : }
5184 : : | FROM NonReservedWord_or_Sconst
5185 : : {
1516 tgl@sss.pgh.pa.us 5186 [ # # ]:UBC 0 : ereport(ERROR,
5187 : : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5188 : : errmsg("CREATE EXTENSION ... FROM is no longer supported"),
5189 : : parser_errposition(@1)));
5190 : : }
5191 : : | CASCADE
5192 : : {
702 peter@eisentraut.org 5193 :CBC 20 : $$ = makeDefElem("cascade", (Node *) makeBoolean(true), @1);
5194 : : }
5195 : : ;
5196 : :
5197 : : /*****************************************************************************
5198 : : *
5199 : : * ALTER EXTENSION name UPDATE [ TO version ]
5200 : : *
5201 : : *****************************************************************************/
5202 : :
5203 : : AlterExtensionStmt: ALTER EXTENSION name UPDATE alter_extension_opt_list
5204 : : {
4811 tgl@sss.pgh.pa.us 5205 : 14 : AlterExtensionStmt *n = makeNode(AlterExtensionStmt);
5206 : :
5207 : 14 : n->extname = $3;
5208 : 14 : n->options = $5;
5209 : 14 : $$ = (Node *) n;
5210 : : }
5211 : : ;
5212 : :
5213 : : alter_extension_opt_list:
5214 : : alter_extension_opt_list alter_extension_opt_item
5215 : 14 : { $$ = lappend($1, $2); }
5216 : : | /* EMPTY */
5217 : 14 : { $$ = NIL; }
5218 : : ;
5219 : :
5220 : : alter_extension_opt_item:
5221 : : TO NonReservedWord_or_Sconst
5222 : : {
702 peter@eisentraut.org 5223 : 14 : $$ = makeDefElem("new_version", (Node *) makeString($2), @1);
5224 : : }
5225 : : ;
5226 : :
5227 : : /*****************************************************************************
5228 : : *
5229 : : * ALTER EXTENSION name ADD/DROP object-identifier
5230 : : *
5231 : : *****************************************************************************/
5232 : :
5233 : : AlterExtensionContentsStmt:
5234 : : ALTER EXTENSION name add_drop object_type_name name
5235 : : {
2751 tgl@sss.pgh.pa.us 5236 : 9 : AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
5237 : :
5238 : 9 : n->extname = $3;
5239 : 9 : n->action = $4;
1401 peter@eisentraut.org 5240 : 9 : n->objtype = $5;
5241 : 9 : n->object = (Node *) makeString($6);
702 5242 : 9 : $$ = (Node *) n;
5243 : : }
5244 : : | ALTER EXTENSION name add_drop object_type_any_name any_name
5245 : : {
4812 tgl@sss.pgh.pa.us 5246 : 29 : AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
5247 : :
4813 5248 : 29 : n->extname = $3;
4812 5249 : 29 : n->action = $4;
1401 peter@eisentraut.org 5250 : 29 : n->objtype = $5;
2710 peter_e@gmx.net 5251 : 29 : n->object = (Node *) $6;
702 peter@eisentraut.org 5252 : 29 : $$ = (Node *) n;
5253 : : }
5254 : : | ALTER EXTENSION name add_drop AGGREGATE aggregate_with_argtypes
5255 : : {
4810 peter_e@gmx.net 5256 : 4 : AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
5257 : :
5258 : 4 : n->extname = $3;
5259 : 4 : n->action = $4;
1401 peter@eisentraut.org 5260 : 4 : n->objtype = OBJECT_AGGREGATE;
2710 peter_e@gmx.net 5261 : 4 : n->object = (Node *) $6;
702 peter@eisentraut.org 5262 : 4 : $$ = (Node *) n;
5263 : : }
5264 : : | ALTER EXTENSION name add_drop CAST '(' Typename AS Typename ')'
5265 : : {
4812 tgl@sss.pgh.pa.us 5266 : 2 : AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
5267 : :
4813 5268 : 2 : n->extname = $3;
4812 5269 : 2 : n->action = $4;
1401 peter@eisentraut.org 5270 : 2 : n->objtype = OBJECT_CAST;
5271 : 2 : n->object = (Node *) list_make2($7, $9);
5272 : 2 : $$ = (Node *) n;
5273 : : }
5274 : : | ALTER EXTENSION name add_drop DOMAIN_P Typename
5275 : : {
4812 tgl@sss.pgh.pa.us 5276 :UBC 0 : AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
5277 : :
4813 5278 : 0 : n->extname = $3;
4812 5279 : 0 : n->action = $4;
4813 5280 : 0 : n->objtype = OBJECT_DOMAIN;
2710 peter_e@gmx.net 5281 : 0 : n->object = (Node *) $6;
702 peter@eisentraut.org 5282 : 0 : $$ = (Node *) n;
5283 : : }
5284 : : | ALTER EXTENSION name add_drop FUNCTION function_with_argtypes
5285 : : {
4812 tgl@sss.pgh.pa.us 5286 :CBC 37 : AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
5287 : :
4813 5288 : 37 : n->extname = $3;
4812 5289 : 37 : n->action = $4;
4813 5290 : 37 : n->objtype = OBJECT_FUNCTION;
2710 peter_e@gmx.net 5291 : 37 : n->object = (Node *) $6;
702 peter@eisentraut.org 5292 : 37 : $$ = (Node *) n;
5293 : : }
5294 : : | ALTER EXTENSION name add_drop OPERATOR operator_with_argtypes
5295 : : {
4812 tgl@sss.pgh.pa.us 5296 : 9 : AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
5297 : :
4813 5298 : 9 : n->extname = $3;
4812 5299 : 9 : n->action = $4;
4813 5300 : 9 : n->objtype = OBJECT_OPERATOR;
2710 peter_e@gmx.net 5301 : 9 : n->object = (Node *) $6;
702 peter@eisentraut.org 5302 : 9 : $$ = (Node *) n;
5303 : : }
5304 : : | ALTER EXTENSION name add_drop OPERATOR CLASS any_name USING name
5305 : : {
4812 tgl@sss.pgh.pa.us 5306 : 2 : AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
5307 : :
4813 5308 : 2 : n->extname = $3;
4812 5309 : 2 : n->action = $4;
4813 5310 : 2 : n->objtype = OBJECT_OPCLASS;
2710 peter_e@gmx.net 5311 : 2 : n->object = (Node *) lcons(makeString($9), $7);
702 peter@eisentraut.org 5312 : 2 : $$ = (Node *) n;
5313 : : }
5314 : : | ALTER EXTENSION name add_drop OPERATOR FAMILY any_name USING name
5315 : : {
4812 tgl@sss.pgh.pa.us 5316 : 2 : AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
5317 : :
4813 5318 : 2 : n->extname = $3;
4812 5319 : 2 : n->action = $4;
4813 5320 : 2 : n->objtype = OBJECT_OPFAMILY;
2710 peter_e@gmx.net 5321 : 2 : n->object = (Node *) lcons(makeString($9), $7);
702 peter@eisentraut.org 5322 : 2 : $$ = (Node *) n;
5323 : : }
5324 : : | ALTER EXTENSION name add_drop PROCEDURE function_with_argtypes
5325 : : {
2327 peter_e@gmx.net 5326 :UBC 0 : AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
5327 : :
5328 : 0 : n->extname = $3;
5329 : 0 : n->action = $4;
5330 : 0 : n->objtype = OBJECT_PROCEDURE;
5331 : 0 : n->object = (Node *) $6;
702 peter@eisentraut.org 5332 : 0 : $$ = (Node *) n;
5333 : : }
5334 : : | ALTER EXTENSION name add_drop ROUTINE function_with_argtypes
5335 : : {
2327 peter_e@gmx.net 5336 : 0 : AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
5337 : :
5338 : 0 : n->extname = $3;
5339 : 0 : n->action = $4;
5340 : 0 : n->objtype = OBJECT_ROUTINE;
5341 : 0 : n->object = (Node *) $6;
702 peter@eisentraut.org 5342 : 0 : $$ = (Node *) n;
5343 : : }
5344 : : | ALTER EXTENSION name add_drop TRANSFORM FOR Typename LANGUAGE name
5345 : : {
3276 peter_e@gmx.net 5346 :CBC 2 : AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
5347 : :
5348 : 2 : n->extname = $3;
5349 : 2 : n->action = $4;
5350 : 2 : n->objtype = OBJECT_TRANSFORM;
2710 5351 : 2 : n->object = (Node *) list_make2($7, makeString($9));
702 peter@eisentraut.org 5352 : 2 : $$ = (Node *) n;
5353 : : }
5354 : : | ALTER EXTENSION name add_drop TYPE_P Typename
5355 : : {
4812 tgl@sss.pgh.pa.us 5356 : 4 : AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
5357 : :
4813 5358 : 4 : n->extname = $3;
4812 5359 : 4 : n->action = $4;
4813 5360 : 4 : n->objtype = OBJECT_TYPE;
2710 peter_e@gmx.net 5361 : 4 : n->object = (Node *) $6;
702 peter@eisentraut.org 5362 : 4 : $$ = (Node *) n;
5363 : : }
5364 : : ;
5365 : :
5366 : : /*****************************************************************************
5367 : : *
5368 : : * QUERY:
5369 : : * CREATE FOREIGN DATA WRAPPER name options
5370 : : *
5371 : : *****************************************************************************/
5372 : :
5373 : : CreateFdwStmt: CREATE FOREIGN DATA_P WRAPPER name opt_fdw_options create_generic_options
5374 : : {
5595 peter_e@gmx.net 5375 : 97 : CreateFdwStmt *n = makeNode(CreateFdwStmt);
5376 : :
5377 : 97 : n->fdwname = $5;
4803 tgl@sss.pgh.pa.us 5378 : 97 : n->func_options = $6;
5528 peter_e@gmx.net 5379 : 97 : n->options = $7;
5595 5380 : 97 : $$ = (Node *) n;
5381 : : }
5382 : : ;
5383 : :
5384 : : fdw_option:
702 peter@eisentraut.org 5385 : 28 : HANDLER handler_name { $$ = makeDefElem("handler", (Node *) $2, @1); }
2777 peter_e@gmx.net 5386 :UBC 0 : | NO HANDLER { $$ = makeDefElem("handler", NULL, @1); }
702 peter@eisentraut.org 5387 :CBC 24 : | VALIDATOR handler_name { $$ = makeDefElem("validator", (Node *) $2, @1); }
2777 peter_e@gmx.net 5388 : 3 : | NO VALIDATOR { $$ = makeDefElem("validator", NULL, @1); }
5389 : : ;
5390 : :
5391 : : fdw_options:
4803 tgl@sss.pgh.pa.us 5392 : 45 : fdw_option { $$ = list_make1($1); }
5393 : 10 : | fdw_options fdw_option { $$ = lappend($1, $2); }
5394 : : ;
5395 : :
5396 : : opt_fdw_options:
5397 : 27 : fdw_options { $$ = $1; }
5398 : 116 : | /*EMPTY*/ { $$ = NIL; }
5399 : : ;
5400 : :
5401 : : /*****************************************************************************
5402 : : *
5403 : : * QUERY :
5404 : : * ALTER FOREIGN DATA WRAPPER name options
5405 : : *
5406 : : ****************************************************************************/
5407 : :
5408 : : AlterFdwStmt: ALTER FOREIGN DATA_P WRAPPER name opt_fdw_options alter_generic_options
5409 : : {
5595 peter_e@gmx.net 5410 : 43 : AlterFdwStmt *n = makeNode(AlterFdwStmt);
5411 : :
5412 : 43 : n->fdwname = $5;
4803 tgl@sss.pgh.pa.us 5413 : 43 : n->func_options = $6;
5528 peter_e@gmx.net 5414 : 43 : n->options = $7;
5595 5415 : 43 : $$ = (Node *) n;
5416 : : }
5417 : : | ALTER FOREIGN DATA_P WRAPPER name fdw_options
5418 : : {
5419 : 18 : AlterFdwStmt *n = makeNode(AlterFdwStmt);
5420 : :
5421 : 18 : n->fdwname = $5;
4803 tgl@sss.pgh.pa.us 5422 : 18 : n->func_options = $6;
5423 : 18 : n->options = NIL;
5595 peter_e@gmx.net 5424 : 18 : $$ = (Node *) n;
5425 : : }
5426 : : ;
5427 : :
5428 : : /* Options definition for CREATE FDW, SERVER and USER MAPPING */
5429 : : create_generic_options:
5489 tgl@sss.pgh.pa.us 5430 : 348 : OPTIONS '(' generic_option_list ')' { $$ = $3; }
5431 : 31579 : | /*EMPTY*/ { $$ = NIL; }
5432 : : ;
5433 : :
5434 : : generic_option_list:
5435 : : generic_option_elem
5436 : : {
5437 : 348 : $$ = list_make1($1);
5438 : : }
5439 : : | generic_option_list ',' generic_option_elem
5440 : : {
5441 : 222 : $$ = lappend($1, $3);
5442 : : }
5443 : : ;
5444 : :
5445 : : /* Options definition for ALTER FDW, SERVER and USER MAPPING */
5446 : : alter_generic_options:
5447 : 239 : OPTIONS '(' alter_generic_option_list ')' { $$ = $3; }
5448 : : ;
5449 : :
5450 : : alter_generic_option_list:
5451 : : alter_generic_option_elem
5452 : : {
5453 : 239 : $$ = list_make1($1);
5454 : : }
5455 : : | alter_generic_option_list ',' alter_generic_option_elem
5456 : : {
5457 : 84 : $$ = lappend($1, $3);
5458 : : }
5459 : : ;
5460 : :
5461 : : alter_generic_option_elem:
5462 : : generic_option_elem
5463 : : {
5464 : 100 : $$ = $1;
5465 : : }
5466 : : | SET generic_option_elem
5467 : : {
5468 : 62 : $$ = $2;
5469 : 62 : $$->defaction = DEFELEM_SET;
5470 : : }
5471 : : | ADD_P generic_option_elem
5472 : : {
5473 : 98 : $$ = $2;
5474 : 98 : $$->defaction = DEFELEM_ADD;
5475 : : }
5476 : : | DROP generic_option_name
5477 : : {
2777 peter_e@gmx.net 5478 : 63 : $$ = makeDefElemExtended(NULL, $2, NULL, DEFELEM_DROP, @2);
5479 : : }
5480 : : ;
5481 : :
5482 : : generic_option_elem:
5483 : : generic_option_name generic_option_arg
5484 : : {
5485 : 830 : $$ = makeDefElem($1, $2, @1);
5486 : : }
5487 : : ;
5488 : :
5489 : : generic_option_name:
5489 tgl@sss.pgh.pa.us 5490 : 893 : ColLabel { $$ = $1; }
5491 : : ;
5492 : :
5493 : : /* We could use def_arg here, but the spec only requires string literals */
5494 : : generic_option_arg:
5495 : 830 : Sconst { $$ = (Node *) makeString($1); }
5496 : : ;
5497 : :
5498 : : /*****************************************************************************
5499 : : *
5500 : : * QUERY:
5501 : : * CREATE SERVER name [TYPE] [VERSION] [OPTIONS]
5502 : : *
5503 : : *****************************************************************************/
5504 : :
5505 : : CreateForeignServerStmt: CREATE SERVER name opt_type opt_foreign_server_version
5506 : : FOREIGN DATA_P WRAPPER name create_generic_options
5507 : : {
5595 peter_e@gmx.net 5508 : 126 : CreateForeignServerStmt *n = makeNode(CreateForeignServerStmt);
5509 : :
5510 : 126 : n->servername = $3;
5511 : 126 : n->servertype = $4;
5512 : 126 : n->version = $5;
5513 : 126 : n->fdwname = $9;
5514 : 126 : n->options = $10;
2582 andrew@dunslane.net 5515 : 126 : n->if_not_exists = false;
5516 : 126 : $$ = (Node *) n;
5517 : : }
5518 : : | CREATE SERVER IF_P NOT EXISTS name opt_type opt_foreign_server_version
5519 : : FOREIGN DATA_P WRAPPER name create_generic_options
5520 : : {
5521 : 12 : CreateForeignServerStmt *n = makeNode(CreateForeignServerStmt);
5522 : :
5523 : 12 : n->servername = $6;
5524 : 12 : n->servertype = $7;
5525 : 12 : n->version = $8;
5526 : 12 : n->fdwname = $12;
5527 : 12 : n->options = $13;
5528 : 12 : n->if_not_exists = true;
5595 peter_e@gmx.net 5529 : 12 : $$ = (Node *) n;
5530 : : }
5531 : : ;
5532 : :
5533 : : opt_type:
5534 : 9 : TYPE_P Sconst { $$ = $2; }
5535 : 129 : | /*EMPTY*/ { $$ = NULL; }
5536 : : ;
5537 : :
5538 : :
5539 : : foreign_server_version:
5540 : 33 : VERSION_P Sconst { $$ = $2; }
5595 peter_e@gmx.net 5541 :UBC 0 : | VERSION_P NULL_P { $$ = NULL; }
5542 : : ;
5543 : :
5544 : : opt_foreign_server_version:
4548 peter_e@gmx.net 5545 :CBC 9 : foreign_server_version { $$ = $1; }
5595 5546 : 129 : | /*EMPTY*/ { $$ = NULL; }
5547 : : ;
5548 : :
5549 : : /*****************************************************************************
5550 : : *
5551 : : * QUERY :
5552 : : * ALTER SERVER name [VERSION] [OPTIONS]
5553 : : *
5554 : : ****************************************************************************/
5555 : :
5556 : : AlterForeignServerStmt: ALTER SERVER name foreign_server_version alter_generic_options
5557 : : {
5558 : 3 : AlterForeignServerStmt *n = makeNode(AlterForeignServerStmt);
5559 : :
5560 : 3 : n->servername = $3;
5561 : 3 : n->version = $4;
5562 : 3 : n->options = $5;
5563 : 3 : n->has_version = true;
5564 : 3 : $$ = (Node *) n;
5565 : : }
5566 : : | ALTER SERVER name foreign_server_version
5567 : : {
5568 : 21 : AlterForeignServerStmt *n = makeNode(AlterForeignServerStmt);
5569 : :
5570 : 21 : n->servername = $3;
5571 : 21 : n->version = $4;
5572 : 21 : n->has_version = true;
5573 : 21 : $$ = (Node *) n;
5574 : : }
5575 : : | ALTER SERVER name alter_generic_options
5576 : : {
5577 : 85 : AlterForeignServerStmt *n = makeNode(AlterForeignServerStmt);
5578 : :
5579 : 85 : n->servername = $3;
5580 : 85 : n->options = $4;
5581 : 85 : $$ = (Node *) n;
5582 : : }
5583 : : ;
5584 : :
5585 : : /*****************************************************************************
5586 : : *
5587 : : * QUERY:
5588 : : * CREATE FOREIGN TABLE relname (...) SERVER name (...)
5589 : : *
5590 : : *****************************************************************************/
5591 : :
5592 : : CreateForeignTableStmt:
5593 : : CREATE FOREIGN TABLE qualified_name
5594 : : '(' OptTableElementList ')'
5595 : : OptInherit SERVER name create_generic_options
5596 : : {
4852 rhaas@postgresql.org 5597 : 180 : CreateForeignTableStmt *n = makeNode(CreateForeignTableStmt);
5598 : :
5599 : 180 : $4->relpersistence = RELPERSISTENCE_PERMANENT;
5600 : 180 : n->base.relation = $4;
4051 tgl@sss.pgh.pa.us 5601 : 180 : n->base.tableElts = $6;
3311 5602 : 180 : n->base.inhRelations = $8;
5603 : 180 : n->base.ofTypename = NULL;
5604 : 180 : n->base.constraints = NIL;
5605 : 180 : n->base.options = NIL;
5606 : 180 : n->base.oncommit = ONCOMMIT_NOOP;
5607 : 180 : n->base.tablespacename = NULL;
4852 rhaas@postgresql.org 5608 : 180 : n->base.if_not_exists = false;
5609 : : /* FDW-specific data */
3311 tgl@sss.pgh.pa.us 5610 : 180 : n->servername = $10;
5611 : 180 : n->options = $11;
4852 rhaas@postgresql.org 5612 : 180 : $$ = (Node *) n;
5613 : : }
5614 : : | CREATE FOREIGN TABLE IF_P NOT EXISTS qualified_name
5615 : : '(' OptTableElementList ')'
5616 : : OptInherit SERVER name create_generic_options
5617 : : {
4852 rhaas@postgresql.org 5618 :UBC 0 : CreateForeignTableStmt *n = makeNode(CreateForeignTableStmt);
5619 : :
5620 : 0 : $7->relpersistence = RELPERSISTENCE_PERMANENT;
5621 : 0 : n->base.relation = $7;
4051 tgl@sss.pgh.pa.us 5622 : 0 : n->base.tableElts = $9;
3311 5623 : 0 : n->base.inhRelations = $11;
5624 : 0 : n->base.ofTypename = NULL;
5625 : 0 : n->base.constraints = NIL;
5626 : 0 : n->base.options = NIL;
5627 : 0 : n->base.oncommit = ONCOMMIT_NOOP;
5628 : 0 : n->base.tablespacename = NULL;
4852 rhaas@postgresql.org 5629 : 0 : n->base.if_not_exists = true;
5630 : : /* FDW-specific data */
3311 tgl@sss.pgh.pa.us 5631 : 0 : n->servername = $13;
5632 : 0 : n->options = $14;
4852 rhaas@postgresql.org 5633 : 0 : $$ = (Node *) n;
5634 : : }
5635 : : | CREATE FOREIGN TABLE qualified_name
5636 : : PARTITION OF qualified_name OptTypedTableElementList PartitionBoundSpec
5637 : : SERVER name create_generic_options
5638 : : {
2685 rhaas@postgresql.org 5639 :CBC 45 : CreateForeignTableStmt *n = makeNode(CreateForeignTableStmt);
5640 : :
5641 : 45 : $4->relpersistence = RELPERSISTENCE_PERMANENT;
5642 : 45 : n->base.relation = $4;
5643 : 45 : n->base.inhRelations = list_make1($7);
5644 : 45 : n->base.tableElts = $8;
2513 tgl@sss.pgh.pa.us 5645 : 45 : n->base.partbound = $9;
2685 rhaas@postgresql.org 5646 : 45 : n->base.ofTypename = NULL;
5647 : 45 : n->base.constraints = NIL;
5648 : 45 : n->base.options = NIL;
5649 : 45 : n->base.oncommit = ONCOMMIT_NOOP;
5650 : 45 : n->base.tablespacename = NULL;
5651 : 45 : n->base.if_not_exists = false;
5652 : : /* FDW-specific data */
5653 : 45 : n->servername = $11;
5654 : 45 : n->options = $12;
5655 : 45 : $$ = (Node *) n;
5656 : : }
5657 : : | CREATE FOREIGN TABLE IF_P NOT EXISTS qualified_name
5658 : : PARTITION OF qualified_name OptTypedTableElementList PartitionBoundSpec
5659 : : SERVER name create_generic_options
5660 : : {
2685 rhaas@postgresql.org 5661 :UBC 0 : CreateForeignTableStmt *n = makeNode(CreateForeignTableStmt);
5662 : :
5663 : 0 : $7->relpersistence = RELPERSISTENCE_PERMANENT;
5664 : 0 : n->base.relation = $7;
5665 : 0 : n->base.inhRelations = list_make1($10);
5666 : 0 : n->base.tableElts = $11;
2513 tgl@sss.pgh.pa.us 5667 : 0 : n->base.partbound = $12;
2685 rhaas@postgresql.org 5668 : 0 : n->base.ofTypename = NULL;
5669 : 0 : n->base.constraints = NIL;
5670 : 0 : n->base.options = NIL;
5671 : 0 : n->base.oncommit = ONCOMMIT_NOOP;
5672 : 0 : n->base.tablespacename = NULL;
5673 : 0 : n->base.if_not_exists = true;
5674 : : /* FDW-specific data */
5675 : 0 : n->servername = $14;
5676 : 0 : n->options = $15;
5677 : 0 : $$ = (Node *) n;
5678 : : }
5679 : : ;
5680 : :
5681 : : /*****************************************************************************
5682 : : *
5683 : : * QUERY:
5684 : : * IMPORT FOREIGN SCHEMA remote_schema
5685 : : * [ { LIMIT TO | EXCEPT } ( table_list ) ]
5686 : : * FROM SERVER server_name INTO local_schema [ OPTIONS (...) ]
5687 : : *
5688 : : ****************************************************************************/
5689 : :
5690 : : ImportForeignSchemaStmt:
5691 : : IMPORT_P FOREIGN SCHEMA name import_qualification
5692 : : FROM SERVER name INTO name create_generic_options
5693 : : {
3566 tgl@sss.pgh.pa.us 5694 :CBC 22 : ImportForeignSchemaStmt *n = makeNode(ImportForeignSchemaStmt);
5695 : :
5696 : 22 : n->server_name = $8;
5697 : 22 : n->remote_schema = $4;
5698 : 22 : n->local_schema = $10;
5699 : 22 : n->list_type = $5->type;
5700 : 22 : n->table_list = $5->table_names;
5701 : 22 : n->options = $11;
5702 : 22 : $$ = (Node *) n;
5703 : : }
5704 : : ;
5705 : :
5706 : : import_qualification_type:
1250 peter@eisentraut.org 5707 : 5 : LIMIT TO { $$ = FDW_IMPORT_SCHEMA_LIMIT_TO; }
5708 : 7 : | EXCEPT { $$ = FDW_IMPORT_SCHEMA_EXCEPT; }
5709 : : ;
5710 : :
5711 : : import_qualification:
5712 : : import_qualification_type '(' relation_expr_list ')'
5713 : : {
3566 tgl@sss.pgh.pa.us 5714 : 12 : ImportQual *n = (ImportQual *) palloc(sizeof(ImportQual));
5715 : :
5716 : 12 : n->type = $1;
5717 : 12 : n->table_names = $3;
5718 : 12 : $$ = n;
5719 : : }
5720 : : | /*EMPTY*/
5721 : : {
5722 : 10 : ImportQual *n = (ImportQual *) palloc(sizeof(ImportQual));
5723 : 10 : n->type = FDW_IMPORT_SCHEMA_ALL;
5724 : 10 : n->table_names = NIL;
5725 : 10 : $$ = n;
5726 : : }
5727 : : ;
5728 : :
5729 : : /*****************************************************************************
5730 : : *
5731 : : * QUERY:
5732 : : * CREATE USER MAPPING FOR auth_ident SERVER name [OPTIONS]
5733 : : *
5734 : : *****************************************************************************/
5735 : :
5736 : : CreateUserMappingStmt: CREATE USER MAPPING FOR auth_ident SERVER name create_generic_options
5737 : : {
5595 peter_e@gmx.net 5738 : 118 : CreateUserMappingStmt *n = makeNode(CreateUserMappingStmt);
5739 : :
3324 alvherre@alvh.no-ip. 5740 : 118 : n->user = $5;
5595 peter_e@gmx.net 5741 : 118 : n->servername = $7;
5742 : 118 : n->options = $8;
2582 andrew@dunslane.net 5743 : 118 : n->if_not_exists = false;
5744 : 118 : $$ = (Node *) n;
5745 : : }
5746 : : | CREATE USER MAPPING IF_P NOT EXISTS FOR auth_ident SERVER name create_generic_options
5747 : : {
5748 : 3 : CreateUserMappingStmt *n = makeNode(CreateUserMappingStmt);
5749 : :
5750 : 3 : n->user = $8;
5751 : 3 : n->servername = $10;
5752 : 3 : n->options = $11;
5753 : 3 : n->if_not_exists = true;
5595 peter_e@gmx.net 5754 : 3 : $$ = (Node *) n;
5755 : : }
5756 : : ;
5757 : :
5758 : : /* User mapping authorization identifier */
3324 alvherre@alvh.no-ip. 5759 : 216 : auth_ident: RoleSpec { $$ = $1; }
5760 : 23 : | USER { $$ = makeRoleSpec(ROLESPEC_CURRENT_USER, @1); }
5761 : : ;
5762 : :
5763 : : /*****************************************************************************
5764 : : *
5765 : : * QUERY :
5766 : : * DROP USER MAPPING FOR auth_ident SERVER name
5767 : : *
5768 : : * XXX you'd think this should have a CASCADE/RESTRICT option, even if it's
5769 : : * only pro forma; but the SQL standard doesn't show one.
5770 : : ****************************************************************************/
5771 : :
5772 : : DropUserMappingStmt: DROP USER MAPPING FOR auth_ident SERVER name
5773 : : {
5595 peter_e@gmx.net 5774 : 44 : DropUserMappingStmt *n = makeNode(DropUserMappingStmt);
5775 : :
3324 alvherre@alvh.no-ip. 5776 : 44 : n->user = $5;
5595 peter_e@gmx.net 5777 : 44 : n->servername = $7;
5778 : 44 : n->missing_ok = false;
5779 : 44 : $$ = (Node *) n;
5780 : : }
5781 : : | DROP USER MAPPING IF_P EXISTS FOR auth_ident SERVER name
5782 : : {
5783 : 19 : DropUserMappingStmt *n = makeNode(DropUserMappingStmt);
5784 : :
3324 alvherre@alvh.no-ip. 5785 : 19 : n->user = $7;
5595 peter_e@gmx.net 5786 : 19 : n->servername = $9;
5787 : 19 : n->missing_ok = true;
5788 : 19 : $$ = (Node *) n;
5789 : : }
5790 : : ;
5791 : :
5792 : : /*****************************************************************************
5793 : : *
5794 : : * QUERY :
5795 : : * ALTER USER MAPPING FOR auth_ident SERVER name OPTIONS
5796 : : *
5797 : : ****************************************************************************/
5798 : :
5799 : : AlterUserMappingStmt: ALTER USER MAPPING FOR auth_ident SERVER name alter_generic_options
5800 : : {
5801 : 55 : AlterUserMappingStmt *n = makeNode(AlterUserMappingStmt);
5802 : :
3324 alvherre@alvh.no-ip. 5803 : 55 : n->user = $5;
5595 peter_e@gmx.net 5804 : 55 : n->servername = $7;
5805 : 55 : n->options = $8;
5806 : 55 : $$ = (Node *) n;
5807 : : }
5808 : : ;
5809 : :
5810 : : /*****************************************************************************
5811 : : *
5812 : : * QUERIES:
5813 : : * CREATE POLICY name ON table
5814 : : * [AS { PERMISSIVE | RESTRICTIVE } ]
5815 : : * [FOR { SELECT | INSERT | UPDATE | DELETE } ]
5816 : : * [TO role, ...]
5817 : : * [USING (qual)] [WITH CHECK (with check qual)]
5818 : : * ALTER POLICY name ON table [TO role, ...]
5819 : : * [USING (qual)] [WITH CHECK (with check qual)]
5820 : : *
5821 : : *****************************************************************************/
5822 : :
5823 : : CreatePolicyStmt:
5824 : : CREATE POLICY name ON qualified_name RowSecurityDefaultPermissive
5825 : : RowSecurityDefaultForCmd RowSecurityDefaultToRole
5826 : : RowSecurityOptionalExpr RowSecurityOptionalWithCheck
5827 : : {
3495 sfrost@snowman.net 5828 : 326 : CreatePolicyStmt *n = makeNode(CreatePolicyStmt);
5829 : :
5830 : 326 : n->policy_name = $3;
5831 : 326 : n->table = $5;
2687 5832 : 326 : n->permissive = $6;
5833 : 326 : n->cmd_name = $7;
5834 : 326 : n->roles = $8;
5835 : 326 : n->qual = $9;
5836 : 326 : n->with_check = $10;
3495 5837 : 326 : $$ = (Node *) n;
5838 : : }
5839 : : ;
5840 : :
5841 : : AlterPolicyStmt:
5842 : : ALTER POLICY name ON qualified_name RowSecurityOptionalToRole
5843 : : RowSecurityOptionalExpr RowSecurityOptionalWithCheck
5844 : : {
5845 : 42 : AlterPolicyStmt *n = makeNode(AlterPolicyStmt);
5846 : :
5847 : 42 : n->policy_name = $3;
5848 : 42 : n->table = $5;
5849 : 42 : n->roles = $6;
5850 : 42 : n->qual = $7;
5851 : 42 : n->with_check = $8;
5852 : 42 : $$ = (Node *) n;
5853 : : }
5854 : : ;
5855 : :
5856 : : RowSecurityOptionalExpr:
5857 : 339 : USING '(' a_expr ')' { $$ = $3; }
5858 : 29 : | /* EMPTY */ { $$ = NULL; }
5859 : : ;
5860 : :
5861 : : RowSecurityOptionalWithCheck:
5862 : 61 : WITH CHECK '(' a_expr ')' { $$ = $4; }
5863 : 307 : | /* EMPTY */ { $$ = NULL; }
5864 : : ;
5865 : :
5866 : : RowSecurityDefaultToRole:
5867 : 62 : TO role_list { $$ = $2; }
3324 alvherre@alvh.no-ip. 5868 : 264 : | /* EMPTY */ { $$ = list_make1(makeRoleSpec(ROLESPEC_PUBLIC, -1)); }
5869 : : ;
5870 : :
5871 : : RowSecurityOptionalToRole:
3495 sfrost@snowman.net 5872 : 6 : TO role_list { $$ = $2; }
5873 : 36 : | /* EMPTY */ { $$ = NULL; }
5874 : : ;
5875 : :
5876 : : RowSecurityDefaultPermissive:
5877 : : AS IDENT
5878 : : {
2687 5879 [ + + ]: 40 : if (strcmp($2, "permissive") == 0)
5880 : 9 : $$ = true;
5881 [ + + ]: 31 : else if (strcmp($2, "restrictive") == 0)
5882 : 28 : $$ = false;
5883 : : else
5884 [ + - ]: 3 : ereport(ERROR,
5885 : : (errcode(ERRCODE_SYNTAX_ERROR),
5886 : : errmsg("unrecognized row security option \"%s\"", $2),
5887 : : errhint("Only PERMISSIVE or RESTRICTIVE policies are supported currently."),
5888 : : parser_errposition(@2)));
5889 : :
5890 : : }
5891 : 289 : | /* EMPTY */ { $$ = true; }
5892 : : ;
5893 : :
5894 : : RowSecurityDefaultForCmd:
3495 5895 : 157 : FOR row_security_cmd { $$ = $2; }
5896 : 169 : | /* EMPTY */ { $$ = "all"; }
5897 : : ;
5898 : :
5899 : : row_security_cmd:
5900 : 22 : ALL { $$ = "all"; }
5901 : 53 : | SELECT { $$ = "select"; }
5902 : 22 : | INSERT { $$ = "insert"; }
5903 : 39 : | UPDATE { $$ = "update"; }
5904 : 21 : | DELETE_P { $$ = "delete"; }
5905 : : ;
5906 : :
5907 : : /*****************************************************************************
5908 : : *
5909 : : * QUERY:
5910 : : * CREATE ACCESS METHOD name HANDLER handler_name
5911 : : *
5912 : : *****************************************************************************/
5913 : :
5914 : : CreateAmStmt: CREATE ACCESS METHOD name TYPE_P am_type HANDLER handler_name
5915 : : {
2944 alvherre@alvh.no-ip. 5916 : 30 : CreateAmStmt *n = makeNode(CreateAmStmt);
5917 : :
5918 : 30 : n->amname = $4;
5919 : 30 : n->handler_name = $8;
1866 andres@anarazel.de 5920 : 30 : n->amtype = $6;
2944 alvherre@alvh.no-ip. 5921 : 30 : $$ = (Node *) n;
5922 : : }
5923 : : ;
5924 : :
5925 : : am_type:
1866 andres@anarazel.de 5926 : 16 : INDEX { $$ = AMTYPE_INDEX; }
5927 : 14 : | TABLE { $$ = AMTYPE_TABLE; }
5928 : : ;
5929 : :
5930 : : /*****************************************************************************
5931 : : *
5932 : : * QUERIES :
5933 : : * CREATE TRIGGER ...
5934 : : *
5935 : : *****************************************************************************/
5936 : :
5937 : : CreateTrigStmt:
5938 : : CREATE opt_or_replace TRIGGER name TriggerActionTime TriggerEvents ON
5939 : : qualified_name TriggerReferencing TriggerForSpec TriggerWhen
5940 : : EXECUTE FUNCTION_or_PROCEDURE func_name '(' TriggerFuncArgs ')'
5941 : : {
9715 bruce@momjian.us 5942 : 1544 : CreateTrigStmt *n = makeNode(CreateTrigStmt);
5943 : :
1247 tgl@sss.pgh.pa.us 5944 : 1544 : n->replace = $2;
5945 : 1544 : n->isconstraint = false;
5946 : 1544 : n->trigname = $4;
5947 : 1544 : n->relation = $8;
5948 : 1544 : n->funcname = $14;
5949 : 1544 : n->args = $16;
5950 : 1544 : n->row = $10;
5951 : 1544 : n->timing = $5;
5952 : 1544 : n->events = intVal(linitial($6));
5953 : 1544 : n->columns = (List *) lsecond($6);
5954 : 1544 : n->whenClause = $11;
5955 : 1544 : n->transitionRels = $9;
1116 peter@eisentraut.org 5956 : 1544 : n->deferrable = false;
5957 : 1544 : n->initdeferred = false;
8060 tgl@sss.pgh.pa.us 5958 : 1544 : n->constrrel = NULL;
702 peter@eisentraut.org 5959 : 1544 : $$ = (Node *) n;
5960 : : }
5961 : : | CREATE opt_or_replace CONSTRAINT TRIGGER name AFTER TriggerEvents ON
5962 : : qualified_name OptConstrFromTable ConstraintAttributeSpec
5963 : : FOR EACH ROW TriggerWhen
5964 : : EXECUTE FUNCTION_or_PROCEDURE func_name '(' TriggerFuncArgs ')'
5965 : : {
8964 JanWieck@Yahoo.com 5966 : 27 : CreateTrigStmt *n = makeNode(CreateTrigStmt);
5967 : :
1247 tgl@sss.pgh.pa.us 5968 : 27 : n->replace = $2;
5969 [ - + ]: 27 : if (n->replace) /* not supported, see CreateTrigger */
1247 tgl@sss.pgh.pa.us 5970 [ # # ]:UBC 0 : ereport(ERROR,
5971 : : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5972 : : errmsg("CREATE OR REPLACE CONSTRAINT TRIGGER is not supported")));
1247 tgl@sss.pgh.pa.us 5973 :CBC 27 : n->isconstraint = true;
5974 : 27 : n->trigname = $5;
5975 : 27 : n->relation = $9;
5976 : 27 : n->funcname = $18;
5977 : 27 : n->args = $20;
2433 peter_e@gmx.net 5978 : 27 : n->row = true;
4935 tgl@sss.pgh.pa.us 5979 : 27 : n->timing = TRIGGER_TYPE_AFTER;
1247 5980 : 27 : n->events = intVal(linitial($7));
5981 : 27 : n->columns = (List *) lsecond($7);
5982 : 27 : n->whenClause = $15;
2718 kgrittn@postgresql.o 5983 : 27 : n->transitionRels = NIL;
1247 tgl@sss.pgh.pa.us 5984 : 27 : processCASbits($11, @11, "TRIGGER",
5985 : : &n->deferrable, &n->initdeferred, NULL,
5986 : : NULL, yyscanner);
5987 : 27 : n->constrrel = $10;
702 peter@eisentraut.org 5988 : 27 : $$ = (Node *) n;
5989 : : }
5990 : : ;
5991 : :
5992 : : TriggerActionTime:
4935 tgl@sss.pgh.pa.us 5993 : 699 : BEFORE { $$ = TRIGGER_TYPE_BEFORE; }
5994 : 782 : | AFTER { $$ = TRIGGER_TYPE_AFTER; }
5995 : 69 : | INSTEAD OF { $$ = TRIGGER_TYPE_INSTEAD; }
5996 : : ;
5997 : :
5998 : : TriggerEvents:
5999 : : TriggerOneEvent
5414 6000 : 1577 : { $$ = $1; }
6001 : : | TriggerEvents OR TriggerOneEvent
6002 : : {
702 peter@eisentraut.org 6003 : 538 : int events1 = intVal(linitial($1));
6004 : 538 : int events2 = intVal(linitial($3));
6005 : 538 : List *columns1 = (List *) lsecond($1);
6006 : 538 : List *columns2 = (List *) lsecond($3);
6007 : :
5296 tgl@sss.pgh.pa.us 6008 [ + + ]: 538 : if (events1 & events2)
5389 6009 : 3 : parser_yyerror("duplicate trigger events specified");
6010 : : /*
6011 : : * concat'ing the columns lists loses information about
6012 : : * which columns went with which event, but so long as
6013 : : * only UPDATE carries columns and we disallow multiple
6014 : : * UPDATE items, it doesn't matter. Command execution
6015 : : * should just ignore the columns for non-UPDATE events.
6016 : : */
5296 6017 : 535 : $$ = list_make2(makeInteger(events1 | events2),
6018 : : list_concat(columns1, columns2));
6019 : : }
6020 : : ;
6021 : :
6022 : : TriggerOneEvent:
6023 : : INSERT
6024 : 790 : { $$ = list_make2(makeInteger(TRIGGER_TYPE_INSERT), NIL); }
6025 : : | DELETE_P
6026 : 432 : { $$ = list_make2(makeInteger(TRIGGER_TYPE_DELETE), NIL); }
6027 : : | UPDATE
6028 : 823 : { $$ = list_make2(makeInteger(TRIGGER_TYPE_UPDATE), NIL); }
6029 : : | UPDATE OF columnList
6030 : 47 : { $$ = list_make2(makeInteger(TRIGGER_TYPE_UPDATE), $3); }
6031 : : | TRUNCATE
6032 : 23 : { $$ = list_make2(makeInteger(TRIGGER_TYPE_TRUNCATE), NIL); }
6033 : : ;
6034 : :
6035 : : TriggerReferencing:
2718 kgrittn@postgresql.o 6036 : 212 : REFERENCING TriggerTransitions { $$ = $2; }
6037 : 1332 : | /*EMPTY*/ { $$ = NIL; }
6038 : : ;
6039 : :
6040 : : TriggerTransitions:
6041 : 212 : TriggerTransition { $$ = list_make1($1); }
6042 : 69 : | TriggerTransitions TriggerTransition { $$ = lappend($1, $2); }
6043 : : ;
6044 : :
6045 : : TriggerTransition:
6046 : : TransitionOldOrNew TransitionRowOrTable opt_as TransitionRelName
6047 : : {
6048 : 281 : TriggerTransition *n = makeNode(TriggerTransition);
6049 : :
6050 : 281 : n->name = $4;
6051 : 281 : n->isNew = $1;
6052 : 281 : n->isTable = $2;
702 peter@eisentraut.org 6053 : 281 : $$ = (Node *) n;
6054 : : }
6055 : : ;
6056 : :
6057 : : TransitionOldOrNew:
2433 peter_e@gmx.net 6058 : 153 : NEW { $$ = true; }
6059 : 128 : | OLD { $$ = false; }
6060 : : ;
6061 : :
6062 : : TransitionRowOrTable:
6063 : 281 : TABLE { $$ = true; }
6064 : : /*
6065 : : * According to the standard, lack of a keyword here implies ROW.
6066 : : * Support for that would require prohibiting ROW entirely here,
6067 : : * reserving the keyword ROW, and/or requiring AS (instead of
6068 : : * allowing it to be optional, as the standard specifies) as the
6069 : : * next token. Requiring ROW seems cleanest and easiest to
6070 : : * explain.
6071 : : */
2433 peter_e@gmx.net 6072 :UBC 0 : | ROW { $$ = false; }
6073 : : ;
6074 : :
6075 : : TransitionRelName:
2718 kgrittn@postgresql.o 6076 :CBC 281 : ColId { $$ = $1; }
6077 : : ;
6078 : :
6079 : : TriggerForSpec:
6080 : : FOR TriggerForOptEach TriggerForType
6081 : : {
9559 lockhart@fourpalms.o 6082 : 1430 : $$ = $3;
6083 : : }
6084 : : | /* EMPTY */
6085 : : {
6086 : : /*
6087 : : * If ROW/STATEMENT not specified, default to
6088 : : * STATEMENT, per SQL
6089 : : */
2433 peter_e@gmx.net 6090 : 114 : $$ = false;
6091 : : }
6092 : : ;
6093 : :
6094 : : TriggerForOptEach:
6095 : : EACH
6096 : : | /*EMPTY*/
6097 : : ;
6098 : :
6099 : : TriggerForType:
6100 : 1030 : ROW { $$ = true; }
6101 : 400 : | STATEMENT { $$ = false; }
6102 : : ;
6103 : :
6104 : : TriggerWhen:
5259 tgl@sss.pgh.pa.us 6105 : 76 : WHEN '(' a_expr ')' { $$ = $3; }
6106 : 1495 : | /*EMPTY*/ { $$ = NULL; }
6107 : : ;
6108 : :
6109 : : FUNCTION_or_PROCEDURE:
6110 : : FUNCTION
6111 : : | PROCEDURE
6112 : : ;
6113 : :
6114 : : TriggerFuncArgs:
7259 neilc@samurai.com 6115 : 299 : TriggerFuncArg { $$ = list_make1($1); }
7971 bruce@momjian.us 6116 : 132 : | TriggerFuncArgs ',' TriggerFuncArg { $$ = lappend($1, $3); }
7972 6117 : 1272 : | /*EMPTY*/ { $$ = NIL; }
6118 : : ;
6119 : :
6120 : : TriggerFuncArg:
6121 : : Iconst
6122 : : {
948 peter@eisentraut.org 6123 : 51 : $$ = (Node *) makeString(psprintf("%d", $1));
6124 : : }
948 peter@eisentraut.org 6125 :UBC 0 : | FCONST { $$ = (Node *) makeString($1); }
948 peter@eisentraut.org 6126 :CBC 360 : | Sconst { $$ = (Node *) makeString($1); }
6127 : 20 : | ColLabel { $$ = (Node *) makeString($1); }
6128 : : ;
6129 : :
6130 : : OptConstrFromTable:
7972 bruce@momjian.us 6131 : 6 : FROM qualified_name { $$ = $2; }
6132 : 21 : | /*EMPTY*/ { $$ = NULL; }
6133 : : ;
6134 : :
6135 : : ConstraintAttributeSpec:
6136 : : /*EMPTY*/
4687 tgl@sss.pgh.pa.us 6137 : 7068 : { $$ = 0; }
6138 : : | ConstraintAttributeSpec ConstraintAttributeElem
6139 : : {
6140 : : /*
6141 : : * We must complain about conflicting options.
6142 : : * We could, but choose not to, complain about redundant
6143 : : * options (ie, where $2's bit is already set in $1).
6144 : : */
6145 : 551 : int newspec = $1 | $2;
6146 : :
6147 : : /* special message for this case */
6148 [ + + ]: 551 : if ((newspec & (CAS_NOT_DEFERRABLE | CAS_INITIALLY_DEFERRED)) == (CAS_NOT_DEFERRABLE | CAS_INITIALLY_DEFERRED))
7575 6149 [ + - ]: 3 : ereport(ERROR,
6150 : : (errcode(ERRCODE_SYNTAX_ERROR),
6151 : : errmsg("constraint declared INITIALLY DEFERRED must be DEFERRABLE"),
6152 : : parser_errposition(@2)));
6153 : : /* generic message for other conflicts */
4687 6154 [ + - ]: 548 : if ((newspec & (CAS_NOT_DEFERRABLE | CAS_DEFERRABLE)) == (CAS_NOT_DEFERRABLE | CAS_DEFERRABLE) ||
6155 [ - + ]: 548 : (newspec & (CAS_INITIALLY_IMMEDIATE | CAS_INITIALLY_DEFERRED)) == (CAS_INITIALLY_IMMEDIATE | CAS_INITIALLY_DEFERRED))
7575 tgl@sss.pgh.pa.us 6156 [ # # ]:UBC 0 : ereport(ERROR,
6157 : : (errcode(ERRCODE_SYNTAX_ERROR),
6158 : : errmsg("conflicting constraint properties"),
6159 : : parser_errposition(@2)));
4687 tgl@sss.pgh.pa.us 6160 :CBC 548 : $$ = newspec;
6161 : : }
6162 : : ;
6163 : :
6164 : : ConstraintAttributeElem:
6165 : 18 : NOT DEFERRABLE { $$ = CAS_NOT_DEFERRABLE; }
6166 : 108 : | DEFERRABLE { $$ = CAS_DEFERRABLE; }
6167 : 15 : | INITIALLY IMMEDIATE { $$ = CAS_INITIALLY_IMMEDIATE; }
6168 : 81 : | INITIALLY DEFERRED { $$ = CAS_INITIALLY_DEFERRED; }
6169 : 258 : | NOT VALID { $$ = CAS_NOT_VALID; }
4282 alvherre@alvh.no-ip. 6170 : 71 : | NO INHERIT { $$ = CAS_NO_INHERIT; }
6171 : : ;
6172 : :
6173 : :
6174 : : /*****************************************************************************
6175 : : *
6176 : : * QUERIES :
6177 : : * CREATE EVENT TRIGGER ...
6178 : : * ALTER EVENT TRIGGER ...
6179 : : *
6180 : : *****************************************************************************/
6181 : :
6182 : : CreateEventTrigStmt:
6183 : : CREATE EVENT TRIGGER name ON ColLabel
6184 : : EXECUTE FUNCTION_or_PROCEDURE func_name '(' ')'
6185 : : {
4288 rhaas@postgresql.org 6186 : 49 : CreateEventTrigStmt *n = makeNode(CreateEventTrigStmt);
6187 : :
6188 : 49 : n->trigname = $4;
6189 : 49 : n->eventname = $6;
6190 : 49 : n->whenclause = NULL;
6191 : 49 : n->funcname = $9;
702 peter@eisentraut.org 6192 : 49 : $$ = (Node *) n;
6193 : : }
6194 : : | CREATE EVENT TRIGGER name ON ColLabel
6195 : : WHEN event_trigger_when_list
6196 : : EXECUTE FUNCTION_or_PROCEDURE func_name '(' ')'
6197 : : {
4288 rhaas@postgresql.org 6198 : 49 : CreateEventTrigStmt *n = makeNode(CreateEventTrigStmt);
6199 : :
6200 : 49 : n->trigname = $4;
6201 : 49 : n->eventname = $6;
6202 : 49 : n->whenclause = $8;
6203 : 49 : n->funcname = $11;
702 peter@eisentraut.org 6204 : 49 : $$ = (Node *) n;
6205 : : }
6206 : : ;
6207 : :
6208 : : event_trigger_when_list:
6209 : : event_trigger_when_item
4288 rhaas@postgresql.org 6210 : 49 : { $$ = list_make1($1); }
6211 : : | event_trigger_when_list AND event_trigger_when_item
6212 : 3 : { $$ = lappend($1, $3); }
6213 : : ;
6214 : :
6215 : : event_trigger_when_item:
6216 : : ColId IN_P '(' event_trigger_value_list ')'
2777 peter_e@gmx.net 6217 : 52 : { $$ = makeDefElem($1, (Node *) $4, @1); }
6218 : : ;
6219 : :
6220 : : event_trigger_value_list:
6221 : : SCONST
4288 rhaas@postgresql.org 6222 : 52 : { $$ = list_make1(makeString($1)); }
6223 : : | event_trigger_value_list ',' SCONST
6224 : 33 : { $$ = lappend($1, makeString($3)); }
6225 : : ;
6226 : :
6227 : : AlterEventTrigStmt:
6228 : : ALTER EVENT TRIGGER name enable_trigger
6229 : : {
6230 : 24 : AlterEventTrigStmt *n = makeNode(AlterEventTrigStmt);
6231 : :
6232 : 24 : n->trigname = $4;
6233 : 24 : n->tgenabled = $5;
6234 : 24 : $$ = (Node *) n;
6235 : : }
6236 : : ;
6237 : :
6238 : : enable_trigger:
6239 : 3 : ENABLE_P { $$ = TRIGGER_FIRES_ON_ORIGIN; }
6240 : 3 : | ENABLE_P REPLICA { $$ = TRIGGER_FIRES_ON_REPLICA; }
6241 : 8 : | ENABLE_P ALWAYS { $$ = TRIGGER_FIRES_ALWAYS; }
6242 : 10 : | DISABLE_P { $$ = TRIGGER_DISABLED; }
6243 : : ;
6244 : :
6245 : : /*****************************************************************************
6246 : : *
6247 : : * QUERY :
6248 : : * CREATE ASSERTION ...
6249 : : *
6250 : : *****************************************************************************/
6251 : :
6252 : : CreateAssertionStmt:
6253 : : CREATE ASSERTION any_name CHECK '(' a_expr ')' ConstraintAttributeSpec
6254 : : {
7575 tgl@sss.pgh.pa.us 6255 [ # # ]:UBC 0 : ereport(ERROR,
6256 : : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
6257 : : errmsg("CREATE ASSERTION is not yet implemented")));
6258 : :
6259 : : $$ = NULL;
6260 : : }
6261 : : ;
6262 : :
6263 : :
6264 : : /*****************************************************************************
6265 : : *
6266 : : * QUERY :
6267 : : * define (aggregate,operator,type)
6268 : : *
6269 : : *****************************************************************************/
6270 : :
6271 : : DefineStmt:
6272 : : CREATE opt_or_replace AGGREGATE func_name aggr_args definition
6273 : : {
8773 lockhart@fourpalms.o 6274 :CBC 271 : DefineStmt *n = makeNode(DefineStmt);
6275 : :
7597 peter_e@gmx.net 6276 : 271 : n->kind = OBJECT_AGGREGATE;
6574 tgl@sss.pgh.pa.us 6277 : 271 : n->oldstyle = false;
1853 rhodiumtoad@postgres 6278 : 271 : n->replace = $2;
6279 : 271 : n->defnames = $4;
6280 : 271 : n->args = $5;
6281 : 271 : n->definition = $6;
702 peter@eisentraut.org 6282 : 271 : $$ = (Node *) n;
6283 : : }
6284 : : | CREATE opt_or_replace AGGREGATE func_name old_aggr_definition
6285 : : {
6286 : : /* old-style (pre-8.2) syntax for CREATE AGGREGATE */
6574 tgl@sss.pgh.pa.us 6287 : 181 : DefineStmt *n = makeNode(DefineStmt);
6288 : :
6289 : 181 : n->kind = OBJECT_AGGREGATE;
6290 : 181 : n->oldstyle = true;
1853 rhodiumtoad@postgres 6291 : 181 : n->replace = $2;
6292 : 181 : n->defnames = $4;
6574 tgl@sss.pgh.pa.us 6293 : 181 : n->args = NIL;
1853 rhodiumtoad@postgres 6294 : 181 : n->definition = $5;
702 peter@eisentraut.org 6295 : 181 : $$ = (Node *) n;
6296 : : }
6297 : : | CREATE OPERATOR any_operator definition
6298 : : {
8514 tgl@sss.pgh.pa.us 6299 : 793 : DefineStmt *n = makeNode(DefineStmt);
6300 : :
7597 peter_e@gmx.net 6301 : 793 : n->kind = OBJECT_OPERATOR;
6574 tgl@sss.pgh.pa.us 6302 : 793 : n->oldstyle = false;
8034 6303 : 793 : n->defnames = $3;
6574 6304 : 793 : n->args = NIL;
8514 6305 : 793 : n->definition = $4;
702 peter@eisentraut.org 6306 : 793 : $$ = (Node *) n;
6307 : : }
6308 : : | CREATE TYPE_P any_name definition
6309 : : {
8514 tgl@sss.pgh.pa.us 6310 : 104 : DefineStmt *n = makeNode(DefineStmt);
6311 : :
7597 peter_e@gmx.net 6312 : 104 : n->kind = OBJECT_TYPE;
6574 tgl@sss.pgh.pa.us 6313 : 104 : n->oldstyle = false;
8052 6314 : 104 : n->defnames = $3;
6574 6315 : 104 : n->args = NIL;
8773 lockhart@fourpalms.o 6316 : 104 : n->definition = $4;
702 peter@eisentraut.org 6317 : 104 : $$ = (Node *) n;
6318 : : }
6319 : : | CREATE TYPE_P any_name
6320 : : {
6321 : : /* Shell type (identified by lack of definition) */
6620 tgl@sss.pgh.pa.us 6322 : 77 : DefineStmt *n = makeNode(DefineStmt);
6323 : :
6324 : 77 : n->kind = OBJECT_TYPE;
6574 6325 : 77 : n->oldstyle = false;
6620 6326 : 77 : n->defnames = $3;
6574 6327 : 77 : n->args = NIL;
6620 6328 : 77 : n->definition = NIL;
702 peter@eisentraut.org 6329 : 77 : $$ = (Node *) n;
6330 : : }
6331 : : | CREATE TYPE_P any_name AS '(' OptTableFuncElementList ')'
6332 : : {
7913 bruce@momjian.us 6333 : 346 : CompositeTypeStmt *n = makeNode(CompositeTypeStmt);
6334 : :
6335 : : /* can't use qualified_name, sigh */
4949 peter_e@gmx.net 6336 : 346 : n->typevar = makeRangeVarFromAnyName($3, @3, yyscanner);
7899 tgl@sss.pgh.pa.us 6337 : 346 : n->coldeflist = $6;
702 peter@eisentraut.org 6338 : 346 : $$ = (Node *) n;
6339 : : }
6340 : : | CREATE TYPE_P any_name AS ENUM_P '(' opt_enum_val_list ')'
6341 : : {
6222 tgl@sss.pgh.pa.us 6342 : 94 : CreateEnumStmt *n = makeNode(CreateEnumStmt);
6343 : :
5386 peter_e@gmx.net 6344 : 94 : n->typeName = $3;
6222 tgl@sss.pgh.pa.us 6345 : 94 : n->vals = $7;
702 peter@eisentraut.org 6346 : 94 : $$ = (Node *) n;
6347 : : }
6348 : : | CREATE TYPE_P any_name AS RANGE definition
6349 : : {
4546 heikki.linnakangas@i 6350 : 83 : CreateRangeStmt *n = makeNode(CreateRangeStmt);
6351 : :
6352 : 83 : n->typeName = $3;
1005 peter@eisentraut.org 6353 : 83 : n->params = $6;
702 6354 : 83 : $$ = (Node *) n;
6355 : : }
6356 : : | CREATE TEXT_P SEARCH PARSER any_name definition
6357 : : {
6081 tgl@sss.pgh.pa.us 6358 : 20 : DefineStmt *n = makeNode(DefineStmt);
6359 : :
6360 : 20 : n->kind = OBJECT_TSPARSER;
6361 : 20 : n->args = NIL;
6362 : 20 : n->defnames = $5;
6363 : 20 : n->definition = $6;
702 peter@eisentraut.org 6364 : 20 : $$ = (Node *) n;
6365 : : }
6366 : : | CREATE TEXT_P SEARCH DICTIONARY any_name definition
6367 : : {
6081 tgl@sss.pgh.pa.us 6368 : 1109 : DefineStmt *n = makeNode(DefineStmt);
6369 : :
6370 : 1109 : n->kind = OBJECT_TSDICTIONARY;
6371 : 1109 : n->args = NIL;
6372 : 1109 : n->defnames = $5;
6373 : 1109 : n->definition = $6;
702 peter@eisentraut.org 6374 : 1109 : $$ = (Node *) n;
6375 : : }
6376 : : | CREATE TEXT_P SEARCH TEMPLATE any_name definition
6377 : : {
6081 tgl@sss.pgh.pa.us 6378 : 59 : DefineStmt *n = makeNode(DefineStmt);
6379 : :
6380 : 59 : n->kind = OBJECT_TSTEMPLATE;
6381 : 59 : n->args = NIL;
6382 : 59 : n->defnames = $5;
6383 : 59 : n->definition = $6;
702 peter@eisentraut.org 6384 : 59 : $$ = (Node *) n;
6385 : : }
6386 : : | CREATE TEXT_P SEARCH CONFIGURATION any_name definition
6387 : : {
6081 tgl@sss.pgh.pa.us 6388 : 1080 : DefineStmt *n = makeNode(DefineStmt);
6389 : :
6390 : 1080 : n->kind = OBJECT_TSCONFIGURATION;
6391 : 1080 : n->args = NIL;
6392 : 1080 : n->defnames = $5;
6393 : 1080 : n->definition = $6;
702 peter@eisentraut.org 6394 : 1080 : $$ = (Node *) n;
6395 : : }
6396 : : | CREATE COLLATION any_name definition
6397 : : {
4810 peter_e@gmx.net 6398 : 136 : DefineStmt *n = makeNode(DefineStmt);
6399 : :
6400 : 136 : n->kind = OBJECT_COLLATION;
6401 : 136 : n->args = NIL;
6402 : 136 : n->defnames = $3;
6403 : 136 : n->definition = $4;
702 peter@eisentraut.org 6404 : 136 : $$ = (Node *) n;
6405 : : }
6406 : : | CREATE COLLATION IF_P NOT EXISTS any_name definition
6407 : : {
2622 peter_e@gmx.net 6408 : 9 : DefineStmt *n = makeNode(DefineStmt);
6409 : :
6410 : 9 : n->kind = OBJECT_COLLATION;
6411 : 9 : n->args = NIL;
6412 : 9 : n->defnames = $6;
6413 : 9 : n->definition = $7;
6414 : 9 : n->if_not_exists = true;
702 peter@eisentraut.org 6415 : 9 : $$ = (Node *) n;
6416 : : }
6417 : : | CREATE COLLATION any_name FROM any_name
6418 : : {
4810 peter_e@gmx.net 6419 : 26 : DefineStmt *n = makeNode(DefineStmt);
6420 : :
6421 : 26 : n->kind = OBJECT_COLLATION;
6422 : 26 : n->args = NIL;
6423 : 26 : n->defnames = $3;
2777 6424 : 26 : n->definition = list_make1(makeDefElem("from", (Node *) $5, @5));
702 peter@eisentraut.org 6425 : 26 : $$ = (Node *) n;
6426 : : }
6427 : : | CREATE COLLATION IF_P NOT EXISTS any_name FROM any_name
6428 : : {
2622 peter_e@gmx.net 6429 :UBC 0 : DefineStmt *n = makeNode(DefineStmt);
6430 : :
6431 : 0 : n->kind = OBJECT_COLLATION;
6432 : 0 : n->args = NIL;
6433 : 0 : n->defnames = $6;
6434 : 0 : n->definition = list_make1(makeDefElem("from", (Node *) $8, @8));
6435 : 0 : n->if_not_exists = true;
702 peter@eisentraut.org 6436 : 0 : $$ = (Node *) n;
6437 : : }
6438 : : ;
6439 : :
7972 bruce@momjian.us 6440 :CBC 4107 : definition: '(' def_list ')' { $$ = $2; }
6441 : : ;
6442 : :
4548 peter_e@gmx.net 6443 : 4107 : def_list: def_elem { $$ = list_make1($1); }
7972 bruce@momjian.us 6444 : 6713 : | def_list ',' def_elem { $$ = lappend($1, $3); }
6445 : : ;
6446 : :
6447 : : def_elem: ColLabel '=' def_arg
6448 : : {
2777 peter_e@gmx.net 6449 : 10658 : $$ = makeDefElem($1, (Node *) $3, @1);
6450 : : }
6451 : : | ColLabel
6452 : : {
6453 : 162 : $$ = makeDefElem($1, NULL, @1);
6454 : : }
6455 : : ;
6456 : :
6457 : : /* Note: any simple identifier will be returned as a type name! */
702 peter@eisentraut.org 6458 : 8763 : def_arg: func_type { $$ = (Node *) $1; }
6459 : 1620 : | reserved_keyword { $$ = (Node *) makeString(pstrdup($1)); }
6460 : 587 : | qual_all_Op { $$ = (Node *) $1; }
6461 : 640 : | NumericOnly { $$ = (Node *) $1; }
6462 : 902 : | Sconst { $$ = (Node *) makeString($1); }
6463 : 65 : | NONE { $$ = (Node *) makeString(pstrdup($1)); }
6464 : : ;
6465 : :
6574 tgl@sss.pgh.pa.us 6466 : 181 : old_aggr_definition: '(' old_aggr_list ')' { $$ = $2; }
6467 : : ;
6468 : :
6469 : 181 : old_aggr_list: old_aggr_elem { $$ = list_make1($1); }
6470 : 646 : | old_aggr_list ',' old_aggr_elem { $$ = lappend($1, $3); }
6471 : : ;
6472 : :
6473 : : /*
6474 : : * Must use IDENT here to avoid reduce/reduce conflicts; fortunately none of
6475 : : * the item names needed in old aggregate definitions are likely to become
6476 : : * SQL keywords.
6477 : : */
6478 : : old_aggr_elem: IDENT '=' def_arg
6479 : : {
702 peter@eisentraut.org 6480 : 827 : $$ = makeDefElem($1, (Node *) $3, @1);
6481 : : }
6482 : : ;
6483 : :
6484 : : opt_enum_val_list:
5223 bruce@momjian.us 6485 : 90 : enum_val_list { $$ = $1; }
6486 : 4 : | /*EMPTY*/ { $$ = NIL; }
6487 : : ;
6488 : :
6489 : : enum_val_list: Sconst
6222 tgl@sss.pgh.pa.us 6490 : 90 : { $$ = list_make1(makeString($1)); }
6491 : : | enum_val_list ',' Sconst
6492 : 5197 : { $$ = lappend($1, makeString($3)); }
6493 : : ;
6494 : :
6495 : : /*****************************************************************************
6496 : : *
6497 : : * ALTER TYPE enumtype ADD ...
6498 : : *
6499 : : *****************************************************************************/
6500 : :
6501 : : AlterEnumStmt:
6502 : : ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists Sconst
6503 : : {
4548 peter_e@gmx.net 6504 : 77 : AlterEnumStmt *n = makeNode(AlterEnumStmt);
6505 : :
6506 : 77 : n->typeName = $3;
2776 tgl@sss.pgh.pa.us 6507 : 77 : n->oldVal = NULL;
4222 andrew@dunslane.net 6508 : 77 : n->newVal = $7;
4548 peter_e@gmx.net 6509 : 77 : n->newValNeighbor = NULL;
6510 : 77 : n->newValIsAfter = true;
2776 tgl@sss.pgh.pa.us 6511 : 77 : n->skipIfNewValExists = $6;
4548 peter_e@gmx.net 6512 : 77 : $$ = (Node *) n;
6513 : : }
6514 : : | ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists Sconst BEFORE Sconst
6515 : : {
6516 : 97 : AlterEnumStmt *n = makeNode(AlterEnumStmt);
6517 : :
6518 : 97 : n->typeName = $3;
2776 tgl@sss.pgh.pa.us 6519 : 97 : n->oldVal = NULL;
4222 andrew@dunslane.net 6520 : 97 : n->newVal = $7;
6521 : 97 : n->newValNeighbor = $9;
4548 peter_e@gmx.net 6522 : 97 : n->newValIsAfter = false;
2776 tgl@sss.pgh.pa.us 6523 : 97 : n->skipIfNewValExists = $6;
4548 peter_e@gmx.net 6524 : 97 : $$ = (Node *) n;
6525 : : }
6526 : : | ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists Sconst AFTER Sconst
6527 : : {
6528 : 11 : AlterEnumStmt *n = makeNode(AlterEnumStmt);
6529 : :
6530 : 11 : n->typeName = $3;
2776 tgl@sss.pgh.pa.us 6531 : 11 : n->oldVal = NULL;
4222 andrew@dunslane.net 6532 : 11 : n->newVal = $7;
6533 : 11 : n->newValNeighbor = $9;
4548 peter_e@gmx.net 6534 : 11 : n->newValIsAfter = true;
2776 tgl@sss.pgh.pa.us 6535 : 11 : n->skipIfNewValExists = $6;
6536 : 11 : $$ = (Node *) n;
6537 : : }
6538 : : | ALTER TYPE_P any_name RENAME VALUE_P Sconst TO Sconst
6539 : : {
6540 : 12 : AlterEnumStmt *n = makeNode(AlterEnumStmt);
6541 : :
6542 : 12 : n->typeName = $3;
6543 : 12 : n->oldVal = $6;
6544 : 12 : n->newVal = $8;
6545 : 12 : n->newValNeighbor = NULL;
6546 : 12 : n->newValIsAfter = false;
6547 : 12 : n->skipIfNewValExists = false;
4548 peter_e@gmx.net 6548 : 12 : $$ = (Node *) n;
6549 : : }
6550 : : | ALTER TYPE_P any_name DROP VALUE_P Sconst
6551 : : {
6552 : : /*
6553 : : * The following problems must be solved before this can be
6554 : : * implemented:
6555 : : *
6556 : : * - There must be no instance of the target value in
6557 : : * any table.
6558 : : *
6559 : : * - The value must not appear in any catalog metadata,
6560 : : * such as stored view expressions or column defaults.
6561 : : *
6562 : : * - The value must not appear in any non-leaf page of a
6563 : : * btree (and similar issues with other index types).
6564 : : * This is problematic because a value could persist
6565 : : * there long after it's gone from user-visible data.
6566 : : *
6567 : : * - Concurrent sessions must not be able to insert the
6568 : : * value while the preceding conditions are being checked.
6569 : : *
6570 : : * - Possibly more...
6571 : : */
194 tgl@sss.pgh.pa.us 6572 [ # # ]:UNC 0 : ereport(ERROR,
6573 : : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
6574 : : errmsg("dropping an enum value is not implemented"),
6575 : : parser_errposition(@4)));
6576 : : }
6577 : : ;
6578 : :
4222 andrew@dunslane.net 6579 :CBC 6 : opt_if_not_exists: IF_P NOT EXISTS { $$ = true; }
1245 peter@eisentraut.org 6580 : 179 : | /* EMPTY */ { $$ = false; }
6581 : : ;
6582 : :
6583 : :
6584 : : /*****************************************************************************
6585 : : *
6586 : : * QUERIES :
6587 : : * CREATE OPERATOR CLASS ...
6588 : : * CREATE OPERATOR FAMILY ...
6589 : : * ALTER OPERATOR FAMILY ...
6590 : : * DROP OPERATOR CLASS ...
6591 : : * DROP OPERATOR FAMILY ...
6592 : : *
6593 : : *****************************************************************************/
6594 : :
6595 : : CreateOpClassStmt:
6596 : : CREATE OPERATOR CLASS any_name opt_default FOR TYPE_P Typename
6597 : : USING name opt_opfamily AS opclass_item_list
6598 : : {
7930 tgl@sss.pgh.pa.us 6599 : 191 : CreateOpClassStmt *n = makeNode(CreateOpClassStmt);
6600 : :
6601 : 191 : n->opclassname = $4;
6602 : 191 : n->isDefault = $5;
6603 : 191 : n->datatype = $8;
6604 : 191 : n->amname = $10;
6291 6605 : 191 : n->opfamilyname = $11;
6606 : 191 : n->items = $13;
7930 6607 : 191 : $$ = (Node *) n;
6608 : : }
6609 : : ;
6610 : :
6611 : : opclass_item_list:
7259 neilc@samurai.com 6612 : 410 : opclass_item { $$ = list_make1($1); }
7930 tgl@sss.pgh.pa.us 6613 : 1529 : | opclass_item_list ',' opclass_item { $$ = lappend($1, $3); }
6614 : : ;
6615 : :
6616 : : opclass_item:
6617 : : OPERATOR Iconst any_operator opclass_purpose opt_recheck
6618 : : {
6619 : 546 : CreateOpClassItem *n = makeNode(CreateOpClassItem);
2664 peter_e@gmx.net 6620 : 546 : ObjectWithArgs *owa = makeNode(ObjectWithArgs);
6621 : :
6622 : 546 : owa->objname = $3;
6623 : 546 : owa->objargs = NIL;
7930 tgl@sss.pgh.pa.us 6624 : 546 : n->itemtype = OPCLASS_ITEM_OPERATOR;
2664 peter_e@gmx.net 6625 : 546 : n->name = owa;
7930 tgl@sss.pgh.pa.us 6626 : 546 : n->number = $2;
4890 6627 : 546 : n->order_family = $4;
7930 6628 : 546 : $$ = (Node *) n;
6629 : : }
6630 : : | OPERATOR Iconst operator_with_argtypes opclass_purpose
6631 : : opt_recheck
6632 : : {
6633 : 513 : CreateOpClassItem *n = makeNode(CreateOpClassItem);
6634 : :
6635 : 513 : n->itemtype = OPCLASS_ITEM_OPERATOR;
2664 peter_e@gmx.net 6636 : 513 : n->name = $3;
7930 tgl@sss.pgh.pa.us 6637 : 513 : n->number = $2;
2664 peter_e@gmx.net 6638 : 513 : n->order_family = $4;
7930 tgl@sss.pgh.pa.us 6639 : 513 : $$ = (Node *) n;
6640 : : }
6641 : : | FUNCTION Iconst function_with_argtypes
6642 : : {
6643 : 687 : CreateOpClassItem *n = makeNode(CreateOpClassItem);
6644 : :
6645 : 687 : n->itemtype = OPCLASS_ITEM_FUNCTION;
2664 peter_e@gmx.net 6646 : 687 : n->name = $3;
7930 tgl@sss.pgh.pa.us 6647 : 687 : n->number = $2;
6648 : 687 : $$ = (Node *) n;
6649 : : }
6650 : : | FUNCTION Iconst '(' type_list ')' function_with_argtypes
6651 : : {
6291 6652 : 94 : CreateOpClassItem *n = makeNode(CreateOpClassItem);
6653 : :
6654 : 94 : n->itemtype = OPCLASS_ITEM_FUNCTION;
2664 peter_e@gmx.net 6655 : 94 : n->name = $6;
6291 tgl@sss.pgh.pa.us 6656 : 94 : n->number = $2;
6657 : 94 : n->class_args = $4;
6658 : 94 : $$ = (Node *) n;
6659 : : }
6660 : : | STORAGE Typename
6661 : : {
7930 6662 : 99 : CreateOpClassItem *n = makeNode(CreateOpClassItem);
6663 : :
6664 : 99 : n->itemtype = OPCLASS_ITEM_STORAGETYPE;
6665 : 99 : n->storedtype = $2;
6666 : 99 : $$ = (Node *) n;
6667 : : }
6668 : : ;
6669 : :
2433 peter_e@gmx.net 6670 : 145 : opt_default: DEFAULT { $$ = true; }
6671 : 78 : | /*EMPTY*/ { $$ = false; }
6672 : : ;
6673 : :
6291 tgl@sss.pgh.pa.us 6674 : 22 : opt_opfamily: FAMILY any_name { $$ = $2; }
6675 : 169 : | /*EMPTY*/ { $$ = NIL; }
6676 : : ;
6677 : :
4890 tgl@sss.pgh.pa.us 6678 :UBC 0 : opclass_purpose: FOR SEARCH { $$ = NIL; }
4890 tgl@sss.pgh.pa.us 6679 :CBC 36 : | FOR ORDER BY any_name { $$ = $4; }
6680 : 1023 : | /*EMPTY*/ { $$ = NIL; }
6681 : : ;
6682 : :
6683 : : opt_recheck: RECHECK
6684 : : {
6685 : : /*
6686 : : * RECHECK no longer does anything in opclass definitions,
6687 : : * but we still accept it to ease porting of old database
6688 : : * dumps.
6689 : : */
5436 tgl@sss.pgh.pa.us 6690 [ # # ]:UBC 0 : ereport(NOTICE,
6691 : : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
6692 : : errmsg("RECHECK is no longer required"),
6693 : : errhint("Update your data type."),
6694 : : parser_errposition(@1)));
2433 peter_e@gmx.net 6695 : 0 : $$ = true;
6696 : : }
2433 peter_e@gmx.net 6697 :CBC 1059 : | /*EMPTY*/ { $$ = false; }
6698 : : ;
6699 : :
6700 : :
6701 : : CreateOpFamilyStmt:
6702 : : CREATE OPERATOR FAMILY any_name USING name
6703 : : {
6291 tgl@sss.pgh.pa.us 6704 : 74 : CreateOpFamilyStmt *n = makeNode(CreateOpFamilyStmt);
6705 : :
6706 : 74 : n->opfamilyname = $4;
6707 : 74 : n->amname = $6;
6708 : 74 : $$ = (Node *) n;
6709 : : }
6710 : : ;
6711 : :
6712 : : AlterOpFamilyStmt:
6713 : : ALTER OPERATOR FAMILY any_name USING name ADD_P opclass_item_list
6714 : : {
6715 : 219 : AlterOpFamilyStmt *n = makeNode(AlterOpFamilyStmt);
6716 : :
6717 : 219 : n->opfamilyname = $4;
6718 : 219 : n->amname = $6;
6719 : 219 : n->isDrop = false;
6720 : 219 : n->items = $8;
6721 : 219 : $$ = (Node *) n;
6722 : : }
6723 : : | ALTER OPERATOR FAMILY any_name USING name DROP opclass_drop_list
6724 : : {
6725 : 32 : AlterOpFamilyStmt *n = makeNode(AlterOpFamilyStmt);
6726 : :
6727 : 32 : n->opfamilyname = $4;
6728 : 32 : n->amname = $6;
6729 : 32 : n->isDrop = true;
6730 : 32 : n->items = $8;
6731 : 32 : $$ = (Node *) n;
6732 : : }
6733 : : ;
6734 : :
6735 : : opclass_drop_list:
6736 : 32 : opclass_drop { $$ = list_make1($1); }
6737 : 15 : | opclass_drop_list ',' opclass_drop { $$ = lappend($1, $3); }
6738 : : ;
6739 : :
6740 : : opclass_drop:
6741 : : OPERATOR Iconst '(' type_list ')'
6742 : : {
6743 : 28 : CreateOpClassItem *n = makeNode(CreateOpClassItem);
6744 : :
6745 : 28 : n->itemtype = OPCLASS_ITEM_OPERATOR;
6746 : 28 : n->number = $2;
2664 peter_e@gmx.net 6747 : 28 : n->class_args = $4;
6291 tgl@sss.pgh.pa.us 6748 : 28 : $$ = (Node *) n;
6749 : : }
6750 : : | FUNCTION Iconst '(' type_list ')'
6751 : : {
6752 : 19 : CreateOpClassItem *n = makeNode(CreateOpClassItem);
6753 : :
6754 : 19 : n->itemtype = OPCLASS_ITEM_FUNCTION;
6755 : 19 : n->number = $2;
2664 peter_e@gmx.net 6756 : 19 : n->class_args = $4;
6291 tgl@sss.pgh.pa.us 6757 : 19 : $$ = (Node *) n;
6758 : : }
6759 : : ;
6760 : :
6761 : :
6762 : : DropOpClassStmt:
6763 : : DROP OPERATOR CLASS any_name USING name opt_drop_behavior
6764 : : {
4532 rhaas@postgresql.org 6765 : 19 : DropStmt *n = makeNode(DropStmt);
6766 : :
3317 alvherre@alvh.no-ip. 6767 : 19 : n->objects = list_make1(lcons(makeString($6), $4));
4532 rhaas@postgresql.org 6768 : 19 : n->removeType = OBJECT_OPCLASS;
7930 tgl@sss.pgh.pa.us 6769 : 19 : n->behavior = $7;
6512 andrew@dunslane.net 6770 : 19 : n->missing_ok = false;
4391 simon@2ndQuadrant.co 6771 : 19 : n->concurrent = false;
6512 andrew@dunslane.net 6772 : 19 : $$ = (Node *) n;
6773 : : }
6774 : : | DROP OPERATOR CLASS IF_P EXISTS any_name USING name opt_drop_behavior
6775 : : {
4532 rhaas@postgresql.org 6776 : 9 : DropStmt *n = makeNode(DropStmt);
6777 : :
3317 alvherre@alvh.no-ip. 6778 : 9 : n->objects = list_make1(lcons(makeString($8), $6));
4532 rhaas@postgresql.org 6779 : 9 : n->removeType = OBJECT_OPCLASS;
6512 andrew@dunslane.net 6780 : 9 : n->behavior = $9;
6781 : 9 : n->missing_ok = true;
4391 simon@2ndQuadrant.co 6782 : 9 : n->concurrent = false;
7930 tgl@sss.pgh.pa.us 6783 : 9 : $$ = (Node *) n;
6784 : : }
6785 : : ;
6786 : :
6787 : : DropOpFamilyStmt:
6788 : : DROP OPERATOR FAMILY any_name USING name opt_drop_behavior
6789 : : {
4532 rhaas@postgresql.org 6790 : 55 : DropStmt *n = makeNode(DropStmt);
6791 : :
3317 alvherre@alvh.no-ip. 6792 : 55 : n->objects = list_make1(lcons(makeString($6), $4));
4532 rhaas@postgresql.org 6793 : 55 : n->removeType = OBJECT_OPFAMILY;
6291 tgl@sss.pgh.pa.us 6794 : 55 : n->behavior = $7;
6795 : 55 : n->missing_ok = false;
4391 simon@2ndQuadrant.co 6796 : 55 : n->concurrent = false;
6291 tgl@sss.pgh.pa.us 6797 : 55 : $$ = (Node *) n;
6798 : : }
6799 : : | DROP OPERATOR FAMILY IF_P EXISTS any_name USING name opt_drop_behavior
6800 : : {
4532 rhaas@postgresql.org 6801 : 9 : DropStmt *n = makeNode(DropStmt);
6802 : :
3317 alvherre@alvh.no-ip. 6803 : 9 : n->objects = list_make1(lcons(makeString($8), $6));
4532 rhaas@postgresql.org 6804 : 9 : n->removeType = OBJECT_OPFAMILY;
6291 tgl@sss.pgh.pa.us 6805 : 9 : n->behavior = $9;
6806 : 9 : n->missing_ok = true;
4391 simon@2ndQuadrant.co 6807 : 9 : n->concurrent = false;
6291 tgl@sss.pgh.pa.us 6808 : 9 : $$ = (Node *) n;
6809 : : }
6810 : : ;
6811 : :
6812 : :
6813 : : /*****************************************************************************
6814 : : *
6815 : : * QUERY:
6816 : : *
6817 : : * DROP OWNED BY username [, username ...] [ RESTRICT | CASCADE ]
6818 : : * REASSIGN OWNED BY username [, username ...] TO username
6819 : : *
6820 : : *****************************************************************************/
6821 : : DropOwnedStmt:
6822 : : DROP OWNED BY role_list opt_drop_behavior
6823 : : {
6719 alvherre@alvh.no-ip. 6824 : 73 : DropOwnedStmt *n = makeNode(DropOwnedStmt);
6825 : :
6826 : 73 : n->roles = $4;
6827 : 73 : n->behavior = $5;
702 peter@eisentraut.org 6828 : 73 : $$ = (Node *) n;
6829 : : }
6830 : : ;
6831 : :
6832 : : ReassignOwnedStmt:
6833 : : REASSIGN OWNED BY role_list TO RoleSpec
6834 : : {
6719 alvherre@alvh.no-ip. 6835 : 19 : ReassignOwnedStmt *n = makeNode(ReassignOwnedStmt);
6836 : :
6837 : 19 : n->roles = $4;
6838 : 19 : n->newrole = $6;
702 peter@eisentraut.org 6839 : 19 : $$ = (Node *) n;
6840 : : }
6841 : : ;
6842 : :
6843 : : /*****************************************************************************
6844 : : *
6845 : : * QUERY:
6846 : : *
6847 : : * DROP itemtype [ IF EXISTS ] itemname [, itemname ...]
6848 : : * [ RESTRICT | CASCADE ]
6849 : : *
6850 : : *****************************************************************************/
6851 : :
6852 : : DropStmt: DROP object_type_any_name IF_P EXISTS any_name_list opt_drop_behavior
6853 : : {
8579 bruce@momjian.us 6854 : 631 : DropStmt *n = makeNode(DropStmt);
6855 : :
8575 tgl@sss.pgh.pa.us 6856 : 631 : n->removeType = $2;
2433 peter_e@gmx.net 6857 : 631 : n->missing_ok = true;
6721 andrew@dunslane.net 6858 : 631 : n->objects = $5;
6859 : 631 : n->behavior = $6;
4391 simon@2ndQuadrant.co 6860 : 631 : n->concurrent = false;
702 peter@eisentraut.org 6861 : 631 : $$ = (Node *) n;
6862 : : }
6863 : : | DROP object_type_any_name any_name_list opt_drop_behavior
6864 : : {
2710 peter_e@gmx.net 6865 : 7534 : DropStmt *n = makeNode(DropStmt);
6866 : :
6867 : 7534 : n->removeType = $2;
2433 6868 : 7534 : n->missing_ok = false;
2710 6869 : 7534 : n->objects = $3;
6870 : 7534 : n->behavior = $4;
6871 : 7534 : n->concurrent = false;
702 peter@eisentraut.org 6872 : 7534 : $$ = (Node *) n;
6873 : : }
6874 : : | DROP drop_type_name IF_P EXISTS name_list opt_drop_behavior
6875 : : {
2710 peter_e@gmx.net 6876 : 39 : DropStmt *n = makeNode(DropStmt);
6877 : :
6878 : 39 : n->removeType = $2;
2433 6879 : 39 : n->missing_ok = true;
2710 6880 : 39 : n->objects = $5;
6881 : 39 : n->behavior = $6;
6882 : 39 : n->concurrent = false;
702 peter@eisentraut.org 6883 : 39 : $$ = (Node *) n;
6884 : : }
6885 : : | DROP drop_type_name name_list opt_drop_behavior
6886 : : {
6721 andrew@dunslane.net 6887 : 621 : DropStmt *n = makeNode(DropStmt);
6888 : :
6889 : 621 : n->removeType = $2;
2433 peter_e@gmx.net 6890 : 621 : n->missing_ok = false;
8060 tgl@sss.pgh.pa.us 6891 : 621 : n->objects = $3;
8062 bruce@momjian.us 6892 : 621 : n->behavior = $4;
4391 simon@2ndQuadrant.co 6893 : 621 : n->concurrent = false;
702 peter@eisentraut.org 6894 : 621 : $$ = (Node *) n;
6895 : : }
6896 : : | DROP object_type_name_on_any_name name ON any_name opt_drop_behavior
6897 : : {
2609 peter_e@gmx.net 6898 : 536 : DropStmt *n = makeNode(DropStmt);
6899 : :
6900 : 536 : n->removeType = $2;
6901 : 536 : n->objects = list_make1(lappend($5, makeString($3)));
6902 : 536 : n->behavior = $6;
6903 : 536 : n->missing_ok = false;
6904 : 536 : n->concurrent = false;
6905 : 536 : $$ = (Node *) n;
6906 : : }
6907 : : | DROP object_type_name_on_any_name IF_P EXISTS name ON any_name opt_drop_behavior
6908 : : {
6909 : 24 : DropStmt *n = makeNode(DropStmt);
6910 : :
6911 : 24 : n->removeType = $2;
6912 : 24 : n->objects = list_make1(lappend($7, makeString($5)));
6913 : 24 : n->behavior = $8;
6914 : 24 : n->missing_ok = true;
6915 : 24 : n->concurrent = false;
6916 : 24 : $$ = (Node *) n;
6917 : : }
6918 : : | DROP TYPE_P type_name_list opt_drop_behavior
6919 : : {
3393 alvherre@alvh.no-ip. 6920 : 265 : DropStmt *n = makeNode(DropStmt);
6921 : :
6922 : 265 : n->removeType = OBJECT_TYPE;
2433 peter_e@gmx.net 6923 : 265 : n->missing_ok = false;
3393 alvherre@alvh.no-ip. 6924 : 265 : n->objects = $3;
6925 : 265 : n->behavior = $4;
6926 : 265 : n->concurrent = false;
6927 : 265 : $$ = (Node *) n;
6928 : : }
6929 : : | DROP TYPE_P IF_P EXISTS type_name_list opt_drop_behavior
6930 : : {
6931 : 11 : DropStmt *n = makeNode(DropStmt);
6932 : :
6933 : 11 : n->removeType = OBJECT_TYPE;
2433 peter_e@gmx.net 6934 : 11 : n->missing_ok = true;
3393 alvherre@alvh.no-ip. 6935 : 11 : n->objects = $5;
6936 : 11 : n->behavior = $6;
6937 : 11 : n->concurrent = false;
6938 : 11 : $$ = (Node *) n;
6939 : : }
6940 : : | DROP DOMAIN_P type_name_list opt_drop_behavior
6941 : : {
6942 : 202 : DropStmt *n = makeNode(DropStmt);
6943 : :
6944 : 202 : n->removeType = OBJECT_DOMAIN;
2433 peter_e@gmx.net 6945 : 202 : n->missing_ok = false;
3393 alvherre@alvh.no-ip. 6946 : 202 : n->objects = $3;
6947 : 202 : n->behavior = $4;
6948 : 202 : n->concurrent = false;
6949 : 202 : $$ = (Node *) n;
6950 : : }
6951 : : | DROP DOMAIN_P IF_P EXISTS type_name_list opt_drop_behavior
6952 : : {
6953 : 9 : DropStmt *n = makeNode(DropStmt);
6954 : :
6955 : 9 : n->removeType = OBJECT_DOMAIN;
2433 peter_e@gmx.net 6956 : 9 : n->missing_ok = true;
3393 alvherre@alvh.no-ip. 6957 : 9 : n->objects = $5;
6958 : 9 : n->behavior = $6;
6959 : 9 : n->concurrent = false;
6960 : 9 : $$ = (Node *) n;
6961 : : }
6962 : : | DROP INDEX CONCURRENTLY any_name_list opt_drop_behavior
6963 : : {
4391 simon@2ndQuadrant.co 6964 : 67 : DropStmt *n = makeNode(DropStmt);
6965 : :
6966 : 67 : n->removeType = OBJECT_INDEX;
2433 peter_e@gmx.net 6967 : 67 : n->missing_ok = false;
4391 simon@2ndQuadrant.co 6968 : 67 : n->objects = $4;
6969 : 67 : n->behavior = $5;
6970 : 67 : n->concurrent = true;
702 peter@eisentraut.org 6971 : 67 : $$ = (Node *) n;
6972 : : }
6973 : : | DROP INDEX CONCURRENTLY IF_P EXISTS any_name_list opt_drop_behavior
6974 : : {
4391 simon@2ndQuadrant.co 6975 : 6 : DropStmt *n = makeNode(DropStmt);
6976 : :
6977 : 6 : n->removeType = OBJECT_INDEX;
2433 peter_e@gmx.net 6978 : 6 : n->missing_ok = true;
4391 simon@2ndQuadrant.co 6979 : 6 : n->objects = $6;
6980 : 6 : n->behavior = $7;
6981 : 6 : n->concurrent = true;
702 peter@eisentraut.org 6982 : 6 : $$ = (Node *) n;
6983 : : }
6984 : : ;
6985 : :
6986 : : /* object types taking any_name/any_name_list */
6987 : : object_type_any_name:
2710 peter_e@gmx.net 6988 : 7040 : TABLE { $$ = OBJECT_TABLE; }
7597 6989 : 97 : | SEQUENCE { $$ = OBJECT_SEQUENCE; }
6990 : 468 : | VIEW { $$ = OBJECT_VIEW; }
4060 kgrittn@postgresql.o 6991 : 62 : | MATERIALIZED VIEW { $$ = OBJECT_MATVIEW; }
7597 peter_e@gmx.net 6992 : 371 : | INDEX { $$ = OBJECT_INDEX; }
4852 rhaas@postgresql.org 6993 : 85 : | FOREIGN TABLE { $$ = OBJECT_FOREIGN_TABLE; }
4810 peter_e@gmx.net 6994 : 45 : | COLLATION { $$ = OBJECT_COLLATION; }
7597 6995 : 28 : | CONVERSION_P { $$ = OBJECT_CONVERSION; }
2578 alvherre@alvh.no-ip. 6996 : 96 : | STATISTICS { $$ = OBJECT_STATISTIC_EXT; }
6081 tgl@sss.pgh.pa.us 6997 : 10 : | TEXT_P SEARCH PARSER { $$ = OBJECT_TSPARSER; }
6998 : 1051 : | TEXT_P SEARCH DICTIONARY { $$ = OBJECT_TSDICTIONARY; }
6999 : 47 : | TEXT_P SEARCH TEMPLATE { $$ = OBJECT_TSTEMPLATE; }
7000 : 1053 : | TEXT_P SEARCH CONFIGURATION { $$ = OBJECT_TSCONFIGURATION; }
7001 : : ;
7002 : :
7003 : : /*
7004 : : * object types taking name/name_list
7005 : : *
7006 : : * DROP handles some of them separately
7007 : : */
7008 : :
7009 : : object_type_name:
1401 peter@eisentraut.org 7010 : 91 : drop_type_name { $$ = $1; }
7011 : 87 : | DATABASE { $$ = OBJECT_DATABASE; }
7012 : 26 : | ROLE { $$ = OBJECT_ROLE; }
7013 : 5 : | SUBSCRIPTION { $$ = OBJECT_SUBSCRIPTION; }
1401 peter@eisentraut.org 7014 :UBC 0 : | TABLESPACE { $$ = OBJECT_TABLESPACE; }
7015 : : ;
7016 : :
7017 : : drop_type_name:
2710 peter_e@gmx.net 7018 :CBC 23 : ACCESS METHOD { $$ = OBJECT_ACCESS_METHOD; }
7019 : 63 : | EVENT TRIGGER { $$ = OBJECT_EVENT_TRIGGER; }
7020 : 55 : | EXTENSION { $$ = OBJECT_EXTENSION; }
2609 7021 : 74 : | FOREIGN DATA_P WRAPPER { $$ = OBJECT_FDW; }
1403 peter@eisentraut.org 7022 : 66 : | opt_procedural LANGUAGE { $$ = OBJECT_LANGUAGE; }
2642 peter_e@gmx.net 7023 : 141 : | PUBLICATION { $$ = OBJECT_PUBLICATION; }
2710 7024 : 264 : | SCHEMA { $$ = OBJECT_SCHEMA; }
2609 7025 : 65 : | SERVER { $$ = OBJECT_FOREIGN_SERVER; }
7026 : : ;
7027 : :
7028 : : /* object types attached to a table */
7029 : : object_type_name_on_any_name:
7030 : 82 : POLICY { $$ = OBJECT_POLICY; }
7031 : 125 : | RULE { $$ = OBJECT_RULE; }
7032 : 379 : | TRIGGER { $$ = OBJECT_TRIGGER; }
7033 : : ;
7034 : :
7035 : : any_name_list:
7259 neilc@samurai.com 7036 : 11510 : any_name { $$ = list_make1($1); }
7972 bruce@momjian.us 7037 : 1868 : | any_name_list ',' any_name { $$ = lappend($1, $3); }
7038 : : ;
7039 : :
7259 neilc@samurai.com 7040 : 26195 : any_name: ColId { $$ = list_make1(makeString($1)); }
7249 tgl@sss.pgh.pa.us 7041 : 4151 : | ColId attrs { $$ = lcons(makeString($1), $2); }
7042 : : ;
7043 : :
7044 : : attrs: '.' attr_name
7045 : 47153 : { $$ = list_make1(makeString($2)); }
7046 : : | attrs '.' attr_name
7097 7047 : 32 : { $$ = lappend($1, makeString($3)); }
7048 : : ;
7049 : :
7050 : : type_name_list:
2710 peter_e@gmx.net 7051 : 487 : Typename { $$ = list_make1($1); }
7052 : 39 : | type_name_list ',' Typename { $$ = lappend($1, $3); }
7053 : : ;
7054 : :
7055 : : /*****************************************************************************
7056 : : *
7057 : : * QUERY:
7058 : : * truncate table relname1, relname2, ...
7059 : : *
7060 : : *****************************************************************************/
7061 : :
7062 : : TruncateStmt:
7063 : : TRUNCATE opt_table relation_expr_list opt_restart_seqs opt_drop_behavior
7064 : : {
8970 bruce@momjian.us 7065 : 723 : TruncateStmt *n = makeNode(TruncateStmt);
7066 : :
7017 tgl@sss.pgh.pa.us 7067 : 723 : n->relations = $3;
5812 7068 : 723 : n->restart_seqs = $4;
7069 : 723 : n->behavior = $5;
702 peter@eisentraut.org 7070 : 723 : $$ = (Node *) n;
7071 : : }
7072 : : ;
7073 : :
7074 : : opt_restart_seqs:
5812 tgl@sss.pgh.pa.us 7075 : 12 : CONTINUE_P IDENTITY_P { $$ = false; }
7076 : 12 : | RESTART IDENTITY_P { $$ = true; }
7077 : 699 : | /* EMPTY */ { $$ = false; }
7078 : : ;
7079 : :
7080 : : /*****************************************************************************
7081 : : *
7082 : : * COMMENT ON <object> IS <text>
7083 : : *
7084 : : *****************************************************************************/
7085 : :
7086 : : CommentStmt:
7087 : : COMMENT ON object_type_any_name any_name IS comment_text
7088 : : {
7972 bruce@momjian.us 7089 : 2226 : CommentStmt *n = makeNode(CommentStmt);
7090 : :
7091 : 2226 : n->objtype = $3;
2710 peter_e@gmx.net 7092 : 2226 : n->object = (Node *) $4;
7093 : 2226 : n->comment = $6;
7094 : 2226 : $$ = (Node *) n;
7095 : : }
7096 : : | COMMENT ON COLUMN any_name IS comment_text
7097 : : {
1401 peter@eisentraut.org 7098 : 54 : CommentStmt *n = makeNode(CommentStmt);
7099 : :
7100 : 54 : n->objtype = OBJECT_COLUMN;
7101 : 54 : n->object = (Node *) $4;
7102 : 54 : n->comment = $6;
7103 : 54 : $$ = (Node *) n;
7104 : : }
7105 : : | COMMENT ON object_type_name name IS comment_text
7106 : : {
2710 peter_e@gmx.net 7107 : 178 : CommentStmt *n = makeNode(CommentStmt);
7108 : :
7109 : 178 : n->objtype = $3;
7110 : 178 : n->object = (Node *) makeString($4);
7972 bruce@momjian.us 7111 : 178 : n->comment = $6;
7112 : 178 : $$ = (Node *) n;
7113 : : }
7114 : : | COMMENT ON TYPE_P Typename IS comment_text
7115 : : {
3393 alvherre@alvh.no-ip. 7116 : 28 : CommentStmt *n = makeNode(CommentStmt);
7117 : :
7118 : 28 : n->objtype = OBJECT_TYPE;
2710 peter_e@gmx.net 7119 : 28 : n->object = (Node *) $4;
3393 alvherre@alvh.no-ip. 7120 : 28 : n->comment = $6;
7121 : 28 : $$ = (Node *) n;
7122 : : }
7123 : : | COMMENT ON DOMAIN_P Typename IS comment_text
7124 : : {
7125 : 4 : CommentStmt *n = makeNode(CommentStmt);
7126 : :
7127 : 4 : n->objtype = OBJECT_DOMAIN;
2710 peter_e@gmx.net 7128 : 4 : n->object = (Node *) $4;
3393 alvherre@alvh.no-ip. 7129 : 4 : n->comment = $6;
7130 : 4 : $$ = (Node *) n;
7131 : : }
7132 : : | COMMENT ON AGGREGATE aggregate_with_argtypes IS comment_text
7133 : : {
7972 bruce@momjian.us 7134 : 20 : CommentStmt *n = makeNode(CommentStmt);
7135 : :
7597 peter_e@gmx.net 7136 : 20 : n->objtype = OBJECT_AGGREGATE;
2710 7137 : 20 : n->object = (Node *) $4;
2768 7138 : 20 : n->comment = $6;
7972 bruce@momjian.us 7139 : 20 : $$ = (Node *) n;
7140 : : }
7141 : : | COMMENT ON FUNCTION function_with_argtypes IS comment_text
7142 : : {
7143 : 85 : CommentStmt *n = makeNode(CommentStmt);
7144 : :
7597 peter_e@gmx.net 7145 : 85 : n->objtype = OBJECT_FUNCTION;
2710 7146 : 85 : n->object = (Node *) $4;
2768 7147 : 85 : n->comment = $6;
7972 bruce@momjian.us 7148 : 85 : $$ = (Node *) n;
7149 : : }
7150 : : | COMMENT ON OPERATOR operator_with_argtypes IS comment_text
7151 : : {
7152 : 9 : CommentStmt *n = makeNode(CommentStmt);
7153 : :
7597 peter_e@gmx.net 7154 : 9 : n->objtype = OBJECT_OPERATOR;
2710 7155 : 9 : n->object = (Node *) $4;
2664 7156 : 9 : n->comment = $6;
7972 bruce@momjian.us 7157 : 9 : $$ = (Node *) n;
7158 : : }
7159 : : | COMMENT ON CONSTRAINT name ON any_name IS comment_text
7160 : : {
7161 : 52 : CommentStmt *n = makeNode(CommentStmt);
7162 : :
3400 alvherre@alvh.no-ip. 7163 : 52 : n->objtype = OBJECT_TABCONSTRAINT;
2710 peter_e@gmx.net 7164 : 52 : n->object = (Node *) lappend($6, makeString($4));
7972 bruce@momjian.us 7165 : 52 : n->comment = $8;
7166 : 52 : $$ = (Node *) n;
7167 : : }
7168 : : | COMMENT ON CONSTRAINT name ON DOMAIN_P any_name IS comment_text
7169 : : {
3400 alvherre@alvh.no-ip. 7170 : 19 : CommentStmt *n = makeNode(CommentStmt);
7171 : :
7172 : 19 : n->objtype = OBJECT_DOMCONSTRAINT;
7173 : : /*
7174 : : * should use Typename not any_name in the production, but
7175 : : * there's a shift/reduce conflict if we do that, so fix it
7176 : : * up here.
7177 : : */
2710 peter_e@gmx.net 7178 : 19 : n->object = (Node *) list_make2(makeTypeNameFromNameList($7), makeString($4));
3400 alvherre@alvh.no-ip. 7179 : 19 : n->comment = $9;
7180 : 19 : $$ = (Node *) n;
7181 : : }
7182 : : | COMMENT ON object_type_name_on_any_name name ON any_name IS comment_text
7183 : : {
3426 sfrost@snowman.net 7184 : 20 : CommentStmt *n = makeNode(CommentStmt);
7185 : :
1401 peter@eisentraut.org 7186 : 20 : n->objtype = $3;
2710 peter_e@gmx.net 7187 : 20 : n->object = (Node *) lappend($6, makeString($4));
3426 sfrost@snowman.net 7188 : 20 : n->comment = $8;
7189 : 20 : $$ = (Node *) n;
7190 : : }
7191 : : | COMMENT ON PROCEDURE function_with_argtypes IS comment_text
7192 : : {
2327 peter_e@gmx.net 7193 :UBC 0 : CommentStmt *n = makeNode(CommentStmt);
7194 : :
7195 : 0 : n->objtype = OBJECT_PROCEDURE;
7196 : 0 : n->object = (Node *) $4;
7197 : 0 : n->comment = $6;
7198 : 0 : $$ = (Node *) n;
7199 : : }
7200 : : | COMMENT ON ROUTINE function_with_argtypes IS comment_text
7201 : : {
7202 : 0 : CommentStmt *n = makeNode(CommentStmt);
7203 : :
7204 : 0 : n->objtype = OBJECT_ROUTINE;
7205 : 0 : n->object = (Node *) $4;
7206 : 0 : n->comment = $6;
7207 : 0 : $$ = (Node *) n;
7208 : : }
7209 : : | COMMENT ON TRANSFORM FOR Typename LANGUAGE name IS comment_text
7210 : : {
3276 peter_e@gmx.net 7211 :CBC 7 : CommentStmt *n = makeNode(CommentStmt);
7212 : :
7213 : 7 : n->objtype = OBJECT_TRANSFORM;
2710 7214 : 7 : n->object = (Node *) list_make2($5, makeString($7));
3276 7215 : 7 : n->comment = $9;
7216 : 7 : $$ = (Node *) n;
7217 : : }
7218 : : | COMMENT ON OPERATOR CLASS any_name USING name IS comment_text
7219 : : {
7450 tgl@sss.pgh.pa.us 7220 :UBC 0 : CommentStmt *n = makeNode(CommentStmt);
7221 : :
7222 : 0 : n->objtype = OBJECT_OPCLASS;
2710 peter_e@gmx.net 7223 : 0 : n->object = (Node *) lcons(makeString($7), $5);
7450 tgl@sss.pgh.pa.us 7224 : 0 : n->comment = $9;
7225 : 0 : $$ = (Node *) n;
7226 : : }
7227 : : | COMMENT ON OPERATOR FAMILY any_name USING name IS comment_text
7228 : : {
6291 7229 : 0 : CommentStmt *n = makeNode(CommentStmt);
7230 : :
7231 : 0 : n->objtype = OBJECT_OPFAMILY;
2710 peter_e@gmx.net 7232 : 0 : n->object = (Node *) lcons(makeString($7), $5);
6291 tgl@sss.pgh.pa.us 7233 : 0 : n->comment = $9;
7234 : 0 : $$ = (Node *) n;
7235 : : }
7236 : : | COMMENT ON LARGE_P OBJECT_P NumericOnly IS comment_text
7237 : : {
7450 tgl@sss.pgh.pa.us 7238 :CBC 12 : CommentStmt *n = makeNode(CommentStmt);
7239 : :
7240 : 12 : n->objtype = OBJECT_LARGEOBJECT;
2710 peter_e@gmx.net 7241 : 12 : n->object = (Node *) $5;
7450 tgl@sss.pgh.pa.us 7242 : 12 : n->comment = $7;
7243 : 12 : $$ = (Node *) n;
7244 : : }
7245 : : | COMMENT ON CAST '(' Typename AS Typename ')' IS comment_text
7246 : : {
7450 tgl@sss.pgh.pa.us 7247 :UBC 0 : CommentStmt *n = makeNode(CommentStmt);
7248 : :
7249 : 0 : n->objtype = OBJECT_CAST;
2710 peter_e@gmx.net 7250 : 0 : n->object = (Node *) list_make2($5, $7);
7450 tgl@sss.pgh.pa.us 7251 : 0 : n->comment = $10;
7252 : 0 : $$ = (Node *) n;
7253 : : }
7254 : : ;
7255 : :
7256 : : comment_text:
7945 tgl@sss.pgh.pa.us 7257 :CBC 2662 : Sconst { $$ = $1; }
7258 : 52 : | NULL_P { $$ = NULL; }
7259 : : ;
7260 : :
7261 : :
7262 : : /*****************************************************************************
7263 : : *
7264 : : * SECURITY LABEL [FOR <provider>] ON <object> IS <label>
7265 : : *
7266 : : * As with COMMENT ON, <object> can refer to various types of database
7267 : : * objects (e.g. TABLE, COLUMN, etc.).
7268 : : *
7269 : : *****************************************************************************/
7270 : :
7271 : : SecLabelStmt:
7272 : : SECURITY LABEL opt_provider ON object_type_any_name any_name
7273 : : IS security_label
7274 : : {
4948 rhaas@postgresql.org 7275 : 24 : SecLabelStmt *n = makeNode(SecLabelStmt);
7276 : :
7277 : 24 : n->provider = $3;
7278 : 24 : n->objtype = $5;
2710 peter_e@gmx.net 7279 : 24 : n->object = (Node *) $6;
7280 : 24 : n->label = $8;
7281 : 24 : $$ = (Node *) n;
7282 : : }
7283 : : | SECURITY LABEL opt_provider ON COLUMN any_name
7284 : : IS security_label
7285 : : {
1401 peter@eisentraut.org 7286 : 2 : SecLabelStmt *n = makeNode(SecLabelStmt);
7287 : :
7288 : 2 : n->provider = $3;
7289 : 2 : n->objtype = OBJECT_COLUMN;
7290 : 2 : n->object = (Node *) $6;
7291 : 2 : n->label = $8;
7292 : 2 : $$ = (Node *) n;
7293 : : }
7294 : : | SECURITY LABEL opt_provider ON object_type_name name
7295 : : IS security_label
7296 : : {
2710 peter_e@gmx.net 7297 : 22 : SecLabelStmt *n = makeNode(SecLabelStmt);
7298 : :
7299 : 22 : n->provider = $3;
7300 : 22 : n->objtype = $5;
7301 : 22 : n->object = (Node *) makeString($6);
4948 rhaas@postgresql.org 7302 : 22 : n->label = $8;
7303 : 22 : $$ = (Node *) n;
7304 : : }
7305 : : | SECURITY LABEL opt_provider ON TYPE_P Typename
7306 : : IS security_label
7307 : : {
3393 alvherre@alvh.no-ip. 7308 :UBC 0 : SecLabelStmt *n = makeNode(SecLabelStmt);
7309 : :
7310 : 0 : n->provider = $3;
7311 : 0 : n->objtype = OBJECT_TYPE;
2710 peter_e@gmx.net 7312 : 0 : n->object = (Node *) $6;
3393 alvherre@alvh.no-ip. 7313 : 0 : n->label = $8;
7314 : 0 : $$ = (Node *) n;
7315 : : }
7316 : : | SECURITY LABEL opt_provider ON DOMAIN_P Typename
7317 : : IS security_label
7318 : : {
3393 alvherre@alvh.no-ip. 7319 :CBC 1 : SecLabelStmt *n = makeNode(SecLabelStmt);
7320 : :
7321 : 1 : n->provider = $3;
2447 peter_e@gmx.net 7322 : 1 : n->objtype = OBJECT_DOMAIN;
2710 7323 : 1 : n->object = (Node *) $6;
3393 alvherre@alvh.no-ip. 7324 : 1 : n->label = $8;
7325 : 1 : $$ = (Node *) n;
7326 : : }
7327 : : | SECURITY LABEL opt_provider ON AGGREGATE aggregate_with_argtypes
7328 : : IS security_label
7329 : : {
4948 rhaas@postgresql.org 7330 :UBC 0 : SecLabelStmt *n = makeNode(SecLabelStmt);
7331 : :
7332 : 0 : n->provider = $3;
7333 : 0 : n->objtype = OBJECT_AGGREGATE;
2710 peter_e@gmx.net 7334 : 0 : n->object = (Node *) $6;
2768 7335 : 0 : n->label = $8;
4948 rhaas@postgresql.org 7336 : 0 : $$ = (Node *) n;
7337 : : }
7338 : : | SECURITY LABEL opt_provider ON FUNCTION function_with_argtypes
7339 : : IS security_label
7340 : : {
4948 rhaas@postgresql.org 7341 :CBC 1 : SecLabelStmt *n = makeNode(SecLabelStmt);
7342 : :
7343 : 1 : n->provider = $3;
7344 : 1 : n->objtype = OBJECT_FUNCTION;
2710 peter_e@gmx.net 7345 : 1 : n->object = (Node *) $6;
2768 7346 : 1 : n->label = $8;
4948 rhaas@postgresql.org 7347 : 1 : $$ = (Node *) n;
7348 : : }
7349 : : | SECURITY LABEL opt_provider ON LARGE_P OBJECT_P NumericOnly
7350 : : IS security_label
7351 : : {
4948 rhaas@postgresql.org 7352 :UBC 0 : SecLabelStmt *n = makeNode(SecLabelStmt);
7353 : :
7354 : 0 : n->provider = $3;
7355 : 0 : n->objtype = OBJECT_LARGEOBJECT;
2710 peter_e@gmx.net 7356 : 0 : n->object = (Node *) $7;
4948 rhaas@postgresql.org 7357 : 0 : n->label = $9;
7358 : 0 : $$ = (Node *) n;
7359 : : }
7360 : : | SECURITY LABEL opt_provider ON PROCEDURE function_with_argtypes
7361 : : IS security_label
7362 : : {
2327 peter_e@gmx.net 7363 : 0 : SecLabelStmt *n = makeNode(SecLabelStmt);
7364 : :
7365 : 0 : n->provider = $3;
7366 : 0 : n->objtype = OBJECT_PROCEDURE;
7367 : 0 : n->object = (Node *) $6;
7368 : 0 : n->label = $8;
7369 : 0 : $$ = (Node *) n;
7370 : : }
7371 : : | SECURITY LABEL opt_provider ON ROUTINE function_with_argtypes
7372 : : IS security_label
7373 : : {
7374 : 0 : SecLabelStmt *n = makeNode(SecLabelStmt);
7375 : :
7376 : 0 : n->provider = $3;
7377 : 0 : n->objtype = OBJECT_ROUTINE;
7378 : 0 : n->object = (Node *) $6;
7379 : 0 : n->label = $8;
7380 : 0 : $$ = (Node *) n;
7381 : : }
7382 : : ;
7383 : :
3969 tgl@sss.pgh.pa.us 7384 :CBC 10 : opt_provider: FOR NonReservedWord_or_Sconst { $$ = $2; }
1245 peter@eisentraut.org 7385 : 40 : | /* EMPTY */ { $$ = NULL; }
7386 : : ;
7387 : :
4948 rhaas@postgresql.org 7388 : 50 : security_label: Sconst { $$ = $1; }
4948 rhaas@postgresql.org 7389 :UBC 0 : | NULL_P { $$ = NULL; }
7390 : : ;
7391 : :
7392 : : /*****************************************************************************
7393 : : *
7394 : : * QUERY:
7395 : : * fetch/move
7396 : : *
7397 : : *****************************************************************************/
7398 : :
7399 : : FetchStmt: FETCH fetch_args
7400 : : {
7705 tgl@sss.pgh.pa.us 7401 :CBC 2653 : FetchStmt *n = (FetchStmt *) $2;
7402 : :
2433 peter_e@gmx.net 7403 : 2653 : n->ismove = false;
702 peter@eisentraut.org 7404 : 2653 : $$ = (Node *) n;
7405 : : }
7406 : : | MOVE fetch_args
7407 : : {
7705 tgl@sss.pgh.pa.us 7408 : 47 : FetchStmt *n = (FetchStmt *) $2;
7409 : :
2433 peter_e@gmx.net 7410 : 47 : n->ismove = true;
702 peter@eisentraut.org 7411 : 47 : $$ = (Node *) n;
7412 : : }
7413 : : ;
7414 : :
7415 : : fetch_args: cursor_name
7416 : : {
8853 bruce@momjian.us 7417 : 80 : FetchStmt *n = makeNode(FetchStmt);
7418 : :
5268 alvherre@alvh.no-ip. 7419 : 80 : n->portalname = $1;
7734 tgl@sss.pgh.pa.us 7420 : 80 : n->direction = FETCH_FORWARD;
8853 bruce@momjian.us 7421 : 80 : n->howMany = 1;
702 peter@eisentraut.org 7422 : 80 : $$ = (Node *) n;
7423 : : }
7424 : : | from_in cursor_name
7425 : : {
8853 bruce@momjian.us 7426 : 74 : FetchStmt *n = makeNode(FetchStmt);
7427 : :
5268 alvherre@alvh.no-ip. 7428 : 74 : n->portalname = $2;
7734 tgl@sss.pgh.pa.us 7429 : 74 : n->direction = FETCH_FORWARD;
8853 bruce@momjian.us 7430 : 74 : n->howMany = 1;
702 peter@eisentraut.org 7431 : 74 : $$ = (Node *) n;
7432 : : }
7433 : : | NEXT opt_from_in cursor_name
7434 : : {
9694 vadim4o@yahoo.com 7435 : 128 : FetchStmt *n = makeNode(FetchStmt);
7436 : :
5268 alvherre@alvh.no-ip. 7437 : 128 : n->portalname = $3;
7705 tgl@sss.pgh.pa.us 7438 : 128 : n->direction = FETCH_FORWARD;
7439 : 128 : n->howMany = 1;
702 peter@eisentraut.org 7440 : 128 : $$ = (Node *) n;
7441 : : }
7442 : : | PRIOR opt_from_in cursor_name
7443 : : {
8853 bruce@momjian.us 7444 : 15 : FetchStmt *n = makeNode(FetchStmt);
7445 : :
5268 alvherre@alvh.no-ip. 7446 : 15 : n->portalname = $3;
7705 tgl@sss.pgh.pa.us 7447 : 15 : n->direction = FETCH_BACKWARD;
7448 : 15 : n->howMany = 1;
702 peter@eisentraut.org 7449 : 15 : $$ = (Node *) n;
7450 : : }
7451 : : | FIRST_P opt_from_in cursor_name
7452 : : {
8853 bruce@momjian.us 7453 : 12 : FetchStmt *n = makeNode(FetchStmt);
7454 : :
5268 alvherre@alvh.no-ip. 7455 : 12 : n->portalname = $3;
7705 tgl@sss.pgh.pa.us 7456 : 12 : n->direction = FETCH_ABSOLUTE;
8853 bruce@momjian.us 7457 : 12 : n->howMany = 1;
702 peter@eisentraut.org 7458 : 12 : $$ = (Node *) n;
7459 : : }
7460 : : | LAST_P opt_from_in cursor_name
7461 : : {
7705 tgl@sss.pgh.pa.us 7462 : 9 : FetchStmt *n = makeNode(FetchStmt);
7463 : :
5268 alvherre@alvh.no-ip. 7464 : 9 : n->portalname = $3;
7705 tgl@sss.pgh.pa.us 7465 : 9 : n->direction = FETCH_ABSOLUTE;
7466 : 9 : n->howMany = -1;
702 peter@eisentraut.org 7467 : 9 : $$ = (Node *) n;
7468 : : }
7469 : : | ABSOLUTE_P SignedIconst opt_from_in cursor_name
7470 : : {
7705 tgl@sss.pgh.pa.us 7471 : 40 : FetchStmt *n = makeNode(FetchStmt);
7472 : :
5268 alvherre@alvh.no-ip. 7473 : 40 : n->portalname = $4;
7705 tgl@sss.pgh.pa.us 7474 : 40 : n->direction = FETCH_ABSOLUTE;
7475 : 40 : n->howMany = $2;
702 peter@eisentraut.org 7476 : 40 : $$ = (Node *) n;
7477 : : }
7478 : : | RELATIVE_P SignedIconst opt_from_in cursor_name
7479 : : {
7705 tgl@sss.pgh.pa.us 7480 : 15 : FetchStmt *n = makeNode(FetchStmt);
7481 : :
5268 alvherre@alvh.no-ip. 7482 : 15 : n->portalname = $4;
7705 tgl@sss.pgh.pa.us 7483 : 15 : n->direction = FETCH_RELATIVE;
7484 : 15 : n->howMany = $2;
702 peter@eisentraut.org 7485 : 15 : $$ = (Node *) n;
7486 : : }
7487 : : | SignedIconst opt_from_in cursor_name
7488 : : {
7705 tgl@sss.pgh.pa.us 7489 : 1967 : FetchStmt *n = makeNode(FetchStmt);
7490 : :
5268 alvherre@alvh.no-ip. 7491 : 1967 : n->portalname = $3;
7705 tgl@sss.pgh.pa.us 7492 : 1967 : n->direction = FETCH_FORWARD;
7493 : 1967 : n->howMany = $1;
702 peter@eisentraut.org 7494 : 1967 : $$ = (Node *) n;
7495 : : }
7496 : : | ALL opt_from_in cursor_name
7497 : : {
7705 tgl@sss.pgh.pa.us 7498 : 132 : FetchStmt *n = makeNode(FetchStmt);
7499 : :
5268 alvherre@alvh.no-ip. 7500 : 132 : n->portalname = $3;
7705 tgl@sss.pgh.pa.us 7501 : 132 : n->direction = FETCH_FORWARD;
7502 : 132 : n->howMany = FETCH_ALL;
702 peter@eisentraut.org 7503 : 132 : $$ = (Node *) n;
7504 : : }
7505 : : | FORWARD opt_from_in cursor_name
7506 : : {
8853 bruce@momjian.us 7507 : 9 : FetchStmt *n = makeNode(FetchStmt);
7508 : :
5268 alvherre@alvh.no-ip. 7509 : 9 : n->portalname = $3;
7734 tgl@sss.pgh.pa.us 7510 : 9 : n->direction = FETCH_FORWARD;
8853 bruce@momjian.us 7511 : 9 : n->howMany = 1;
702 peter@eisentraut.org 7512 : 9 : $$ = (Node *) n;
7513 : : }
7514 : : | FORWARD SignedIconst opt_from_in cursor_name
7515 : : {
8853 bruce@momjian.us 7516 : 1 : FetchStmt *n = makeNode(FetchStmt);
7517 : :
5268 alvherre@alvh.no-ip. 7518 : 1 : n->portalname = $4;
7734 tgl@sss.pgh.pa.us 7519 : 1 : n->direction = FETCH_FORWARD;
7705 7520 : 1 : n->howMany = $2;
702 peter@eisentraut.org 7521 : 1 : $$ = (Node *) n;
7522 : : }
7523 : : | FORWARD ALL opt_from_in cursor_name
7524 : : {
7705 tgl@sss.pgh.pa.us 7525 : 7 : FetchStmt *n = makeNode(FetchStmt);
7526 : :
5268 alvherre@alvh.no-ip. 7527 : 7 : n->portalname = $4;
7705 tgl@sss.pgh.pa.us 7528 : 7 : n->direction = FETCH_FORWARD;
7529 : 7 : n->howMany = FETCH_ALL;
702 peter@eisentraut.org 7530 : 7 : $$ = (Node *) n;
7531 : : }
7532 : : | BACKWARD opt_from_in cursor_name
7533 : : {
7705 tgl@sss.pgh.pa.us 7534 : 39 : FetchStmt *n = makeNode(FetchStmt);
7535 : :
5268 alvherre@alvh.no-ip. 7536 : 39 : n->portalname = $3;
7705 tgl@sss.pgh.pa.us 7537 : 39 : n->direction = FETCH_BACKWARD;
8853 bruce@momjian.us 7538 : 39 : n->howMany = 1;
702 peter@eisentraut.org 7539 : 39 : $$ = (Node *) n;
7540 : : }
7541 : : | BACKWARD SignedIconst opt_from_in cursor_name
7542 : : {
7705 tgl@sss.pgh.pa.us 7543 : 109 : FetchStmt *n = makeNode(FetchStmt);
7544 : :
5268 alvherre@alvh.no-ip. 7545 : 109 : n->portalname = $4;
7705 tgl@sss.pgh.pa.us 7546 : 109 : n->direction = FETCH_BACKWARD;
7547 : 109 : n->howMany = $2;
702 peter@eisentraut.org 7548 : 109 : $$ = (Node *) n;
7549 : : }
7550 : : | BACKWARD ALL opt_from_in cursor_name
7551 : : {
7705 tgl@sss.pgh.pa.us 7552 : 63 : FetchStmt *n = makeNode(FetchStmt);
7553 : :
5268 alvherre@alvh.no-ip. 7554 : 63 : n->portalname = $4;
7705 tgl@sss.pgh.pa.us 7555 : 63 : n->direction = FETCH_BACKWARD;
7556 : 63 : n->howMany = FETCH_ALL;
702 peter@eisentraut.org 7557 : 63 : $$ = (Node *) n;
7558 : : }
7559 : : ;
7560 : :
7561 : : from_in: FROM
7562 : : | IN_P
7563 : : ;
7564 : :
7565 : : opt_from_in: from_in
7566 : : | /* EMPTY */
7567 : : ;
7568 : :
7569 : :
7570 : : /*****************************************************************************
7571 : : *
7572 : : * GRANT and REVOKE statements
7573 : : *
7574 : : *****************************************************************************/
7575 : :
7576 : : GrantStmt: GRANT privileges ON privilege_target TO grantee_list
7577 : : opt_grant_grant_option opt_granted_by
7578 : : {
8345 peter_e@gmx.net 7579 : 4068 : GrantStmt *n = makeNode(GrantStmt);
7580 : :
7581 : 4068 : n->is_grant = true;
7582 : 4068 : n->privileges = $2;
5298 tgl@sss.pgh.pa.us 7583 : 4068 : n->targtype = ($4)->targtype;
8091 peter_e@gmx.net 7584 : 4068 : n->objtype = ($4)->objtype;
7585 : 4068 : n->objects = ($4)->objs;
7586 : 4068 : n->grantees = $6;
7752 7587 : 4068 : n->grant_option = $7;
1170 peter@eisentraut.org 7588 : 4068 : n->grantor = $8;
702 7589 : 4068 : $$ = (Node *) n;
7590 : : }
7591 : : ;
7592 : :
7593 : : RevokeStmt:
7594 : : REVOKE privileges ON privilege_target
7595 : : FROM grantee_list opt_granted_by opt_drop_behavior
7596 : : {
8091 peter_e@gmx.net 7597 : 3462 : GrantStmt *n = makeNode(GrantStmt);
7598 : :
7599 : 3462 : n->is_grant = false;
6865 tgl@sss.pgh.pa.us 7600 : 3462 : n->grant_option = false;
7601 : 3462 : n->privileges = $2;
5298 7602 : 3462 : n->targtype = ($4)->targtype;
6865 7603 : 3462 : n->objtype = ($4)->objtype;
7604 : 3462 : n->objects = ($4)->objs;
7605 : 3462 : n->grantees = $6;
1170 peter@eisentraut.org 7606 : 3462 : n->grantor = $7;
7607 : 3462 : n->behavior = $8;
702 7608 : 3462 : $$ = (Node *) n;
7609 : : }
7610 : : | REVOKE GRANT OPTION FOR privileges ON privilege_target
7611 : : FROM grantee_list opt_granted_by opt_drop_behavior
7612 : : {
6865 tgl@sss.pgh.pa.us 7613 : 7 : GrantStmt *n = makeNode(GrantStmt);
7614 : :
7615 : 7 : n->is_grant = false;
7616 : 7 : n->grant_option = true;
7617 : 7 : n->privileges = $5;
5298 7618 : 7 : n->targtype = ($7)->targtype;
6865 7619 : 7 : n->objtype = ($7)->objtype;
7620 : 7 : n->objects = ($7)->objs;
7621 : 7 : n->grantees = $9;
1170 peter@eisentraut.org 7622 : 7 : n->grantor = $10;
7623 : 7 : n->behavior = $11;
702 7624 : 7 : $$ = (Node *) n;
7625 : : }
7626 : : ;
7627 : :
7628 : :
7629 : : /*
7630 : : * Privilege names are represented as strings; the validity of the privilege
7631 : : * names gets checked at execution. This is a bit annoying but we have little
7632 : : * choice because of the syntactic conflict with lists of role names in
7633 : : * GRANT/REVOKE. What's more, we have to call out in the "privilege"
7634 : : * production any reserved keywords that need to be usable as privilege names.
7635 : : */
7636 : :
7637 : : /* either ALL [PRIVILEGES] or a list of individual privileges */
7638 : : privileges: privilege_list
6865 tgl@sss.pgh.pa.us 7639 : 6573 : { $$ = $1; }
7640 : : | ALL
7641 : 981 : { $$ = NIL; }
7642 : : | ALL PRIVILEGES
7643 : 60 : { $$ = NIL; }
7644 : : | ALL '(' columnList ')'
7645 : : {
5561 7646 : 9 : AccessPriv *n = makeNode(AccessPriv);
7647 : :
7648 : 9 : n->priv_name = NULL;
7649 : 9 : n->cols = $3;
7650 : 9 : $$ = list_make1(n);
7651 : : }
7652 : : | ALL PRIVILEGES '(' columnList ')'
7653 : : {
5561 tgl@sss.pgh.pa.us 7654 :UBC 0 : AccessPriv *n = makeNode(AccessPriv);
7655 : :
7656 : 0 : n->priv_name = NULL;
7657 : 0 : n->cols = $4;
7658 : 0 : $$ = list_make1(n);
7659 : : }
7660 : : ;
7661 : :
5561 tgl@sss.pgh.pa.us 7662 :CBC 7015 : privilege_list: privilege { $$ = list_make1($1); }
7663 : 219 : | privilege_list ',' privilege { $$ = lappend($1, $3); }
7664 : : ;
7665 : :
7666 : : privilege: SELECT opt_column_list
7667 : : {
7668 : 2901 : AccessPriv *n = makeNode(AccessPriv);
7669 : :
7670 : 2901 : n->priv_name = pstrdup($1);
7671 : 2901 : n->cols = $2;
7672 : 2901 : $$ = n;
7673 : : }
7674 : : | REFERENCES opt_column_list
7675 : : {
7676 : 7 : AccessPriv *n = makeNode(AccessPriv);
7677 : :
7678 : 7 : n->priv_name = pstrdup($1);
7679 : 7 : n->cols = $2;
7680 : 7 : $$ = n;
7681 : : }
7682 : : | CREATE opt_column_list
7683 : : {
7684 : 123 : AccessPriv *n = makeNode(AccessPriv);
7685 : :
7686 : 123 : n->priv_name = pstrdup($1);
7687 : 123 : n->cols = $2;
7688 : 123 : $$ = n;
7689 : : }
7690 : : | ALTER SYSTEM_P
7691 : : {
739 7692 : 12 : AccessPriv *n = makeNode(AccessPriv);
7693 : 12 : n->priv_name = pstrdup("alter system");
7694 : 12 : n->cols = NIL;
7695 : 12 : $$ = n;
7696 : : }
7697 : : | ColId opt_column_list
7698 : : {
5561 7699 : 4191 : AccessPriv *n = makeNode(AccessPriv);
7700 : :
7701 : 4191 : n->priv_name = $1;
7702 : 4191 : n->cols = $2;
7703 : 4191 : $$ = n;
7704 : : }
7705 : : ;
7706 : :
7707 : : parameter_name_list:
7708 : : parameter_name
7709 : : {
739 7710 : 38 : $$ = list_make1(makeString($1));
7711 : : }
7712 : : | parameter_name_list ',' parameter_name
7713 : : {
7714 : 25 : $$ = lappend($1, makeString($3));
7715 : : }
7716 : : ;
7717 : :
7718 : : parameter_name:
7719 : : ColId
7720 : : {
7721 : 63 : $$ = $1;
7722 : : }
7723 : : | parameter_name '.' ColId
7724 : : {
7725 : 16 : $$ = psprintf("%s.%s", $1, $3);
7726 : : }
7727 : : ;
7728 : :
7729 : :
7730 : : /* Don't bother trying to fold the first two rules into one using
7731 : : * opt_table. You're going to get conflicts.
7732 : : */
7733 : : privilege_target:
7734 : : qualified_name_list
7735 : : {
5561 7736 : 3656 : PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
7737 : :
5298 7738 : 3656 : n->targtype = ACL_TARGET_OBJECT;
2377 peter_e@gmx.net 7739 : 3656 : n->objtype = OBJECT_TABLE;
8091 7740 : 3656 : n->objs = $1;
7741 : 3656 : $$ = n;
7742 : : }
7743 : : | TABLE qualified_name_list
7744 : : {
5561 tgl@sss.pgh.pa.us 7745 : 160 : PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
7746 : :
5298 7747 : 160 : n->targtype = ACL_TARGET_OBJECT;
2377 peter_e@gmx.net 7748 : 160 : n->objtype = OBJECT_TABLE;
8091 7749 : 160 : n->objs = $2;
7750 : 160 : $$ = n;
7751 : : }
7752 : : | SEQUENCE qualified_name_list
7753 : : {
5561 tgl@sss.pgh.pa.us 7754 : 8 : PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
7755 : :
5298 7756 : 8 : n->targtype = ACL_TARGET_OBJECT;
2377 peter_e@gmx.net 7757 : 8 : n->objtype = OBJECT_SEQUENCE;
6658 bruce@momjian.us 7758 : 8 : n->objs = $2;
7759 : 8 : $$ = n;
7760 : : }
7761 : : | FOREIGN DATA_P WRAPPER name_list
7762 : : {
5561 tgl@sss.pgh.pa.us 7763 : 46 : PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
7764 : :
5298 7765 : 46 : n->targtype = ACL_TARGET_OBJECT;
2377 peter_e@gmx.net 7766 : 46 : n->objtype = OBJECT_FDW;
5595 7767 : 46 : n->objs = $4;
7768 : 46 : $$ = n;
7769 : : }
7770 : : | FOREIGN SERVER name_list
7771 : : {
5561 tgl@sss.pgh.pa.us 7772 : 39 : PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
7773 : :
5298 7774 : 39 : n->targtype = ACL_TARGET_OBJECT;
2377 peter_e@gmx.net 7775 : 39 : n->objtype = OBJECT_FOREIGN_SERVER;
5595 7776 : 39 : n->objs = $3;
7777 : 39 : $$ = n;
7778 : : }
7779 : : | FUNCTION function_with_argtypes_list
7780 : : {
5561 tgl@sss.pgh.pa.us 7781 : 3159 : PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
7782 : :
5298 7783 : 3159 : n->targtype = ACL_TARGET_OBJECT;
2377 peter_e@gmx.net 7784 : 3159 : n->objtype = OBJECT_FUNCTION;
8029 tgl@sss.pgh.pa.us 7785 : 3159 : n->objs = $2;
7786 : 3159 : $$ = n;
7787 : : }
7788 : : | PROCEDURE function_with_argtypes_list
7789 : : {
2327 peter_e@gmx.net 7790 : 21 : PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
7791 : :
7792 : 21 : n->targtype = ACL_TARGET_OBJECT;
2377 7793 : 21 : n->objtype = OBJECT_PROCEDURE;
2327 7794 : 21 : n->objs = $2;
7795 : 21 : $$ = n;
7796 : : }
7797 : : | ROUTINE function_with_argtypes_list
7798 : : {
2327 peter_e@gmx.net 7799 :UBC 0 : PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
7800 : :
7801 : 0 : n->targtype = ACL_TARGET_OBJECT;
2377 7802 : 0 : n->objtype = OBJECT_ROUTINE;
2327 7803 : 0 : n->objs = $2;
7804 : 0 : $$ = n;
7805 : : }
7806 : : | DATABASE name_list
7807 : : {
5561 tgl@sss.pgh.pa.us 7808 :CBC 131 : PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
7809 : :
5298 7810 : 131 : n->targtype = ACL_TARGET_OBJECT;
2377 peter_e@gmx.net 7811 : 131 : n->objtype = OBJECT_DATABASE;
8091 7812 : 131 : n->objs = $2;
7813 : 131 : $$ = n;
7814 : : }
7815 : : | DOMAIN_P any_name_list
7816 : : {
4499 7817 : 13 : PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
7818 : :
7819 : 13 : n->targtype = ACL_TARGET_OBJECT;
2377 7820 : 13 : n->objtype = OBJECT_DOMAIN;
4499 7821 : 13 : n->objs = $2;
7822 : 13 : $$ = n;
7823 : : }
7824 : : | LANGUAGE name_list
7825 : : {
5561 tgl@sss.pgh.pa.us 7826 : 21 : PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
7827 : :
5298 7828 : 21 : n->targtype = ACL_TARGET_OBJECT;
2377 peter_e@gmx.net 7829 : 21 : n->objtype = OBJECT_LANGUAGE;
8029 tgl@sss.pgh.pa.us 7830 : 21 : n->objs = $2;
7831 : 21 : $$ = n;
7832 : : }
7833 : : | LARGE_P OBJECT_P NumericOnly_list
7834 : : {
5238 itagaki.takahiro@gma 7835 : 40 : PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
7836 : :
7837 : 40 : n->targtype = ACL_TARGET_OBJECT;
2377 peter_e@gmx.net 7838 : 40 : n->objtype = OBJECT_LARGEOBJECT;
5238 itagaki.takahiro@gma 7839 : 40 : n->objs = $3;
7840 : 40 : $$ = n;
7841 : : }
7842 : : | PARAMETER parameter_name_list
7843 : : {
739 tgl@sss.pgh.pa.us 7844 : 38 : PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
7845 : 38 : n->targtype = ACL_TARGET_OBJECT;
7846 : 38 : n->objtype = OBJECT_PARAMETER_ACL;
7847 : 38 : n->objs = $2;
7848 : 38 : $$ = n;
7849 : : }
7850 : : | SCHEMA name_list
7851 : : {
5561 7852 : 141 : PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
7853 : :
5298 7854 : 141 : n->targtype = ACL_TARGET_OBJECT;
2377 peter_e@gmx.net 7855 : 141 : n->objtype = OBJECT_SCHEMA;
8091 7856 : 141 : n->objs = $2;
7857 : 141 : $$ = n;
7858 : : }
7859 : : | TABLESPACE name_list
7860 : : {
5561 tgl@sss.pgh.pa.us 7861 :UBC 0 : PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
7862 : :
5298 7863 : 0 : n->targtype = ACL_TARGET_OBJECT;
2377 peter_e@gmx.net 7864 : 0 : n->objtype = OBJECT_TABLESPACE;
7240 tgl@sss.pgh.pa.us 7865 : 0 : n->objs = $2;
7866 : 0 : $$ = n;
7867 : : }
7868 : : | TYPE_P any_name_list
7869 : : {
4499 peter_e@gmx.net 7870 :CBC 55 : PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
7871 : :
7872 : 55 : n->targtype = ACL_TARGET_OBJECT;
2377 7873 : 55 : n->objtype = OBJECT_TYPE;
4499 7874 : 55 : n->objs = $2;
7875 : 55 : $$ = n;
7876 : : }
7877 : : | ALL TABLES IN_P SCHEMA name_list
7878 : : {
5298 tgl@sss.pgh.pa.us 7879 : 6 : PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
7880 : :
7881 : 6 : n->targtype = ACL_TARGET_ALL_IN_SCHEMA;
2377 peter_e@gmx.net 7882 : 6 : n->objtype = OBJECT_TABLE;
5298 tgl@sss.pgh.pa.us 7883 : 6 : n->objs = $5;
7884 : 6 : $$ = n;
7885 : : }
7886 : : | ALL SEQUENCES IN_P SCHEMA name_list
7887 : : {
5298 tgl@sss.pgh.pa.us 7888 :UBC 0 : PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
7889 : :
7890 : 0 : n->targtype = ACL_TARGET_ALL_IN_SCHEMA;
2377 peter_e@gmx.net 7891 : 0 : n->objtype = OBJECT_SEQUENCE;
5298 tgl@sss.pgh.pa.us 7892 : 0 : n->objs = $5;
7893 : 0 : $$ = n;
7894 : : }
7895 : : | ALL FUNCTIONS IN_P SCHEMA name_list
7896 : : {
5298 tgl@sss.pgh.pa.us 7897 :CBC 3 : PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
7898 : :
7899 : 3 : n->targtype = ACL_TARGET_ALL_IN_SCHEMA;
2377 peter_e@gmx.net 7900 : 3 : n->objtype = OBJECT_FUNCTION;
5298 tgl@sss.pgh.pa.us 7901 : 3 : n->objs = $5;
7902 : 3 : $$ = n;
7903 : : }
7904 : : | ALL PROCEDURES IN_P SCHEMA name_list
7905 : : {
2327 peter_e@gmx.net 7906 : 3 : PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
7907 : :
7908 : 3 : n->targtype = ACL_TARGET_ALL_IN_SCHEMA;
2377 7909 : 3 : n->objtype = OBJECT_PROCEDURE;
2327 7910 : 3 : n->objs = $5;
7911 : 3 : $$ = n;
7912 : : }
7913 : : | ALL ROUTINES IN_P SCHEMA name_list
7914 : : {
7915 : 3 : PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
7916 : :
7917 : 3 : n->targtype = ACL_TARGET_ALL_IN_SCHEMA;
2377 7918 : 3 : n->objtype = OBJECT_ROUTINE;
2327 7919 : 3 : n->objs = $5;
7920 : 3 : $$ = n;
7921 : : }
7922 : : ;
7923 : :
7924 : :
7925 : : grantee_list:
7259 neilc@samurai.com 7926 : 7617 : grantee { $$ = list_make1($1); }
7972 bruce@momjian.us 7927 : 51 : | grantee_list ',' grantee { $$ = lappend($1, $3); }
7928 : : ;
7929 : :
7930 : : grantee:
3324 alvherre@alvh.no-ip. 7931 : 7656 : RoleSpec { $$ = $1; }
7932 : 12 : | GROUP_P RoleSpec { $$ = $2; }
7933 : : ;
7934 : :
7935 : :
7936 : : opt_grant_grant_option:
2433 peter_e@gmx.net 7937 : 43 : WITH GRANT OPTION { $$ = true; }
7938 : 4075 : | /*EMPTY*/ { $$ = false; }
7939 : : ;
7940 : :
7941 : : /*****************************************************************************
7942 : : *
7943 : : * GRANT and REVOKE ROLE statements
7944 : : *
7945 : : *****************************************************************************/
7946 : :
7947 : : GrantRoleStmt:
7948 : : GRANT privilege_list TO role_list opt_granted_by
7949 : : {
6865 tgl@sss.pgh.pa.us 7950 : 275 : GrantRoleStmt *n = makeNode(GrantRoleStmt);
7951 : :
7952 : 275 : n->is_grant = true;
7953 : 275 : n->granted_roles = $2;
7954 : 275 : n->grantee_roles = $4;
598 rhaas@postgresql.org 7955 : 275 : n->opt = NIL;
7956 : 275 : n->grantor = $5;
7957 : 275 : $$ = (Node *) n;
7958 : : }
7959 : : | GRANT privilege_list TO role_list WITH grant_role_opt_list opt_granted_by
7960 : : {
7961 : 89 : GrantRoleStmt *n = makeNode(GrantRoleStmt);
7962 : :
7963 : 89 : n->is_grant = true;
7964 : 89 : n->granted_roles = $2;
7965 : 89 : n->grantee_roles = $4;
7966 : 89 : n->opt = $6;
7967 : 89 : n->grantor = $7;
702 peter@eisentraut.org 7968 : 89 : $$ = (Node *) n;
7969 : : }
7970 : : ;
7971 : :
7972 : : RevokeRoleStmt:
7973 : : REVOKE privilege_list FROM role_list opt_granted_by opt_drop_behavior
7974 : : {
6865 tgl@sss.pgh.pa.us 7975 : 45 : GrantRoleStmt *n = makeNode(GrantRoleStmt);
7976 : :
7977 : 45 : n->is_grant = false;
598 rhaas@postgresql.org 7978 : 45 : n->opt = NIL;
6865 tgl@sss.pgh.pa.us 7979 : 45 : n->granted_roles = $2;
7980 : 45 : n->grantee_roles = $4;
601 rhaas@postgresql.org 7981 : 45 : n->grantor = $5;
6865 tgl@sss.pgh.pa.us 7982 : 45 : n->behavior = $6;
702 peter@eisentraut.org 7983 : 45 : $$ = (Node *) n;
7984 : : }
7985 : : | REVOKE ColId OPTION FOR privilege_list FROM role_list opt_granted_by opt_drop_behavior
7986 : : {
6865 tgl@sss.pgh.pa.us 7987 : 33 : GrantRoleStmt *n = makeNode(GrantRoleStmt);
7988 : : DefElem *opt;
7989 : :
598 rhaas@postgresql.org 7990 : 33 : opt = makeDefElem(pstrdup($2),
7991 : 33 : (Node *) makeBoolean(false), @2);
6865 tgl@sss.pgh.pa.us 7992 : 33 : n->is_grant = false;
598 rhaas@postgresql.org 7993 : 33 : n->opt = list_make1(opt);
6865 tgl@sss.pgh.pa.us 7994 : 33 : n->granted_roles = $5;
7995 : 33 : n->grantee_roles = $7;
601 rhaas@postgresql.org 7996 : 33 : n->grantor = $8;
6865 tgl@sss.pgh.pa.us 7997 : 33 : n->behavior = $9;
702 peter@eisentraut.org 7998 : 33 : $$ = (Node *) n;
7999 : : }
8000 : : ;
8001 : :
8002 : : grant_role_opt_list:
598 rhaas@postgresql.org 8003 : 60 : grant_role_opt_list ',' grant_role_opt { $$ = lappend($1, $3); }
8004 : 89 : | grant_role_opt { $$ = list_make1($1); }
8005 : : ;
8006 : :
8007 : : grant_role_opt:
8008 : : ColLabel grant_role_opt_value
8009 : : {
8010 : 149 : $$ = makeDefElem(pstrdup($1), $2, @1);
8011 : : }
8012 : : ;
8013 : :
8014 : : grant_role_opt_value:
8015 : 36 : OPTION { $$ = (Node *) makeBoolean(true); }
8016 : 56 : | TRUE_P { $$ = (Node *) makeBoolean(true); }
8017 : 57 : | FALSE_P { $$ = (Node *) makeBoolean(false); }
8018 : : ;
8019 : :
3324 alvherre@alvh.no-ip. 8020 : 69 : opt_granted_by: GRANTED BY RoleSpec { $$ = $3; }
6865 tgl@sss.pgh.pa.us 8021 : 7910 : | /*EMPTY*/ { $$ = NULL; }
8022 : : ;
8023 : :
8024 : : /*****************************************************************************
8025 : : *
8026 : : * ALTER DEFAULT PRIVILEGES statement
8027 : : *
8028 : : *****************************************************************************/
8029 : :
8030 : : AlterDefaultPrivilegesStmt:
8031 : : ALTER DEFAULT PRIVILEGES DefACLOptionList DefACLAction
8032 : : {
5305 8033 : 80 : AlterDefaultPrivilegesStmt *n = makeNode(AlterDefaultPrivilegesStmt);
8034 : :
8035 : 80 : n->options = $4;
8036 : 80 : n->action = (GrantStmt *) $5;
702 peter@eisentraut.org 8037 : 80 : $$ = (Node *) n;
8038 : : }
8039 : : ;
8040 : :
8041 : : DefACLOptionList:
5305 tgl@sss.pgh.pa.us 8042 : 61 : DefACLOptionList DefACLOption { $$ = lappend($1, $2); }
8043 : 80 : | /* EMPTY */ { $$ = NIL; }
8044 : : ;
8045 : :
8046 : : DefACLOption:
8047 : : IN_P SCHEMA name_list
8048 : : {
702 peter@eisentraut.org 8049 : 27 : $$ = makeDefElem("schemas", (Node *) $3, @1);
8050 : : }
8051 : : | FOR ROLE role_list
8052 : : {
8053 : 34 : $$ = makeDefElem("roles", (Node *) $3, @1);
8054 : : }
8055 : : | FOR USER role_list
8056 : : {
702 peter@eisentraut.org 8057 :UBC 0 : $$ = makeDefElem("roles", (Node *) $3, @1);
8058 : : }
8059 : : ;
8060 : :
8061 : : /*
8062 : : * This should match GRANT/REVOKE, except that individual target objects
8063 : : * are not mentioned and we only allow a subset of object types.
8064 : : */
8065 : : DefACLAction:
8066 : : GRANT privileges ON defacl_privilege_target TO grantee_list
8067 : : opt_grant_grant_option
8068 : : {
5305 tgl@sss.pgh.pa.us 8069 :CBC 50 : GrantStmt *n = makeNode(GrantStmt);
8070 : :
8071 : 50 : n->is_grant = true;
8072 : 50 : n->privileges = $2;
5298 8073 : 50 : n->targtype = ACL_TARGET_DEFAULTS;
5305 8074 : 50 : n->objtype = $4;
8075 : 50 : n->objects = NIL;
8076 : 50 : n->grantees = $6;
8077 : 50 : n->grant_option = $7;
702 peter@eisentraut.org 8078 : 50 : $$ = (Node *) n;
8079 : : }
8080 : : | REVOKE privileges ON defacl_privilege_target
8081 : : FROM grantee_list opt_drop_behavior
8082 : : {
5305 tgl@sss.pgh.pa.us 8083 : 30 : GrantStmt *n = makeNode(GrantStmt);
8084 : :
8085 : 30 : n->is_grant = false;
8086 : 30 : n->grant_option = false;
8087 : 30 : n->privileges = $2;
5298 8088 : 30 : n->targtype = ACL_TARGET_DEFAULTS;
5305 8089 : 30 : n->objtype = $4;
8090 : 30 : n->objects = NIL;
8091 : 30 : n->grantees = $6;
8092 : 30 : n->behavior = $7;
702 peter@eisentraut.org 8093 : 30 : $$ = (Node *) n;
8094 : : }
8095 : : | REVOKE GRANT OPTION FOR privileges ON defacl_privilege_target
8096 : : FROM grantee_list opt_drop_behavior
8097 : : {
5305 tgl@sss.pgh.pa.us 8098 :UBC 0 : GrantStmt *n = makeNode(GrantStmt);
8099 : :
8100 : 0 : n->is_grant = false;
8101 : 0 : n->grant_option = true;
8102 : 0 : n->privileges = $5;
5298 8103 : 0 : n->targtype = ACL_TARGET_DEFAULTS;
5305 8104 : 0 : n->objtype = $7;
8105 : 0 : n->objects = NIL;
8106 : 0 : n->grantees = $9;
8107 : 0 : n->behavior = $10;
702 peter@eisentraut.org 8108 : 0 : $$ = (Node *) n;
8109 : : }
8110 : : ;
8111 : :
8112 : : defacl_privilege_target:
2377 peter_e@gmx.net 8113 :CBC 39 : TABLES { $$ = OBJECT_TABLE; }
8114 : 8 : | FUNCTIONS { $$ = OBJECT_FUNCTION; }
8115 : 3 : | ROUTINES { $$ = OBJECT_FUNCTION; }
8116 : 3 : | SEQUENCES { $$ = OBJECT_SEQUENCE; }
8117 : 9 : | TYPES_P { $$ = OBJECT_TYPE; }
8118 : 18 : | SCHEMAS { $$ = OBJECT_SCHEMA; }
8119 : : ;
8120 : :
8121 : :
8122 : : /*****************************************************************************
8123 : : *
8124 : : * QUERY: CREATE INDEX
8125 : : *
8126 : : * Note: we cannot put TABLESPACE clause after WHERE clause unless we are
8127 : : * willing to make TABLESPACE a fully reserved word.
8128 : : *****************************************************************************/
8129 : :
8130 : : IndexStmt: CREATE opt_unique INDEX opt_concurrently opt_single_name
8131 : : ON relation_expr access_method_clause '(' index_params ')'
8132 : : opt_include opt_unique_null_treatment opt_reloptions OptTableSpace where_clause
8133 : : {
6442 tgl@sss.pgh.pa.us 8134 : 3180 : IndexStmt *n = makeNode(IndexStmt);
8135 : :
8136 : 3180 : n->unique = $2;
5226 8137 : 3180 : n->concurrent = $4;
6442 8138 : 3180 : n->idxname = $5;
8139 : 3180 : n->relation = $7;
8140 : 3180 : n->accessMethod = $8;
8141 : 3180 : n->indexParams = $10;
2199 teodor@sigaev.ru 8142 : 3180 : n->indexIncludingParams = $12;
801 peter@eisentraut.org 8143 : 3180 : n->nulls_not_distinct = !$13;
8144 : 3180 : n->options = $14;
8145 : 3180 : n->tableSpace = $15;
8146 : 3180 : n->whereClause = $16;
4290 tgl@sss.pgh.pa.us 8147 : 3180 : n->excludeOpNames = NIL;
8148 : 3180 : n->idxcomment = NULL;
4828 8149 : 3180 : n->indexOid = InvalidOid;
648 rhaas@postgresql.org 8150 : 3180 : n->oldNumber = InvalidRelFileNumber;
1471 noah@leadboat.com 8151 : 3180 : n->oldCreateSubid = InvalidSubTransactionId;
648 rhaas@postgresql.org 8152 : 3180 : n->oldFirstRelfilelocatorSubid = InvalidSubTransactionId;
4290 tgl@sss.pgh.pa.us 8153 : 3180 : n->primary = false;
8154 : 3180 : n->isconstraint = false;
8155 : 3180 : n->deferrable = false;
8156 : 3180 : n->initdeferred = false;
3339 8157 : 3180 : n->transformed = false;
3447 fujii@postgresql.org 8158 : 3180 : n->if_not_exists = false;
1816 alvherre@alvh.no-ip. 8159 : 3180 : n->reset_default_tblspc = false;
702 peter@eisentraut.org 8160 : 3180 : $$ = (Node *) n;
8161 : : }
8162 : : | CREATE opt_unique INDEX opt_concurrently IF_P NOT EXISTS name
8163 : : ON relation_expr access_method_clause '(' index_params ')'
8164 : : opt_include opt_unique_null_treatment opt_reloptions OptTableSpace where_clause
8165 : : {
3447 fujii@postgresql.org 8166 : 9 : IndexStmt *n = makeNode(IndexStmt);
8167 : :
8168 : 9 : n->unique = $2;
8169 : 9 : n->concurrent = $4;
8170 : 9 : n->idxname = $8;
8171 : 9 : n->relation = $10;
8172 : 9 : n->accessMethod = $11;
8173 : 9 : n->indexParams = $13;
2199 teodor@sigaev.ru 8174 : 9 : n->indexIncludingParams = $15;
801 peter@eisentraut.org 8175 : 9 : n->nulls_not_distinct = !$16;
8176 : 9 : n->options = $17;
8177 : 9 : n->tableSpace = $18;
8178 : 9 : n->whereClause = $19;
3447 fujii@postgresql.org 8179 : 9 : n->excludeOpNames = NIL;
8180 : 9 : n->idxcomment = NULL;
8181 : 9 : n->indexOid = InvalidOid;
648 rhaas@postgresql.org 8182 : 9 : n->oldNumber = InvalidRelFileNumber;
1471 noah@leadboat.com 8183 : 9 : n->oldCreateSubid = InvalidSubTransactionId;
648 rhaas@postgresql.org 8184 : 9 : n->oldFirstRelfilelocatorSubid = InvalidSubTransactionId;
3447 fujii@postgresql.org 8185 : 9 : n->primary = false;
8186 : 9 : n->isconstraint = false;
8187 : 9 : n->deferrable = false;
8188 : 9 : n->initdeferred = false;
3339 tgl@sss.pgh.pa.us 8189 : 9 : n->transformed = false;
3447 fujii@postgresql.org 8190 : 9 : n->if_not_exists = true;
1816 alvherre@alvh.no-ip. 8191 : 9 : n->reset_default_tblspc = false;
702 peter@eisentraut.org 8192 : 9 : $$ = (Node *) n;
8193 : : }
8194 : : ;
8195 : :
8196 : : opt_unique:
2433 peter_e@gmx.net 8197 : 620 : UNIQUE { $$ = true; }
8198 : 2572 : | /*EMPTY*/ { $$ = false; }
8199 : : ;
8200 : :
8201 : : access_method_clause:
1404 peter@eisentraut.org 8202 : 1478 : USING name { $$ = $2; }
7971 bruce@momjian.us 8203 : 1828 : | /*EMPTY*/ { $$ = DEFAULT_INDEX_TYPE; }
8204 : : ;
8205 : :
7259 neilc@samurai.com 8206 : 3820 : index_params: index_elem { $$ = list_make1($1); }
7627 tgl@sss.pgh.pa.us 8207 : 974 : | index_params ',' index_elem { $$ = lappend($1, $3); }
8208 : : ;
8209 : :
8210 : :
8211 : : index_elem_options:
8212 : : opt_collate opt_qualified_name opt_asc_desc opt_nulls_order
8213 : : {
1476 akorotkov@postgresql 8214 : 5084 : $$ = makeNode(IndexElem);
8215 : 5084 : $$->name = NULL;
8216 : 5084 : $$->expr = NULL;
8217 : 5084 : $$->indexcolname = NULL;
8218 : 5084 : $$->collation = $1;
8219 : 5084 : $$->opclass = $2;
8220 : 5084 : $$->opclassopts = NIL;
8221 : 5084 : $$->ordering = $3;
8222 : 5084 : $$->nulls_ordering = $4;
8223 : : }
8224 : : | opt_collate any_name reloptions opt_asc_desc opt_nulls_order
8225 : : {
8226 : 69 : $$ = makeNode(IndexElem);
8227 : 69 : $$->name = NULL;
8228 : 69 : $$->expr = NULL;
8229 : 69 : $$->indexcolname = NULL;
8230 : 69 : $$->collation = $1;
8231 : 69 : $$->opclass = $2;
8232 : 69 : $$->opclassopts = $3;
8233 : 69 : $$->ordering = $4;
8234 : 69 : $$->nulls_ordering = $5;
8235 : : }
8236 : : ;
8237 : :
8238 : : /*
8239 : : * Index attributes can be either simple column references, or arbitrary
8240 : : * expressions in parens. For backwards-compatibility reasons, we allow
8241 : : * an expression that's just a function call to be written without parens.
8242 : : */
8243 : : index_elem: ColId index_elem_options
8244 : : {
8245 : 4637 : $$ = $2;
7627 tgl@sss.pgh.pa.us 8246 : 4637 : $$->name = $1;
8247 : : }
8248 : : | func_expr_windowless index_elem_options
8249 : : {
1476 akorotkov@postgresql 8250 : 284 : $$ = $2;
7137 tgl@sss.pgh.pa.us 8251 : 284 : $$->expr = $1;
8252 : : }
8253 : : | '(' a_expr ')' index_elem_options
8254 : : {
1476 akorotkov@postgresql 8255 : 232 : $$ = $4;
7627 tgl@sss.pgh.pa.us 8256 : 232 : $$->expr = $2;
8257 : : }
8258 : : ;
8259 : :
2199 teodor@sigaev.ru 8260 : 106 : opt_include: INCLUDE '(' index_including_params ')' { $$ = $3; }
8261 : 3083 : | /* EMPTY */ { $$ = NIL; }
8262 : : ;
8263 : :
8264 : 106 : index_including_params: index_elem { $$ = list_make1($1); }
8265 : 83 : | index_including_params ',' index_elem { $$ = lappend($1, $3); }
8266 : : ;
8267 : :
4814 peter_e@gmx.net 8268 : 83 : opt_collate: COLLATE any_name { $$ = $2; }
8269 : 7742 : | /*EMPTY*/ { $$ = NIL; }
8270 : : ;
8271 : :
8272 : :
6305 tgl@sss.pgh.pa.us 8273 : 866 : opt_asc_desc: ASC { $$ = SORTBY_ASC; }
5704 8274 : 1346 : | DESC { $$ = SORTBY_DESC; }
8275 : 45979 : | /*EMPTY*/ { $$ = SORTBY_DEFAULT; }
8276 : : ;
8277 : :
3337 8278 : 145 : opt_nulls_order: NULLS_LA FIRST_P { $$ = SORTBY_NULLS_FIRST; }
8279 : 836 : | NULLS_LA LAST_P { $$ = SORTBY_NULLS_LAST; }
6305 8280 : 47320 : | /*EMPTY*/ { $$ = SORTBY_NULLS_DEFAULT; }
8281 : : ;
8282 : :
8283 : :
8284 : : /*****************************************************************************
8285 : : *
8286 : : * QUERY:
8287 : : * create [or replace] function <fname>
8288 : : * [(<type-1> { , <type-n>})]
8289 : : * returns <type-r>
8290 : : * as <filename or code in language as appropriate>
8291 : : * language <lang> [with parameters]
8292 : : *
8293 : : *****************************************************************************/
8294 : :
8295 : : CreateFunctionStmt:
8296 : : CREATE opt_or_replace FUNCTION func_name func_args_with_defaults
8297 : : RETURNS func_return opt_createfunc_opt_list opt_routine_body
8298 : : {
8003 peter_e@gmx.net 8299 : 9742 : CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
8300 : :
2270 tgl@sss.pgh.pa.us 8301 : 9742 : n->is_procedure = false;
8230 8302 : 9742 : n->replace = $2;
8041 8303 : 9742 : n->funcname = $4;
7404 8304 : 9742 : n->parameters = $5;
8052 8305 : 9742 : n->returnType = $7;
8003 peter_e@gmx.net 8306 : 9742 : n->options = $8;
1103 peter@eisentraut.org 8307 : 9742 : n->sql_body = $9;
702 8308 : 9742 : $$ = (Node *) n;
8309 : : }
8310 : : | CREATE opt_or_replace FUNCTION func_name func_args_with_defaults
8311 : : RETURNS TABLE '(' table_func_column_list ')' opt_createfunc_opt_list opt_routine_body
8312 : : {
5749 tgl@sss.pgh.pa.us 8313 : 94 : CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
8314 : :
2270 8315 : 94 : n->is_procedure = false;
5749 8316 : 94 : n->replace = $2;
8317 : 94 : n->funcname = $4;
8318 : 94 : n->parameters = mergeTableFuncParameters($5, $9);
8319 : 94 : n->returnType = TableFuncTypeName($9);
8320 : 94 : n->returnType->location = @7;
8321 : 94 : n->options = $11;
1103 peter@eisentraut.org 8322 : 94 : n->sql_body = $12;
702 8323 : 94 : $$ = (Node *) n;
8324 : : }
8325 : : | CREATE opt_or_replace FUNCTION func_name func_args_with_defaults
8326 : : opt_createfunc_opt_list opt_routine_body
8327 : : {
6954 tgl@sss.pgh.pa.us 8328 : 236 : CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
8329 : :
2270 8330 : 236 : n->is_procedure = false;
6954 8331 : 236 : n->replace = $2;
8332 : 236 : n->funcname = $4;
8333 : 236 : n->parameters = $5;
8334 : 236 : n->returnType = NULL;
8335 : 236 : n->options = $6;
1103 peter@eisentraut.org 8336 : 236 : n->sql_body = $7;
702 8337 : 236 : $$ = (Node *) n;
8338 : : }
8339 : : | CREATE opt_or_replace PROCEDURE func_name func_args_with_defaults
8340 : : opt_createfunc_opt_list opt_routine_body
8341 : : {
2327 peter_e@gmx.net 8342 : 165 : CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
8343 : :
2270 tgl@sss.pgh.pa.us 8344 : 165 : n->is_procedure = true;
2327 peter_e@gmx.net 8345 : 165 : n->replace = $2;
8346 : 165 : n->funcname = $4;
8347 : 165 : n->parameters = $5;
8348 : 165 : n->returnType = NULL;
8349 : 165 : n->options = $6;
1103 peter@eisentraut.org 8350 : 165 : n->sql_body = $7;
702 8351 : 165 : $$ = (Node *) n;
8352 : : }
8353 : : ;
8354 : :
8355 : : opt_or_replace:
2433 peter_e@gmx.net 8356 : 3889 : OR REPLACE { $$ = true; }
8357 : 8980 : | /*EMPTY*/ { $$ = false; }
8358 : : ;
8359 : :
7972 bruce@momjian.us 8360 : 4330 : func_args: '(' func_args_list ')' { $$ = $2; }
8361 : 2152 : | '(' ')' { $$ = NIL; }
8362 : : ;
8363 : :
8364 : : func_args_list:
7259 neilc@samurai.com 8365 : 4330 : func_arg { $$ = list_make1($1); }
7972 bruce@momjian.us 8366 : 3716 : | func_args_list ',' func_arg { $$ = lappend($1, $3); }
8367 : : ;
8368 : :
8369 : : function_with_argtypes_list:
2768 peter_e@gmx.net 8370 : 4948 : function_with_argtypes { $$ = list_make1($1); }
8371 : : | function_with_argtypes_list ',' function_with_argtypes
8372 : 36 : { $$ = lappend($1, $3); }
8373 : : ;
8374 : :
8375 : : function_with_argtypes:
8376 : : func_name func_args
8377 : : {
2664 8378 : 6482 : ObjectWithArgs *n = makeNode(ObjectWithArgs);
8379 : :
8380 : 6482 : n->objname = $1;
1039 tgl@sss.pgh.pa.us 8381 : 6482 : n->objargs = extractArgTypes($2);
8382 : 6482 : n->objfuncargs = $2;
2768 peter_e@gmx.net 8383 : 6482 : $$ = n;
8384 : : }
8385 : : /*
8386 : : * Because of reduce/reduce conflicts, we can't use func_name
8387 : : * below, but we can write it out the long way, which actually
8388 : : * allows more cases.
8389 : : */
8390 : : | type_func_name_keyword
8391 : : {
2593 peter_e@gmx.net 8392 :UBC 0 : ObjectWithArgs *n = makeNode(ObjectWithArgs);
8393 : :
8394 : 0 : n->objname = list_make1(makeString(pstrdup($1)));
8395 : 0 : n->args_unspecified = true;
8396 : 0 : $$ = n;
8397 : : }
8398 : : | ColId
8399 : : {
2593 peter_e@gmx.net 8400 :CBC 153 : ObjectWithArgs *n = makeNode(ObjectWithArgs);
8401 : :
8402 : 153 : n->objname = list_make1(makeString($1));
8403 : 153 : n->args_unspecified = true;
8404 : 153 : $$ = n;
8405 : : }
8406 : : | ColId indirection
8407 : : {
8408 : 14 : ObjectWithArgs *n = makeNode(ObjectWithArgs);
8409 : :
8410 : 14 : n->objname = check_func_name(lcons(makeString($1), $2),
8411 : : yyscanner);
8412 : 14 : n->args_unspecified = true;
8413 : 14 : $$ = n;
8414 : : }
8415 : : ;
8416 : :
8417 : : /*
8418 : : * func_args_with_defaults is separate because we only want to accept
8419 : : * defaults in CREATE FUNCTION, not in ALTER etc.
8420 : : */
8421 : : func_args_with_defaults:
5610 8422 : 8186 : '(' func_args_with_defaults_list ')' { $$ = $2; }
5596 tgl@sss.pgh.pa.us 8423 : 2051 : | '(' ')' { $$ = NIL; }
8424 : : ;
8425 : :
8426 : : func_args_with_defaults_list:
8427 : 8186 : func_arg_with_default { $$ = list_make1($1); }
8428 : : | func_args_with_defaults_list ',' func_arg_with_default
8429 : 13417 : { $$ = lappend($1, $3); }
8430 : : ;
8431 : :
8432 : : /*
8433 : : * The style with arg_class first is SQL99 standard, but Oracle puts
8434 : : * param_name first; accept both since it's likely people will try both
8435 : : * anyway. Don't bother trying to save productions by letting arg_class
8436 : : * have an empty alternative ... you'll get shift/reduce conflicts.
8437 : : *
8438 : : * We can catch over-specified arguments here if we want to,
8439 : : * but for now better to silently swallow typmod, etc.
8440 : : * - thomas 2000-03-22
8441 : : */
8442 : : func_arg:
8443 : : arg_class param_name func_type
8444 : : {
7404 8445 : 6159 : FunctionParameter *n = makeNode(FunctionParameter);
8446 : :
8447 : 6159 : n->name = $2;
8448 : 6159 : n->argType = $3;
6956 8449 : 6159 : n->mode = $1;
5610 peter_e@gmx.net 8450 : 6159 : n->defexpr = NULL;
7404 tgl@sss.pgh.pa.us 8451 : 6159 : $$ = n;
8452 : : }
8453 : : | param_name arg_class func_type
8454 : : {
8455 : 190 : FunctionParameter *n = makeNode(FunctionParameter);
8456 : :
6956 8457 : 190 : n->name = $1;
8458 : 190 : n->argType = $3;
8459 : 190 : n->mode = $2;
5610 peter_e@gmx.net 8460 : 190 : n->defexpr = NULL;
6956 tgl@sss.pgh.pa.us 8461 : 190 : $$ = n;
8462 : : }
8463 : : | param_name func_type
8464 : : {
8465 : 6138 : FunctionParameter *n = makeNode(FunctionParameter);
8466 : :
8467 : 6138 : n->name = $1;
7404 8468 : 6138 : n->argType = $2;
1039 8469 : 6138 : n->mode = FUNC_PARAM_DEFAULT;
5610 peter_e@gmx.net 8470 : 6138 : n->defexpr = NULL;
7404 tgl@sss.pgh.pa.us 8471 : 6138 : $$ = n;
8472 : : }
8473 : : | arg_class func_type
8474 : : {
6956 8475 : 151 : FunctionParameter *n = makeNode(FunctionParameter);
8476 : :
8477 : 151 : n->name = NULL;
8478 : 151 : n->argType = $2;
8479 : 151 : n->mode = $1;
5610 peter_e@gmx.net 8480 : 151 : n->defexpr = NULL;
6956 tgl@sss.pgh.pa.us 8481 : 151 : $$ = n;
8482 : : }
8483 : : | func_type
8484 : : {
8485 : 17460 : FunctionParameter *n = makeNode(FunctionParameter);
8486 : :
8487 : 17460 : n->name = NULL;
8488 : 17460 : n->argType = $1;
1039 8489 : 17460 : n->mode = FUNC_PARAM_DEFAULT;
5610 peter_e@gmx.net 8490 : 17460 : n->defexpr = NULL;
6956 tgl@sss.pgh.pa.us 8491 : 17460 : $$ = n;
8492 : : }
8493 : : ;
8494 : :
8495 : : /* INOUT is SQL99 standard, IN OUT is for Oracle compatibility */
5751 8496 : 1420 : arg_class: IN_P { $$ = FUNC_PARAM_IN; }
8497 : 4758 : | OUT_P { $$ = FUNC_PARAM_OUT; }
8498 : 83 : | INOUT { $$ = FUNC_PARAM_INOUT; }
5751 tgl@sss.pgh.pa.us 8499 :UBC 0 : | IN_P OUT_P { $$ = FUNC_PARAM_INOUT; }
5751 tgl@sss.pgh.pa.us 8500 :CBC 239 : | VARIADIC { $$ = FUNC_PARAM_VARIADIC; }
8501 : : ;
8502 : :
8503 : : /*
8504 : : * Ideally param_name should be ColId, but that causes too many conflicts.
8505 : : */
8506 : : param_name: type_function_name
8507 : : ;
8508 : :
8509 : : func_return:
8510 : : func_type
8511 : : {
8512 : : /* We can catch over-specified results here if we want to,
8513 : : * but for now better to silently swallow typmod, etc.
8514 : : * - thomas 2000-03-22
8515 : : */
8784 lockhart@fourpalms.o 8516 : 9742 : $$ = $1;
8517 : : }
8518 : : ;
8519 : :
8520 : : /*
8521 : : * We would like to make the %TYPE productions here be ColId attrs etc,
8522 : : * but that causes reduce/reduce conflicts. type_function_name
8523 : : * is next best choice.
8524 : : */
7972 bruce@momjian.us 8525 : 49310 : func_type: Typename { $$ = $1; }
8526 : : | type_function_name attrs '%' TYPE_P
8527 : : {
6315 tgl@sss.pgh.pa.us 8528 : 9 : $$ = makeTypeNameFromNameList(lcons(makeString($1), $2));
8052 8529 : 9 : $$->pct_type = true;
6606 8530 : 9 : $$->location = @1;
8531 : : }
8532 : : | SETOF type_function_name attrs '%' TYPE_P
8533 : : {
6315 8534 : 3 : $$ = makeTypeNameFromNameList(lcons(makeString($2), $3));
6648 8535 : 3 : $$->pct_type = true;
2433 peter_e@gmx.net 8536 : 3 : $$->setof = true;
6606 tgl@sss.pgh.pa.us 8537 : 3 : $$->location = @2;
8538 : : }
8539 : : ;
8540 : :
8541 : : func_arg_with_default:
8542 : : func_arg
8543 : : {
4548 peter_e@gmx.net 8544 : 19215 : $$ = $1;
8545 : : }
8546 : : | func_arg DEFAULT a_expr
8547 : : {
8548 : 2290 : $$ = $1;
8549 : 2290 : $$->defexpr = $3;
8550 : : }
8551 : : | func_arg '=' a_expr
8552 : : {
8553 : 98 : $$ = $1;
8554 : 98 : $$->defexpr = $3;
8555 : : }
8556 : : ;
8557 : :
8558 : : /* Aggregate args can be most things that function args can be */
8559 : : aggr_arg: func_arg
8560 : : {
1039 tgl@sss.pgh.pa.us 8561 [ + + ]: 449 : if (!($1->mode == FUNC_PARAM_DEFAULT ||
8562 [ + - ]: 30 : $1->mode == FUNC_PARAM_IN ||
3876 8563 [ - + ]: 30 : $1->mode == FUNC_PARAM_VARIADIC))
3876 tgl@sss.pgh.pa.us 8564 [ # # ]:UBC 0 : ereport(ERROR,
8565 : : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8566 : : errmsg("aggregates cannot have output arguments"),
8567 : : parser_errposition(@1)));
3876 tgl@sss.pgh.pa.us 8568 :CBC 449 : $$ = $1;
8569 : : }
8570 : : ;
8571 : :
8572 : : /*
8573 : : * The SQL standard offers no guidance on how to declare aggregate argument
8574 : : * lists, since it doesn't have CREATE AGGREGATE etc. We accept these cases:
8575 : : *
8576 : : * (*) - normal agg with no args
8577 : : * (aggr_arg,...) - normal agg with args
8578 : : * (ORDER BY aggr_arg,...) - ordered-set agg with no direct args
8579 : : * (aggr_arg,... ORDER BY aggr_arg,...) - ordered-set agg with direct args
8580 : : *
8581 : : * The zero-argument case is spelled with '*' for consistency with COUNT(*).
8582 : : *
8583 : : * An additional restriction is that if the direct-args list ends in a
8584 : : * VARIADIC item, the ordered-args list must contain exactly one item that
8585 : : * is also VARIADIC with the same type. This allows us to collapse the two
8586 : : * VARIADIC items into one, which is necessary to represent the aggregate in
8587 : : * pg_proc. We check this at the grammar stage so that we can return a list
8588 : : * in which the second VARIADIC item is already discarded, avoiding extra work
8589 : : * in cases such as DROP AGGREGATE.
8590 : : *
8591 : : * The return value of this production is a two-element list, in which the
8592 : : * first item is a sublist of FunctionParameter nodes (with any duplicate
8593 : : * VARIADIC item already dropped, as per above) and the second is an Integer
8594 : : * node, containing -1 if there was no ORDER BY and otherwise the number
8595 : : * of argument declarations before the ORDER BY. (If this number is equal
8596 : : * to the first sublist's length, then we dropped a duplicate VARIADIC item.)
8597 : : * This representation is passed as-is to CREATE AGGREGATE; for operations
8598 : : * on existing aggregates, we can just apply extractArgTypes to the first
8599 : : * sublist.
8600 : : */
8601 : : aggr_args: '(' '*' ')'
8602 : : {
3765 8603 : 68 : $$ = list_make2(NIL, makeInteger(-1));
8604 : : }
8605 : : | '(' aggr_args_list ')'
8606 : : {
8607 : 365 : $$ = list_make2($2, makeInteger(-1));
8608 : : }
8609 : : | '(' ORDER BY aggr_args_list ')'
8610 : : {
8611 : 3 : $$ = list_make2($4, makeInteger(0));
8612 : : }
8613 : : | '(' aggr_args_list ORDER BY aggr_args_list ')'
8614 : : {
8615 : : /* this is the only case requiring consistency checking */
8616 : 16 : $$ = makeOrderedSetArgs($2, $5, yyscanner);
8617 : : }
8618 : : ;
8619 : :
8620 : : aggr_args_list:
3876 8621 : 400 : aggr_arg { $$ = list_make1($1); }
8622 : 49 : | aggr_args_list ',' aggr_arg { $$ = lappend($1, $3); }
8623 : : ;
8624 : :
8625 : : aggregate_with_argtypes:
8626 : : func_name aggr_args
8627 : : {
2664 peter_e@gmx.net 8628 : 181 : ObjectWithArgs *n = makeNode(ObjectWithArgs);
8629 : :
8630 : 181 : n->objname = $1;
8631 : 181 : n->objargs = extractAggrArgTypes($2);
1039 tgl@sss.pgh.pa.us 8632 : 181 : n->objfuncargs = (List *) linitial($2);
2768 peter_e@gmx.net 8633 : 181 : $$ = n;
8634 : : }
8635 : : ;
8636 : :
8637 : : aggregate_with_argtypes_list:
2664 8638 : 52 : aggregate_with_argtypes { $$ = list_make1($1); }
8639 : : | aggregate_with_argtypes_list ',' aggregate_with_argtypes
2664 peter_e@gmx.net 8640 :UBC 0 : { $$ = lappend($1, $3); }
8641 : : ;
8642 : :
8643 : : opt_createfunc_opt_list:
8644 : : createfunc_opt_list
1103 peter@eisentraut.org 8645 :CBC 23 : | /*EMPTY*/ { $$ = NIL; }
8646 : : ;
8647 : :
8648 : : createfunc_opt_list:
8649 : : /* Must be at least one to prevent conflict */
4548 peter_e@gmx.net 8650 : 10214 : createfunc_opt_item { $$ = list_make1($1); }
7971 bruce@momjian.us 8651 : 26160 : | createfunc_opt_list createfunc_opt_item { $$ = lappend($1, $2); }
8652 : : ;
8653 : :
8654 : : /*
8655 : : * Options common to both CREATE FUNCTION and ALTER FUNCTION
8656 : : */
8657 : : common_func_opt_item:
8658 : : CALLED ON NULL_P INPUT_P
8659 : : {
702 peter@eisentraut.org 8660 : 126 : $$ = makeDefElem("strict", (Node *) makeBoolean(false), @1);
8661 : : }
8662 : : | RETURNS NULL_P ON NULL_P INPUT_P
8663 : : {
8664 : 342 : $$ = makeDefElem("strict", (Node *) makeBoolean(true), @1);
8665 : : }
8666 : : | STRICT_P
8667 : : {
8668 : 5049 : $$ = makeDefElem("strict", (Node *) makeBoolean(true), @1);
8669 : : }
8670 : : | IMMUTABLE
8671 : : {
8672 : 3922 : $$ = makeDefElem("volatility", (Node *) makeString("immutable"), @1);
8673 : : }
8674 : : | STABLE
8675 : : {
8676 : 905 : $$ = makeDefElem("volatility", (Node *) makeString("stable"), @1);
8677 : : }
8678 : : | VOLATILE
8679 : : {
8680 : 649 : $$ = makeDefElem("volatility", (Node *) makeString("volatile"), @1);
8681 : : }
8682 : : | EXTERNAL SECURITY DEFINER
8683 : : {
702 peter@eisentraut.org 8684 :UBC 0 : $$ = makeDefElem("security", (Node *) makeBoolean(true), @1);
8685 : : }
8686 : : | EXTERNAL SECURITY INVOKER
8687 : : {
8688 : 0 : $$ = makeDefElem("security", (Node *) makeBoolean(false), @1);
8689 : : }
8690 : : | SECURITY DEFINER
8691 : : {
702 peter@eisentraut.org 8692 :CBC 26 : $$ = makeDefElem("security", (Node *) makeBoolean(true), @1);
8693 : : }
8694 : : | SECURITY INVOKER
8695 : : {
8696 : 6 : $$ = makeDefElem("security", (Node *) makeBoolean(false), @1);
8697 : : }
8698 : : | LEAKPROOF
8699 : : {
8700 : 23 : $$ = makeDefElem("leakproof", (Node *) makeBoolean(true), @1);
8701 : : }
8702 : : | NOT LEAKPROOF
8703 : : {
8704 : 6 : $$ = makeDefElem("leakproof", (Node *) makeBoolean(false), @1);
8705 : : }
8706 : : | COST NumericOnly
8707 : : {
8708 : 1684 : $$ = makeDefElem("cost", (Node *) $2, @1);
8709 : : }
8710 : : | ROWS NumericOnly
8711 : : {
8712 : 226 : $$ = makeDefElem("rows", (Node *) $2, @1);
8713 : : }
8714 : : | SUPPORT any_name
8715 : : {
8716 : 46 : $$ = makeDefElem("support", (Node *) $2, @1);
8717 : : }
8718 : : | FunctionSetResetClause
8719 : : {
8720 : : /* we abuse the normal content of a DefElem here */
8721 : 56 : $$ = makeDefElem("set", (Node *) $1, @1);
8722 : : }
8723 : : | PARALLEL ColId
8724 : : {
8725 : 5269 : $$ = makeDefElem("parallel", (Node *) makeString($2), @1);
8726 : : }
8727 : : ;
8728 : :
8729 : : createfunc_opt_item:
8730 : : AS func_as
8731 : : {
8732 : 8081 : $$ = makeDefElem("as", (Node *) $2, @1);
8733 : : }
8734 : : | LANGUAGE NonReservedWord_or_Sconst
8735 : : {
8736 : 10205 : $$ = makeDefElem("language", (Node *) makeString($2), @1);
8737 : : }
8738 : : | TRANSFORM transform_type_list
8739 : : {
8740 : 59 : $$ = makeDefElem("transform", (Node *) $2, @1);
8741 : : }
8742 : : | WINDOW
8743 : : {
8744 : 10 : $$ = makeDefElem("window", (Node *) makeBoolean(true), @1);
8745 : : }
8746 : : | common_func_opt_item
8747 : : {
6971 neilc@samurai.com 8748 : 18019 : $$ = $1;
8749 : : }
8750 : : ;
8751 : :
7259 8752 : 6876 : func_as: Sconst { $$ = list_make1(makeString($1)); }
8753 : : | Sconst ',' Sconst
8754 : : {
8755 : 1205 : $$ = list_make2(makeString($1), makeString($3));
8756 : : }
8757 : : ;
8758 : :
8759 : : ReturnStmt: RETURN a_expr
8760 : : {
1103 peter@eisentraut.org 8761 : 1854 : ReturnStmt *r = makeNode(ReturnStmt);
8762 : :
8763 : 1854 : r->returnval = (Node *) $2;
8764 : 1854 : $$ = (Node *) r;
8765 : : }
8766 : : ;
8767 : :
8768 : : opt_routine_body:
8769 : : ReturnStmt
8770 : : {
8771 : 1851 : $$ = $1;
8772 : : }
8773 : : | BEGIN_P ATOMIC routine_body_stmt_list END_P
8774 : : {
8775 : : /*
8776 : : * A compound statement is stored as a single-item list
8777 : : * containing the list of statements as its member. That
8778 : : * way, the parse analysis code can tell apart an empty
8779 : : * body from no body at all.
8780 : : */
8781 : 308 : $$ = (Node *) list_make1($3);
8782 : : }
8783 : : | /*EMPTY*/
8784 : : {
8785 : 8078 : $$ = NULL;
8786 : : }
8787 : : ;
8788 : :
8789 : : routine_body_stmt_list:
8790 : : routine_body_stmt_list routine_body_stmt ';'
8791 : : {
8792 : : /* As in stmtmulti, discard empty statements */
1041 tgl@sss.pgh.pa.us 8793 [ + + ]: 316 : if ($2 != NULL)
8794 : 307 : $$ = lappend($1, $2);
8795 : : else
8796 : 9 : $$ = $1;
8797 : : }
8798 : : | /*EMPTY*/
8799 : : {
1103 peter@eisentraut.org 8800 : 308 : $$ = NIL;
8801 : : }
8802 : : ;
8803 : :
8804 : : routine_body_stmt:
8805 : : stmt
8806 : : | ReturnStmt
8807 : : ;
8808 : :
8809 : : transform_type_list:
3276 peter_e@gmx.net 8810 : 59 : FOR TYPE_P Typename { $$ = list_make1($3); }
8811 : 2 : | transform_type_list ',' FOR TYPE_P Typename { $$ = lappend($1, $5); }
8812 : : ;
8813 : :
8814 : : opt_definition:
7972 bruce@momjian.us 8815 : 266 : WITH definition { $$ = $2; }
8816 : 4608 : | /*EMPTY*/ { $$ = NIL; }
8817 : : ;
8818 : :
8819 : : table_func_column: param_name func_type
8820 : : {
5749 tgl@sss.pgh.pa.us 8821 : 203 : FunctionParameter *n = makeNode(FunctionParameter);
8822 : :
8823 : 203 : n->name = $1;
8824 : 203 : n->argType = $2;
8825 : 203 : n->mode = FUNC_PARAM_TABLE;
5596 8826 : 203 : n->defexpr = NULL;
5749 8827 : 203 : $$ = n;
8828 : : }
8829 : : ;
8830 : :
8831 : : table_func_column_list:
8832 : : table_func_column
8833 : : {
8834 : 94 : $$ = list_make1($1);
8835 : : }
8836 : : | table_func_column_list ',' table_func_column
8837 : : {
8838 : 109 : $$ = lappend($1, $3);
8839 : : }
8840 : : ;
8841 : :
8842 : : /*****************************************************************************
8843 : : * ALTER FUNCTION / ALTER PROCEDURE / ALTER ROUTINE
8844 : : *
8845 : : * RENAME and OWNER subcommands are already provided by the generic
8846 : : * ALTER infrastructure, here we just specify alterations that can
8847 : : * only be applied to functions.
8848 : : *
8849 : : *****************************************************************************/
8850 : : AlterFunctionStmt:
8851 : : ALTER FUNCTION function_with_argtypes alterfunc_opt_list opt_restrict
8852 : : {
6971 neilc@samurai.com 8853 : 307 : AlterFunctionStmt *n = makeNode(AlterFunctionStmt);
8854 : :
2327 peter_e@gmx.net 8855 : 307 : n->objtype = OBJECT_FUNCTION;
8856 : 307 : n->func = $3;
8857 : 307 : n->actions = $4;
8858 : 307 : $$ = (Node *) n;
8859 : : }
8860 : : | ALTER PROCEDURE function_with_argtypes alterfunc_opt_list opt_restrict
8861 : : {
8862 : 9 : AlterFunctionStmt *n = makeNode(AlterFunctionStmt);
8863 : :
8864 : 9 : n->objtype = OBJECT_PROCEDURE;
8865 : 9 : n->func = $3;
8866 : 9 : n->actions = $4;
8867 : 9 : $$ = (Node *) n;
8868 : : }
8869 : : | ALTER ROUTINE function_with_argtypes alterfunc_opt_list opt_restrict
8870 : : {
2327 peter_e@gmx.net 8871 :UBC 0 : AlterFunctionStmt *n = makeNode(AlterFunctionStmt);
8872 : :
8873 : 0 : n->objtype = OBJECT_ROUTINE;
6956 tgl@sss.pgh.pa.us 8874 : 0 : n->func = $3;
6971 neilc@samurai.com 8875 : 0 : n->actions = $4;
8876 : 0 : $$ = (Node *) n;
8877 : : }
8878 : : ;
8879 : :
8880 : : alterfunc_opt_list:
8881 : : /* At least one option must be specified */
6971 neilc@samurai.com 8882 :CBC 316 : common_func_opt_item { $$ = list_make1($1); }
6971 neilc@samurai.com 8883 :UBC 0 : | alterfunc_opt_list common_func_opt_item { $$ = lappend($1, $2); }
8884 : : ;
8885 : :
8886 : : /* Ignored, merely for SQL compliance */
8887 : : opt_restrict:
8888 : : RESTRICT
8889 : : | /* EMPTY */
8890 : : ;
8891 : :
8892 : :
8893 : : /*****************************************************************************
8894 : : *
8895 : : * QUERY:
8896 : : *
8897 : : * DROP FUNCTION funcname (arg1, arg2, ...) [ RESTRICT | CASCADE ]
8898 : : * DROP PROCEDURE procname (arg1, arg2, ...) [ RESTRICT | CASCADE ]
8899 : : * DROP ROUTINE routname (arg1, arg2, ...) [ RESTRICT | CASCADE ]
8900 : : * DROP AGGREGATE aggname (arg1, ...) [ RESTRICT | CASCADE ]
8901 : : * DROP OPERATOR opname (leftoperand_typ, rightoperand_typ) [ RESTRICT | CASCADE ]
8902 : : *
8903 : : *****************************************************************************/
8904 : :
8905 : : RemoveFuncStmt:
8906 : : DROP FUNCTION function_with_argtypes_list opt_drop_behavior
8907 : : {
4532 rhaas@postgresql.org 8908 :CBC 1557 : DropStmt *n = makeNode(DropStmt);
8909 : :
8910 : 1557 : n->removeType = OBJECT_FUNCTION;
2664 peter_e@gmx.net 8911 : 1557 : n->objects = $3;
2768 8912 : 1557 : n->behavior = $4;
6512 andrew@dunslane.net 8913 : 1557 : n->missing_ok = false;
4391 simon@2ndQuadrant.co 8914 : 1557 : n->concurrent = false;
702 peter@eisentraut.org 8915 : 1557 : $$ = (Node *) n;
8916 : : }
8917 : : | DROP FUNCTION IF_P EXISTS function_with_argtypes_list opt_drop_behavior
8918 : : {
4532 rhaas@postgresql.org 8919 : 130 : DropStmt *n = makeNode(DropStmt);
8920 : :
8921 : 130 : n->removeType = OBJECT_FUNCTION;
2664 peter_e@gmx.net 8922 : 130 : n->objects = $5;
2768 8923 : 130 : n->behavior = $6;
6512 andrew@dunslane.net 8924 : 130 : n->missing_ok = true;
4391 simon@2ndQuadrant.co 8925 : 130 : n->concurrent = false;
702 peter@eisentraut.org 8926 : 130 : $$ = (Node *) n;
8927 : : }
8928 : : | DROP PROCEDURE function_with_argtypes_list opt_drop_behavior
8929 : : {
2327 peter_e@gmx.net 8930 : 69 : DropStmt *n = makeNode(DropStmt);
8931 : :
8932 : 69 : n->removeType = OBJECT_PROCEDURE;
8933 : 69 : n->objects = $3;
8934 : 69 : n->behavior = $4;
8935 : 69 : n->missing_ok = false;
8936 : 69 : n->concurrent = false;
702 peter@eisentraut.org 8937 : 69 : $$ = (Node *) n;
8938 : : }
8939 : : | DROP PROCEDURE IF_P EXISTS function_with_argtypes_list opt_drop_behavior
8940 : : {
2327 peter_e@gmx.net 8941 : 3 : DropStmt *n = makeNode(DropStmt);
8942 : :
8943 : 3 : n->removeType = OBJECT_PROCEDURE;
8944 : 3 : n->objects = $5;
8945 : 3 : n->behavior = $6;
8946 : 3 : n->missing_ok = true;
8947 : 3 : n->concurrent = false;
702 peter@eisentraut.org 8948 : 3 : $$ = (Node *) n;
8949 : : }
8950 : : | DROP ROUTINE function_with_argtypes_list opt_drop_behavior
8951 : : {
2327 peter_e@gmx.net 8952 : 6 : DropStmt *n = makeNode(DropStmt);
8953 : :
8954 : 6 : n->removeType = OBJECT_ROUTINE;
8955 : 6 : n->objects = $3;
8956 : 6 : n->behavior = $4;
8957 : 6 : n->missing_ok = false;
8958 : 6 : n->concurrent = false;
702 peter@eisentraut.org 8959 : 6 : $$ = (Node *) n;
8960 : : }
8961 : : | DROP ROUTINE IF_P EXISTS function_with_argtypes_list opt_drop_behavior
8962 : : {
2327 peter_e@gmx.net 8963 : 3 : DropStmt *n = makeNode(DropStmt);
8964 : :
8965 : 3 : n->removeType = OBJECT_ROUTINE;
8966 : 3 : n->objects = $5;
8967 : 3 : n->behavior = $6;
8968 : 3 : n->missing_ok = true;
8969 : 3 : n->concurrent = false;
702 peter@eisentraut.org 8970 : 3 : $$ = (Node *) n;
8971 : : }
8972 : : ;
8973 : :
8974 : : RemoveAggrStmt:
8975 : : DROP AGGREGATE aggregate_with_argtypes_list opt_drop_behavior
8976 : : {
4532 rhaas@postgresql.org 8977 : 37 : DropStmt *n = makeNode(DropStmt);
8978 : :
8979 : 37 : n->removeType = OBJECT_AGGREGATE;
2664 peter_e@gmx.net 8980 : 37 : n->objects = $3;
2768 8981 : 37 : n->behavior = $4;
6512 andrew@dunslane.net 8982 : 37 : n->missing_ok = false;
4391 simon@2ndQuadrant.co 8983 : 37 : n->concurrent = false;
702 peter@eisentraut.org 8984 : 37 : $$ = (Node *) n;
8985 : : }
8986 : : | DROP AGGREGATE IF_P EXISTS aggregate_with_argtypes_list opt_drop_behavior
8987 : : {
4532 rhaas@postgresql.org 8988 : 15 : DropStmt *n = makeNode(DropStmt);
8989 : :
8990 : 15 : n->removeType = OBJECT_AGGREGATE;
2664 peter_e@gmx.net 8991 : 15 : n->objects = $5;
2768 8992 : 15 : n->behavior = $6;
6512 andrew@dunslane.net 8993 : 15 : n->missing_ok = true;
4391 simon@2ndQuadrant.co 8994 : 15 : n->concurrent = false;
702 peter@eisentraut.org 8995 : 15 : $$ = (Node *) n;
8996 : : }
8997 : : ;
8998 : :
8999 : : RemoveOperStmt:
9000 : : DROP OPERATOR operator_with_argtypes_list opt_drop_behavior
9001 : : {
4532 rhaas@postgresql.org 9002 : 97 : DropStmt *n = makeNode(DropStmt);
9003 : :
9004 : 97 : n->removeType = OBJECT_OPERATOR;
2664 peter_e@gmx.net 9005 : 97 : n->objects = $3;
9006 : 97 : n->behavior = $4;
6512 andrew@dunslane.net 9007 : 97 : n->missing_ok = false;
4391 simon@2ndQuadrant.co 9008 : 97 : n->concurrent = false;
702 peter@eisentraut.org 9009 : 97 : $$ = (Node *) n;
9010 : : }
9011 : : | DROP OPERATOR IF_P EXISTS operator_with_argtypes_list opt_drop_behavior
9012 : : {
4532 rhaas@postgresql.org 9013 : 15 : DropStmt *n = makeNode(DropStmt);
9014 : :
9015 : 15 : n->removeType = OBJECT_OPERATOR;
2664 peter_e@gmx.net 9016 : 15 : n->objects = $5;
9017 : 15 : n->behavior = $6;
6512 andrew@dunslane.net 9018 : 15 : n->missing_ok = true;
4391 simon@2ndQuadrant.co 9019 : 15 : n->concurrent = false;
702 peter@eisentraut.org 9020 : 15 : $$ = (Node *) n;
9021 : : }
9022 : : ;
9023 : :
9024 : : oper_argtypes:
9025 : : '(' Typename ')'
9026 : : {
7575 tgl@sss.pgh.pa.us 9027 [ + - ]: 6 : ereport(ERROR,
9028 : : (errcode(ERRCODE_SYNTAX_ERROR),
9029 : : errmsg("missing argument"),
9030 : : errhint("Use NONE to denote the missing argument of a unary operator."),
9031 : : parser_errposition(@3)));
9032 : : }
9033 : : | '(' Typename ',' Typename ')'
5704 9034 : 954 : { $$ = list_make2($2, $4); }
9035 : : | '(' NONE ',' Typename ')' /* left unary */
9036 : 16 : { $$ = list_make2(NULL, $4); }
9037 : : | '(' Typename ',' NONE ')' /* right unary */
9038 : 6 : { $$ = list_make2($2, NULL); }
9039 : : ;
9040 : :
9041 : : any_operator:
9042 : : all_Op
7259 neilc@samurai.com 9043 : 9565 : { $$ = list_make1(makeString($1)); }
9044 : : | ColId '.' any_operator
7971 bruce@momjian.us 9045 : 7133 : { $$ = lcons(makeString($1), $3); }
9046 : : ;
9047 : :
9048 : : operator_with_argtypes_list:
2664 peter_e@gmx.net 9049 : 112 : operator_with_argtypes { $$ = list_make1($1); }
9050 : : | operator_with_argtypes_list ',' operator_with_argtypes
2664 peter_e@gmx.net 9051 :UBC 0 : { $$ = lappend($1, $3); }
9052 : : ;
9053 : :
9054 : : operator_with_argtypes:
9055 : : any_operator oper_argtypes
9056 : : {
2664 peter_e@gmx.net 9057 :CBC 976 : ObjectWithArgs *n = makeNode(ObjectWithArgs);
9058 : :
9059 : 976 : n->objname = $1;
9060 : 976 : n->objargs = $2;
9061 : 976 : $$ = n;
9062 : : }
9063 : : ;
9064 : :
9065 : : /*****************************************************************************
9066 : : *
9067 : : * DO <anonymous code block> [ LANGUAGE language ]
9068 : : *
9069 : : * We use a DefElem list for future extensibility, and to allow flexibility
9070 : : * in the clause order.
9071 : : *
9072 : : *****************************************************************************/
9073 : :
9074 : : DoStmt: DO dostmt_opt_list
9075 : : {
5318 tgl@sss.pgh.pa.us 9076 : 545 : DoStmt *n = makeNode(DoStmt);
9077 : :
9078 : 545 : n->args = $2;
702 peter@eisentraut.org 9079 : 545 : $$ = (Node *) n;
9080 : : }
9081 : : ;
9082 : :
9083 : : dostmt_opt_list:
5318 tgl@sss.pgh.pa.us 9084 : 545 : dostmt_opt_item { $$ = list_make1($1); }
9085 : 98 : | dostmt_opt_list dostmt_opt_item { $$ = lappend($1, $2); }
9086 : : ;
9087 : :
9088 : : dostmt_opt_item:
9089 : : Sconst
9090 : : {
702 peter@eisentraut.org 9091 : 545 : $$ = makeDefElem("as", (Node *) makeString($1), @1);
9092 : : }
9093 : : | LANGUAGE NonReservedWord_or_Sconst
9094 : : {
9095 : 98 : $$ = makeDefElem("language", (Node *) makeString($2), @1);
9096 : : }
9097 : : ;
9098 : :
9099 : : /*****************************************************************************
9100 : : *
9101 : : * CREATE CAST / DROP CAST
9102 : : *
9103 : : *****************************************************************************/
9104 : :
9105 : : CreateCastStmt: CREATE CAST '(' Typename AS Typename ')'
9106 : : WITH FUNCTION function_with_argtypes cast_context
9107 : : {
7941 peter_e@gmx.net 9108 : 51 : CreateCastStmt *n = makeNode(CreateCastStmt);
9109 : :
9110 : 51 : n->sourcetype = $4;
9111 : 51 : n->targettype = $6;
6956 tgl@sss.pgh.pa.us 9112 : 51 : n->func = $10;
7879 9113 : 51 : n->context = (CoercionContext) $11;
5644 heikki.linnakangas@i 9114 : 51 : n->inout = false;
702 peter@eisentraut.org 9115 : 51 : $$ = (Node *) n;
9116 : : }
9117 : : | CREATE CAST '(' Typename AS Typename ')'
9118 : : WITHOUT FUNCTION cast_context
9119 : : {
7941 peter_e@gmx.net 9120 : 81 : CreateCastStmt *n = makeNode(CreateCastStmt);
9121 : :
9122 : 81 : n->sourcetype = $4;
9123 : 81 : n->targettype = $6;
9124 : 81 : n->func = NULL;
7879 tgl@sss.pgh.pa.us 9125 : 81 : n->context = (CoercionContext) $10;
5644 heikki.linnakangas@i 9126 : 81 : n->inout = false;
702 peter@eisentraut.org 9127 : 81 : $$ = (Node *) n;
9128 : : }
9129 : : | CREATE CAST '(' Typename AS Typename ')'
9130 : : WITH INOUT cast_context
9131 : : {
5644 heikki.linnakangas@i 9132 : 3 : CreateCastStmt *n = makeNode(CreateCastStmt);
9133 : :
9134 : 3 : n->sourcetype = $4;
9135 : 3 : n->targettype = $6;
9136 : 3 : n->func = NULL;
9137 : 3 : n->context = (CoercionContext) $10;
9138 : 3 : n->inout = true;
702 peter@eisentraut.org 9139 : 3 : $$ = (Node *) n;
9140 : : }
9141 : : ;
9142 : :
7879 tgl@sss.pgh.pa.us 9143 : 15 : cast_context: AS IMPLICIT_P { $$ = COERCION_IMPLICIT; }
9144 : 29 : | AS ASSIGNMENT { $$ = COERCION_ASSIGNMENT; }
9145 : 91 : | /*EMPTY*/ { $$ = COERCION_EXPLICIT; }
9146 : : ;
9147 : :
9148 : :
9149 : : DropCastStmt: DROP CAST opt_if_exists '(' Typename AS Typename ')' opt_drop_behavior
9150 : : {
4532 rhaas@postgresql.org 9151 : 27 : DropStmt *n = makeNode(DropStmt);
9152 : :
9153 : 27 : n->removeType = OBJECT_CAST;
2710 peter_e@gmx.net 9154 : 27 : n->objects = list_make1(list_make2($5, $7));
6512 andrew@dunslane.net 9155 : 27 : n->behavior = $9;
tgl@sss.pgh.pa.us 9156 : 27 : n->missing_ok = $3;
4391 simon@2ndQuadrant.co 9157 : 27 : n->concurrent = false;
702 peter@eisentraut.org 9158 : 27 : $$ = (Node *) n;
9159 : : }
9160 : : ;
9161 : :
2433 peter_e@gmx.net 9162 : 18 : opt_if_exists: IF_P EXISTS { $$ = true; }
9163 : 16 : | /*EMPTY*/ { $$ = false; }
9164 : : ;
9165 : :
9166 : :
9167 : : /*****************************************************************************
9168 : : *
9169 : : * CREATE TRANSFORM / DROP TRANSFORM
9170 : : *
9171 : : *****************************************************************************/
9172 : :
9173 : : CreateTransformStmt: CREATE opt_or_replace TRANSFORM FOR Typename LANGUAGE name '(' transform_element_list ')'
9174 : : {
3276 9175 : 25 : CreateTransformStmt *n = makeNode(CreateTransformStmt);
9176 : :
9177 : 25 : n->replace = $2;
9178 : 25 : n->type_name = $5;
9179 : 25 : n->lang = $7;
9180 : 25 : n->fromsql = linitial($9);
9181 : 25 : n->tosql = lsecond($9);
702 peter@eisentraut.org 9182 : 25 : $$ = (Node *) n;
9183 : : }
9184 : : ;
9185 : :
9186 : : transform_element_list: FROM SQL_P WITH FUNCTION function_with_argtypes ',' TO SQL_P WITH FUNCTION function_with_argtypes
9187 : : {
3276 peter_e@gmx.net 9188 : 22 : $$ = list_make2($5, $11);
9189 : : }
9190 : : | TO SQL_P WITH FUNCTION function_with_argtypes ',' FROM SQL_P WITH FUNCTION function_with_argtypes
9191 : : {
3276 peter_e@gmx.net 9192 :UBC 0 : $$ = list_make2($11, $5);
9193 : : }
9194 : : | FROM SQL_P WITH FUNCTION function_with_argtypes
9195 : : {
3276 peter_e@gmx.net 9196 :CBC 2 : $$ = list_make2($5, NULL);
9197 : : }
9198 : : | TO SQL_P WITH FUNCTION function_with_argtypes
9199 : : {
9200 : 1 : $$ = list_make2(NULL, $5);
9201 : : }
9202 : : ;
9203 : :
9204 : :
9205 : : DropTransformStmt: DROP TRANSFORM opt_if_exists FOR Typename LANGUAGE name opt_drop_behavior
9206 : : {
9207 : 7 : DropStmt *n = makeNode(DropStmt);
9208 : :
9209 : 7 : n->removeType = OBJECT_TRANSFORM;
2710 9210 : 7 : n->objects = list_make1(list_make2($5, makeString($7)));
3276 9211 : 7 : n->behavior = $8;
9212 : 7 : n->missing_ok = $3;
702 peter@eisentraut.org 9213 : 7 : $$ = (Node *) n;
9214 : : }
9215 : : ;
9216 : :
9217 : :
9218 : : /*****************************************************************************
9219 : : *
9220 : : * QUERY:
9221 : : *
9222 : : * REINDEX [ (options) ] {INDEX | TABLE | SCHEMA} [CONCURRENTLY] <name>
9223 : : * REINDEX [ (options) ] {DATABASE | SYSTEM} [CONCURRENTLY] [<name>]
9224 : : *****************************************************************************/
9225 : :
9226 : : ReindexStmt:
9227 : : REINDEX opt_reindex_option_list reindex_target_relation opt_concurrently qualified_name
9228 : : {
8822 inoue@tpf.co.jp 9229 : 432 : ReindexStmt *n = makeNode(ReindexStmt);
9230 : :
632 alvherre@alvh.no-ip. 9231 : 432 : n->kind = $3;
9232 : 432 : n->relation = $5;
8060 tgl@sss.pgh.pa.us 9233 : 432 : n->name = NULL;
632 alvherre@alvh.no-ip. 9234 : 432 : n->params = $2;
9235 [ + + ]: 432 : if ($4)
1228 michael@paquier.xyz 9236 : 242 : n->params = lappend(n->params,
632 alvherre@alvh.no-ip. 9237 : 242 : makeDefElem("concurrently", NULL, @4));
702 peter@eisentraut.org 9238 : 432 : $$ = (Node *) n;
9239 : : }
9240 : : | REINDEX opt_reindex_option_list SCHEMA opt_concurrently name
9241 : : {
3414 simon@2ndQuadrant.co 9242 : 58 : ReindexStmt *n = makeNode(ReindexStmt);
9243 : :
632 alvherre@alvh.no-ip. 9244 : 58 : n->kind = REINDEX_OBJECT_SCHEMA;
3414 simon@2ndQuadrant.co 9245 : 58 : n->relation = NULL;
628 michael@paquier.xyz 9246 : 58 : n->name = $5;
632 alvherre@alvh.no-ip. 9247 : 58 : n->params = $2;
9248 [ + + ]: 58 : if ($4)
1228 michael@paquier.xyz 9249 : 20 : n->params = lappend(n->params,
632 alvherre@alvh.no-ip. 9250 : 20 : makeDefElem("concurrently", NULL, @4));
702 peter@eisentraut.org 9251 : 58 : $$ = (Node *) n;
9252 : : }
9253 : : | REINDEX opt_reindex_option_list reindex_target_all opt_concurrently opt_single_name
9254 : : {
8060 tgl@sss.pgh.pa.us 9255 : 34 : ReindexStmt *n = makeNode(ReindexStmt);
9256 : :
628 michael@paquier.xyz 9257 : 34 : n->kind = $3;
8060 tgl@sss.pgh.pa.us 9258 : 34 : n->relation = NULL;
628 michael@paquier.xyz 9259 : 34 : n->name = $5;
632 alvherre@alvh.no-ip. 9260 : 34 : n->params = $2;
628 michael@paquier.xyz 9261 [ + + ]: 34 : if ($4)
9262 : 5 : n->params = lappend(n->params,
9263 : 5 : makeDefElem("concurrently", NULL, @4));
702 peter@eisentraut.org 9264 : 34 : $$ = (Node *) n;
9265 : : }
9266 : : ;
9267 : : reindex_target_relation:
3257 fujii@postgresql.org 9268 : 183 : INDEX { $$ = REINDEX_OBJECT_INDEX; }
9269 : 249 : | TABLE { $$ = REINDEX_OBJECT_TABLE; }
9270 : : ;
9271 : : reindex_target_all:
628 michael@paquier.xyz 9272 : 17 : SYSTEM_P { $$ = REINDEX_OBJECT_SYSTEM; }
9273 : 17 : | DATABASE { $$ = REINDEX_OBJECT_DATABASE; }
9274 : : ;
9275 : : opt_reindex_option_list:
632 alvherre@alvh.no-ip. 9276 : 78 : '(' utility_option_list ')' { $$ = $2; }
9277 : 446 : | /* EMPTY */ { $$ = NULL; }
9278 : : ;
9279 : :
9280 : : /*****************************************************************************
9281 : : *
9282 : : * ALTER TABLESPACE
9283 : : *
9284 : : *****************************************************************************/
9285 : :
9286 : : AlterTblSpcStmt:
9287 : : ALTER TABLESPACE name SET reloptions
9288 : : {
3654 sfrost@snowman.net 9289 :ECB (6) : AlterTableSpaceOptionsStmt *n =
3654 sfrost@snowman.net 9290 :CBC 6 : makeNode(AlterTableSpaceOptionsStmt);
9291 : :
9292 : 6 : n->tablespacename = $3;
9293 : 6 : n->options = $5;
2433 peter_e@gmx.net 9294 : 6 : n->isReset = false;
702 peter@eisentraut.org 9295 : 6 : $$ = (Node *) n;
9296 : : }
9297 : : | ALTER TABLESPACE name RESET reloptions
9298 : : {
3654 sfrost@snowman.net 9299 :ECB (6) : AlterTableSpaceOptionsStmt *n =
3654 sfrost@snowman.net 9300 :CBC 6 : makeNode(AlterTableSpaceOptionsStmt);
9301 : :
9302 : 6 : n->tablespacename = $3;
9303 : 6 : n->options = $5;
2433 peter_e@gmx.net 9304 : 6 : n->isReset = true;
702 peter@eisentraut.org 9305 : 6 : $$ = (Node *) n;
9306 : : }
9307 : : ;
9308 : :
9309 : : /*****************************************************************************
9310 : : *
9311 : : * ALTER THING name RENAME TO newname
9312 : : *
9313 : : *****************************************************************************/
9314 : :
9315 : : RenameStmt: ALTER AGGREGATE aggregate_with_argtypes RENAME TO name
9316 : : {
7597 peter_e@gmx.net 9317 : 21 : RenameStmt *n = makeNode(RenameStmt);
9318 : :
9319 : 21 : n->renameType = OBJECT_AGGREGATE;
2710 9320 : 21 : n->object = (Node *) $3;
2768 9321 : 21 : n->newname = $6;
4465 simon@2ndQuadrant.co 9322 : 21 : n->missing_ok = false;
702 peter@eisentraut.org 9323 : 21 : $$ = (Node *) n;
9324 : : }
9325 : : | ALTER COLLATION any_name RENAME TO name
9326 : : {
4810 peter_e@gmx.net 9327 : 9 : RenameStmt *n = makeNode(RenameStmt);
9328 : :
9329 : 9 : n->renameType = OBJECT_COLLATION;
2710 9330 : 9 : n->object = (Node *) $3;
4810 9331 : 9 : n->newname = $6;
4465 simon@2ndQuadrant.co 9332 : 9 : n->missing_ok = false;
702 peter@eisentraut.org 9333 : 9 : $$ = (Node *) n;
9334 : : }
9335 : : | ALTER CONVERSION_P any_name RENAME TO name
9336 : : {
7597 peter_e@gmx.net 9337 : 12 : RenameStmt *n = makeNode(RenameStmt);
9338 : :
9339 : 12 : n->renameType = OBJECT_CONVERSION;
2710 9340 : 12 : n->object = (Node *) $3;
7597 9341 : 12 : n->newname = $6;
4465 simon@2ndQuadrant.co 9342 : 12 : n->missing_ok = false;
702 peter@eisentraut.org 9343 : 12 : $$ = (Node *) n;
9344 : : }
9345 : : | ALTER DATABASE name RENAME TO name
9346 : : {
7597 peter_e@gmx.net 9347 :UBC 0 : RenameStmt *n = makeNode(RenameStmt);
9348 : :
9349 : 0 : n->renameType = OBJECT_DATABASE;
9350 : 0 : n->subname = $3;
9351 : 0 : n->newname = $6;
4465 simon@2ndQuadrant.co 9352 : 0 : n->missing_ok = false;
702 peter@eisentraut.org 9353 : 0 : $$ = (Node *) n;
9354 : : }
9355 : : | ALTER DOMAIN_P any_name RENAME TO name
9356 : : {
4497 peter_e@gmx.net 9357 :CBC 3 : RenameStmt *n = makeNode(RenameStmt);
9358 : :
9359 : 3 : n->renameType = OBJECT_DOMAIN;
2710 9360 : 3 : n->object = (Node *) $3;
4497 9361 : 3 : n->newname = $6;
4465 simon@2ndQuadrant.co 9362 : 3 : n->missing_ok = false;
702 peter@eisentraut.org 9363 : 3 : $$ = (Node *) n;
9364 : : }
9365 : : | ALTER DOMAIN_P any_name RENAME CONSTRAINT name TO name
9366 : : {
4394 peter_e@gmx.net 9367 : 3 : RenameStmt *n = makeNode(RenameStmt);
9368 : :
3400 alvherre@alvh.no-ip. 9369 : 3 : n->renameType = OBJECT_DOMCONSTRAINT;
2710 peter_e@gmx.net 9370 : 3 : n->object = (Node *) $3;
4394 9371 : 3 : n->subname = $6;
9372 : 3 : n->newname = $8;
702 peter@eisentraut.org 9373 : 3 : $$ = (Node *) n;
9374 : : }
9375 : : | ALTER FOREIGN DATA_P WRAPPER name RENAME TO name
9376 : : {
4510 peter_e@gmx.net 9377 : 12 : RenameStmt *n = makeNode(RenameStmt);
9378 : :
9379 : 12 : n->renameType = OBJECT_FDW;
2710 9380 : 12 : n->object = (Node *) makeString($5);
4510 9381 : 12 : n->newname = $8;
4465 simon@2ndQuadrant.co 9382 : 12 : n->missing_ok = false;
702 peter@eisentraut.org 9383 : 12 : $$ = (Node *) n;
9384 : : }
9385 : : | ALTER FUNCTION function_with_argtypes RENAME TO name
9386 : : {
7597 peter_e@gmx.net 9387 : 12 : RenameStmt *n = makeNode(RenameStmt);
9388 : :
9389 : 12 : n->renameType = OBJECT_FUNCTION;
2710 9390 : 12 : n->object = (Node *) $3;
6068 tgl@sss.pgh.pa.us 9391 : 12 : n->newname = $6;
4465 simon@2ndQuadrant.co 9392 : 12 : n->missing_ok = false;
702 peter@eisentraut.org 9393 : 12 : $$ = (Node *) n;
9394 : : }
9395 : : | ALTER GROUP_P RoleId RENAME TO RoleId
9396 : : {
7597 peter_e@gmx.net 9397 :UBC 0 : RenameStmt *n = makeNode(RenameStmt);
9398 : :
6865 tgl@sss.pgh.pa.us 9399 : 0 : n->renameType = OBJECT_ROLE;
7597 peter_e@gmx.net 9400 : 0 : n->subname = $3;
9401 : 0 : n->newname = $6;
4465 simon@2ndQuadrant.co 9402 : 0 : n->missing_ok = false;
702 peter@eisentraut.org 9403 : 0 : $$ = (Node *) n;
9404 : : }
9405 : : | ALTER opt_procedural LANGUAGE name RENAME TO name
9406 : : {
7597 peter_e@gmx.net 9407 :CBC 9 : RenameStmt *n = makeNode(RenameStmt);
9408 : :
9409 : 9 : n->renameType = OBJECT_LANGUAGE;
2710 9410 : 9 : n->object = (Node *) makeString($4);
6229 tgl@sss.pgh.pa.us 9411 : 9 : n->newname = $7;
4465 simon@2ndQuadrant.co 9412 : 9 : n->missing_ok = false;
702 peter@eisentraut.org 9413 : 9 : $$ = (Node *) n;
9414 : : }
9415 : : | ALTER OPERATOR CLASS any_name USING name RENAME TO name
9416 : : {
7597 peter_e@gmx.net 9417 : 12 : RenameStmt *n = makeNode(RenameStmt);
9418 : :
9419 : 12 : n->renameType = OBJECT_OPCLASS;
2710 9420 : 12 : n->object = (Node *) lcons(makeString($6), $4);
7597 9421 : 12 : n->newname = $9;
4465 simon@2ndQuadrant.co 9422 : 12 : n->missing_ok = false;
702 peter@eisentraut.org 9423 : 12 : $$ = (Node *) n;
9424 : : }
9425 : : | ALTER OPERATOR FAMILY any_name USING name RENAME TO name
9426 : : {
6291 tgl@sss.pgh.pa.us 9427 : 12 : RenameStmt *n = makeNode(RenameStmt);
9428 : :
9429 : 12 : n->renameType = OBJECT_OPFAMILY;
2710 peter_e@gmx.net 9430 : 12 : n->object = (Node *) lcons(makeString($6), $4);
6291 tgl@sss.pgh.pa.us 9431 : 12 : n->newname = $9;
4465 simon@2ndQuadrant.co 9432 : 12 : n->missing_ok = false;
702 peter@eisentraut.org 9433 : 12 : $$ = (Node *) n;
9434 : : }
9435 : : | ALTER POLICY name ON qualified_name RENAME TO name
9436 : : {
3495 sfrost@snowman.net 9437 : 9 : RenameStmt *n = makeNode(RenameStmt);
9438 : :
9439 : 9 : n->renameType = OBJECT_POLICY;
9440 : 9 : n->relation = $5;
9441 : 9 : n->subname = $3;
9442 : 9 : n->newname = $8;
9443 : 9 : n->missing_ok = false;
702 peter@eisentraut.org 9444 : 9 : $$ = (Node *) n;
9445 : : }
9446 : : | ALTER POLICY IF_P EXISTS name ON qualified_name RENAME TO name
9447 : : {
3495 sfrost@snowman.net 9448 :UBC 0 : RenameStmt *n = makeNode(RenameStmt);
9449 : :
9450 : 0 : n->renameType = OBJECT_POLICY;
9451 : 0 : n->relation = $7;
9452 : 0 : n->subname = $5;
9453 : 0 : n->newname = $10;
9454 : 0 : n->missing_ok = true;
702 peter@eisentraut.org 9455 : 0 : $$ = (Node *) n;
9456 : : }
9457 : : | ALTER PROCEDURE function_with_argtypes RENAME TO name
9458 : : {
2327 peter_e@gmx.net 9459 : 0 : RenameStmt *n = makeNode(RenameStmt);
9460 : :
9461 : 0 : n->renameType = OBJECT_PROCEDURE;
9462 : 0 : n->object = (Node *) $3;
9463 : 0 : n->newname = $6;
9464 : 0 : n->missing_ok = false;
702 peter@eisentraut.org 9465 : 0 : $$ = (Node *) n;
9466 : : }
9467 : : | ALTER PUBLICATION name RENAME TO name
9468 : : {
2599 peter_e@gmx.net 9469 :CBC 9 : RenameStmt *n = makeNode(RenameStmt);
9470 : :
9471 : 9 : n->renameType = OBJECT_PUBLICATION;
2710 9472 : 9 : n->object = (Node *) makeString($3);
2599 9473 : 9 : n->newname = $6;
9474 : 9 : n->missing_ok = false;
702 peter@eisentraut.org 9475 : 9 : $$ = (Node *) n;
9476 : : }
9477 : : | ALTER ROUTINE function_with_argtypes RENAME TO name
9478 : : {
2327 peter_e@gmx.net 9479 : 12 : RenameStmt *n = makeNode(RenameStmt);
9480 : :
9481 : 12 : n->renameType = OBJECT_ROUTINE;
9482 : 12 : n->object = (Node *) $3;
9483 : 12 : n->newname = $6;
9484 : 12 : n->missing_ok = false;
702 peter@eisentraut.org 9485 : 12 : $$ = (Node *) n;
9486 : : }
9487 : : | ALTER SCHEMA name RENAME TO name
9488 : : {
7597 peter_e@gmx.net 9489 : 10 : RenameStmt *n = makeNode(RenameStmt);
9490 : :
9491 : 10 : n->renameType = OBJECT_SCHEMA;
9492 : 10 : n->subname = $3;
9493 : 10 : n->newname = $6;
4465 simon@2ndQuadrant.co 9494 : 10 : n->missing_ok = false;
702 peter@eisentraut.org 9495 : 10 : $$ = (Node *) n;
9496 : : }
9497 : : | ALTER SERVER name RENAME TO name
9498 : : {
4510 peter_e@gmx.net 9499 : 12 : RenameStmt *n = makeNode(RenameStmt);
9500 : :
9501 : 12 : n->renameType = OBJECT_FOREIGN_SERVER;
2710 9502 : 12 : n->object = (Node *) makeString($3);
4510 9503 : 12 : n->newname = $6;
4465 simon@2ndQuadrant.co 9504 : 12 : n->missing_ok = false;
702 peter@eisentraut.org 9505 : 12 : $$ = (Node *) n;
9506 : : }
9507 : : | ALTER SUBSCRIPTION name RENAME TO name
9508 : : {
2599 peter_e@gmx.net 9509 : 19 : RenameStmt *n = makeNode(RenameStmt);
9510 : :
9511 : 19 : n->renameType = OBJECT_SUBSCRIPTION;
2710 9512 : 19 : n->object = (Node *) makeString($3);
2599 9513 : 19 : n->newname = $6;
9514 : 19 : n->missing_ok = false;
702 peter@eisentraut.org 9515 : 19 : $$ = (Node *) n;
9516 : : }
9517 : : | ALTER TABLE relation_expr RENAME TO name
9518 : : {
9715 bruce@momjian.us 9519 : 143 : RenameStmt *n = makeNode(RenameStmt);
9520 : :
7284 tgl@sss.pgh.pa.us 9521 : 143 : n->renameType = OBJECT_TABLE;
9522 : 143 : n->relation = $3;
9523 : 143 : n->subname = NULL;
9524 : 143 : n->newname = $6;
4465 simon@2ndQuadrant.co 9525 : 143 : n->missing_ok = false;
702 peter@eisentraut.org 9526 : 143 : $$ = (Node *) n;
9527 : : }
9528 : : | ALTER TABLE IF_P EXISTS relation_expr RENAME TO name
9529 : : {
4465 simon@2ndQuadrant.co 9530 :UBC 0 : RenameStmt *n = makeNode(RenameStmt);
9531 : :
9532 : 0 : n->renameType = OBJECT_TABLE;
9533 : 0 : n->relation = $5;
9534 : 0 : n->subname = NULL;
9535 : 0 : n->newname = $8;
9536 : 0 : n->missing_ok = true;
702 peter@eisentraut.org 9537 : 0 : $$ = (Node *) n;
9538 : : }
9539 : : | ALTER SEQUENCE qualified_name RENAME TO name
9540 : : {
6130 neilc@samurai.com 9541 :CBC 1 : RenameStmt *n = makeNode(RenameStmt);
9542 : :
9543 : 1 : n->renameType = OBJECT_SEQUENCE;
9544 : 1 : n->relation = $3;
9545 : 1 : n->subname = NULL;
9546 : 1 : n->newname = $6;
4465 simon@2ndQuadrant.co 9547 : 1 : n->missing_ok = false;
702 peter@eisentraut.org 9548 : 1 : $$ = (Node *) n;
9549 : : }
9550 : : | ALTER SEQUENCE IF_P EXISTS qualified_name RENAME TO name
9551 : : {
4465 simon@2ndQuadrant.co 9552 :UBC 0 : RenameStmt *n = makeNode(RenameStmt);
9553 : :
9554 : 0 : n->renameType = OBJECT_SEQUENCE;
9555 : 0 : n->relation = $5;
9556 : 0 : n->subname = NULL;
9557 : 0 : n->newname = $8;
9558 : 0 : n->missing_ok = true;
702 peter@eisentraut.org 9559 : 0 : $$ = (Node *) n;
9560 : : }
9561 : : | ALTER VIEW qualified_name RENAME TO name
9562 : : {
6130 neilc@samurai.com 9563 :CBC 3 : RenameStmt *n = makeNode(RenameStmt);
9564 : :
9565 : 3 : n->renameType = OBJECT_VIEW;
9566 : 3 : n->relation = $3;
9567 : 3 : n->subname = NULL;
9568 : 3 : n->newname = $6;
4465 simon@2ndQuadrant.co 9569 : 3 : n->missing_ok = false;
702 peter@eisentraut.org 9570 : 3 : $$ = (Node *) n;
9571 : : }
9572 : : | ALTER VIEW IF_P EXISTS qualified_name RENAME TO name
9573 : : {
4465 simon@2ndQuadrant.co 9574 :UBC 0 : RenameStmt *n = makeNode(RenameStmt);
9575 : :
9576 : 0 : n->renameType = OBJECT_VIEW;
9577 : 0 : n->relation = $5;
9578 : 0 : n->subname = NULL;
9579 : 0 : n->newname = $8;
9580 : 0 : n->missing_ok = true;
702 peter@eisentraut.org 9581 : 0 : $$ = (Node *) n;
9582 : : }
9583 : : | ALTER MATERIALIZED VIEW qualified_name RENAME TO name
9584 : : {
4060 kgrittn@postgresql.o 9585 : 0 : RenameStmt *n = makeNode(RenameStmt);
9586 : :
9587 : 0 : n->renameType = OBJECT_MATVIEW;
9588 : 0 : n->relation = $4;
9589 : 0 : n->subname = NULL;
9590 : 0 : n->newname = $7;
9591 : 0 : n->missing_ok = false;
702 peter@eisentraut.org 9592 : 0 : $$ = (Node *) n;
9593 : : }
9594 : : | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name RENAME TO name
9595 : : {
4060 kgrittn@postgresql.o 9596 : 0 : RenameStmt *n = makeNode(RenameStmt);
9597 : :
9598 : 0 : n->renameType = OBJECT_MATVIEW;
9599 : 0 : n->relation = $6;
9600 : 0 : n->subname = NULL;
9601 : 0 : n->newname = $9;
9602 : 0 : n->missing_ok = true;
702 peter@eisentraut.org 9603 : 0 : $$ = (Node *) n;
9604 : : }
9605 : : | ALTER INDEX qualified_name RENAME TO name
9606 : : {
7177 bruce@momjian.us 9607 :CBC 96 : RenameStmt *n = makeNode(RenameStmt);
9608 : :
9609 : 96 : n->renameType = OBJECT_INDEX;
9610 : 96 : n->relation = $3;
9611 : 96 : n->subname = NULL;
9612 : 96 : n->newname = $6;
4465 simon@2ndQuadrant.co 9613 : 96 : n->missing_ok = false;
702 peter@eisentraut.org 9614 : 96 : $$ = (Node *) n;
9615 : : }
9616 : : | ALTER INDEX IF_P EXISTS qualified_name RENAME TO name
9617 : : {
4465 simon@2ndQuadrant.co 9618 : 6 : RenameStmt *n = makeNode(RenameStmt);
9619 : :
9620 : 6 : n->renameType = OBJECT_INDEX;
9621 : 6 : n->relation = $5;
9622 : 6 : n->subname = NULL;
9623 : 6 : n->newname = $8;
9624 : 6 : n->missing_ok = true;
702 peter@eisentraut.org 9625 : 6 : $$ = (Node *) n;
9626 : : }
9627 : : | ALTER FOREIGN TABLE relation_expr RENAME TO name
9628 : : {
4852 rhaas@postgresql.org 9629 : 3 : RenameStmt *n = makeNode(RenameStmt);
9630 : :
9631 : 3 : n->renameType = OBJECT_FOREIGN_TABLE;
9632 : 3 : n->relation = $4;
9633 : 3 : n->subname = NULL;
9634 : 3 : n->newname = $7;
4465 simon@2ndQuadrant.co 9635 : 3 : n->missing_ok = false;
702 peter@eisentraut.org 9636 : 3 : $$ = (Node *) n;
9637 : : }
9638 : : | ALTER FOREIGN TABLE IF_P EXISTS relation_expr RENAME TO name
9639 : : {
4465 simon@2ndQuadrant.co 9640 : 3 : RenameStmt *n = makeNode(RenameStmt);
9641 : :
9642 : 3 : n->renameType = OBJECT_FOREIGN_TABLE;
9643 : 3 : n->relation = $6;
9644 : 3 : n->subname = NULL;
9645 : 3 : n->newname = $9;
9646 : 3 : n->missing_ok = true;
702 peter@eisentraut.org 9647 : 3 : $$ = (Node *) n;
9648 : : }
9649 : : | ALTER TABLE relation_expr RENAME opt_column name TO name
9650 : : {
7284 tgl@sss.pgh.pa.us 9651 : 119 : RenameStmt *n = makeNode(RenameStmt);
9652 : :
9653 : 119 : n->renameType = OBJECT_COLUMN;
4852 rhaas@postgresql.org 9654 : 119 : n->relationType = OBJECT_TABLE;
8060 tgl@sss.pgh.pa.us 9655 : 119 : n->relation = $3;
7597 peter_e@gmx.net 9656 : 119 : n->subname = $6;
8378 tgl@sss.pgh.pa.us 9657 : 119 : n->newname = $8;
4465 simon@2ndQuadrant.co 9658 : 119 : n->missing_ok = false;
702 peter@eisentraut.org 9659 : 119 : $$ = (Node *) n;
9660 : : }
9661 : : | ALTER TABLE IF_P EXISTS relation_expr RENAME opt_column name TO name
9662 : : {
4465 simon@2ndQuadrant.co 9663 : 12 : RenameStmt *n = makeNode(RenameStmt);
9664 : :
9665 : 12 : n->renameType = OBJECT_COLUMN;
9666 : 12 : n->relationType = OBJECT_TABLE;
9667 : 12 : n->relation = $5;
9668 : 12 : n->subname = $8;
9669 : 12 : n->newname = $10;
9670 : 12 : n->missing_ok = true;
702 peter@eisentraut.org 9671 : 12 : $$ = (Node *) n;
9672 : : }
9673 : : | ALTER VIEW qualified_name RENAME opt_column name TO name
9674 : : {
1606 fujii@postgresql.org 9675 : 3 : RenameStmt *n = makeNode(RenameStmt);
9676 : :
9677 : 3 : n->renameType = OBJECT_COLUMN;
9678 : 3 : n->relationType = OBJECT_VIEW;
9679 : 3 : n->relation = $3;
9680 : 3 : n->subname = $6;
9681 : 3 : n->newname = $8;
9682 : 3 : n->missing_ok = false;
702 peter@eisentraut.org 9683 : 3 : $$ = (Node *) n;
9684 : : }
9685 : : | ALTER VIEW IF_P EXISTS qualified_name RENAME opt_column name TO name
9686 : : {
1606 fujii@postgresql.org 9687 :UBC 0 : RenameStmt *n = makeNode(RenameStmt);
9688 : :
9689 : 0 : n->renameType = OBJECT_COLUMN;
9690 : 0 : n->relationType = OBJECT_VIEW;
9691 : 0 : n->relation = $5;
9692 : 0 : n->subname = $8;
9693 : 0 : n->newname = $10;
9694 : 0 : n->missing_ok = true;
702 peter@eisentraut.org 9695 : 0 : $$ = (Node *) n;
9696 : : }
9697 : : | ALTER MATERIALIZED VIEW qualified_name RENAME opt_column name TO name
9698 : : {
4060 kgrittn@postgresql.o 9699 : 0 : RenameStmt *n = makeNode(RenameStmt);
9700 : :
9701 : 0 : n->renameType = OBJECT_COLUMN;
9702 : 0 : n->relationType = OBJECT_MATVIEW;
9703 : 0 : n->relation = $4;
9704 : 0 : n->subname = $7;
9705 : 0 : n->newname = $9;
9706 : 0 : n->missing_ok = false;
702 peter@eisentraut.org 9707 : 0 : $$ = (Node *) n;
9708 : : }
9709 : : | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name RENAME opt_column name TO name
9710 : : {
4060 kgrittn@postgresql.o 9711 : 0 : RenameStmt *n = makeNode(RenameStmt);
9712 : :
9713 : 0 : n->renameType = OBJECT_COLUMN;
9714 : 0 : n->relationType = OBJECT_MATVIEW;
9715 : 0 : n->relation = $6;
9716 : 0 : n->subname = $9;
9717 : 0 : n->newname = $11;
9718 : 0 : n->missing_ok = true;
702 peter@eisentraut.org 9719 : 0 : $$ = (Node *) n;
9720 : : }
9721 : : | ALTER TABLE relation_expr RENAME CONSTRAINT name TO name
9722 : : {
4418 peter_e@gmx.net 9723 :CBC 33 : RenameStmt *n = makeNode(RenameStmt);
9724 : :
3400 alvherre@alvh.no-ip. 9725 : 33 : n->renameType = OBJECT_TABCONSTRAINT;
4418 peter_e@gmx.net 9726 : 33 : n->relation = $3;
9727 : 33 : n->subname = $6;
9728 : 33 : n->newname = $8;
3309 bruce@momjian.us 9729 : 33 : n->missing_ok = false;
702 peter@eisentraut.org 9730 : 33 : $$ = (Node *) n;
9731 : : }
9732 : : | ALTER TABLE IF_P EXISTS relation_expr RENAME CONSTRAINT name TO name
9733 : : {
3309 bruce@momjian.us 9734 : 3 : RenameStmt *n = makeNode(RenameStmt);
9735 : :
9736 : 3 : n->renameType = OBJECT_TABCONSTRAINT;
9737 : 3 : n->relation = $5;
9738 : 3 : n->subname = $8;
9739 : 3 : n->newname = $10;
9740 : 3 : n->missing_ok = true;
702 peter@eisentraut.org 9741 : 3 : $$ = (Node *) n;
9742 : : }
9743 : : | ALTER FOREIGN TABLE relation_expr RENAME opt_column name TO name
9744 : : {
4852 rhaas@postgresql.org 9745 : 3 : RenameStmt *n = makeNode(RenameStmt);
9746 : :
9747 : 3 : n->renameType = OBJECT_COLUMN;
9748 : 3 : n->relationType = OBJECT_FOREIGN_TABLE;
9749 : 3 : n->relation = $4;
9750 : 3 : n->subname = $7;
9751 : 3 : n->newname = $9;
4465 simon@2ndQuadrant.co 9752 : 3 : n->missing_ok = false;
702 peter@eisentraut.org 9753 : 3 : $$ = (Node *) n;
9754 : : }
9755 : : | ALTER FOREIGN TABLE IF_P EXISTS relation_expr RENAME opt_column name TO name
9756 : : {
4465 simon@2ndQuadrant.co 9757 : 3 : RenameStmt *n = makeNode(RenameStmt);
9758 : :
9759 : 3 : n->renameType = OBJECT_COLUMN;
9760 : 3 : n->relationType = OBJECT_FOREIGN_TABLE;
9761 : 3 : n->relation = $6;
9762 : 3 : n->subname = $9;
9763 : 3 : n->newname = $11;
9764 : 3 : n->missing_ok = true;
702 peter@eisentraut.org 9765 : 3 : $$ = (Node *) n;
9766 : : }
9767 : : | ALTER RULE name ON qualified_name RENAME TO name
9768 : : {
4083 tgl@sss.pgh.pa.us 9769 : 17 : RenameStmt *n = makeNode(RenameStmt);
9770 : :
9771 : 17 : n->renameType = OBJECT_RULE;
9772 : 17 : n->relation = $5;
9773 : 17 : n->subname = $3;
9774 : 17 : n->newname = $8;
9775 : 17 : n->missing_ok = false;
702 peter@eisentraut.org 9776 : 17 : $$ = (Node *) n;
9777 : : }
9778 : : | ALTER TRIGGER name ON qualified_name RENAME TO name
9779 : : {
8026 bruce@momjian.us 9780 : 20 : RenameStmt *n = makeNode(RenameStmt);
9781 : :
6831 tgl@sss.pgh.pa.us 9782 : 20 : n->renameType = OBJECT_TRIGGER;
8026 bruce@momjian.us 9783 : 20 : n->relation = $5;
7597 peter_e@gmx.net 9784 : 20 : n->subname = $3;
8026 bruce@momjian.us 9785 : 20 : n->newname = $8;
4465 simon@2ndQuadrant.co 9786 : 20 : n->missing_ok = false;
702 peter@eisentraut.org 9787 : 20 : $$ = (Node *) n;
9788 : : }
9789 : : | ALTER EVENT TRIGGER name RENAME TO name
9790 : : {
4288 rhaas@postgresql.org 9791 : 6 : RenameStmt *n = makeNode(RenameStmt);
9792 : :
9793 : 6 : n->renameType = OBJECT_EVENT_TRIGGER;
2710 peter_e@gmx.net 9794 : 6 : n->object = (Node *) makeString($4);
4288 rhaas@postgresql.org 9795 : 6 : n->newname = $7;
702 peter@eisentraut.org 9796 : 6 : $$ = (Node *) n;
9797 : : }
9798 : : | ALTER ROLE RoleId RENAME TO RoleId
9799 : : {
7597 peter_e@gmx.net 9800 : 15 : RenameStmt *n = makeNode(RenameStmt);
9801 : :
6865 tgl@sss.pgh.pa.us 9802 : 15 : n->renameType = OBJECT_ROLE;
9803 : 15 : n->subname = $3;
9804 : 15 : n->newname = $6;
4465 simon@2ndQuadrant.co 9805 : 15 : n->missing_ok = false;
702 peter@eisentraut.org 9806 : 15 : $$ = (Node *) n;
9807 : : }
9808 : : | ALTER USER RoleId RENAME TO RoleId
9809 : : {
6865 tgl@sss.pgh.pa.us 9810 :UBC 0 : RenameStmt *n = makeNode(RenameStmt);
9811 : :
9812 : 0 : n->renameType = OBJECT_ROLE;
7597 peter_e@gmx.net 9813 : 0 : n->subname = $3;
9814 : 0 : n->newname = $6;
4465 simon@2ndQuadrant.co 9815 : 0 : n->missing_ok = false;
702 peter@eisentraut.org 9816 : 0 : $$ = (Node *) n;
9817 : : }
9818 : : | ALTER TABLESPACE name RENAME TO name
9819 : : {
7233 tgl@sss.pgh.pa.us 9820 :CBC 3 : RenameStmt *n = makeNode(RenameStmt);
9821 : :
9822 : 3 : n->renameType = OBJECT_TABLESPACE;
9823 : 3 : n->subname = $3;
9824 : 3 : n->newname = $6;
4465 simon@2ndQuadrant.co 9825 : 3 : n->missing_ok = false;
702 peter@eisentraut.org 9826 : 3 : $$ = (Node *) n;
9827 : : }
9828 : : | ALTER STATISTICS any_name RENAME TO name
9829 : : {
2578 alvherre@alvh.no-ip. 9830 : 15 : RenameStmt *n = makeNode(RenameStmt);
9831 : :
9832 : 15 : n->renameType = OBJECT_STATISTIC_EXT;
9833 : 15 : n->object = (Node *) $3;
9834 : 15 : n->newname = $6;
9835 : 15 : n->missing_ok = false;
702 peter@eisentraut.org 9836 : 15 : $$ = (Node *) n;
9837 : : }
9838 : : | ALTER TEXT_P SEARCH PARSER any_name RENAME TO name
9839 : : {
6081 tgl@sss.pgh.pa.us 9840 : 6 : RenameStmt *n = makeNode(RenameStmt);
9841 : :
9842 : 6 : n->renameType = OBJECT_TSPARSER;
2710 peter_e@gmx.net 9843 : 6 : n->object = (Node *) $5;
6081 tgl@sss.pgh.pa.us 9844 : 6 : n->newname = $8;
4465 simon@2ndQuadrant.co 9845 : 6 : n->missing_ok = false;
702 peter@eisentraut.org 9846 : 6 : $$ = (Node *) n;
9847 : : }
9848 : : | ALTER TEXT_P SEARCH DICTIONARY any_name RENAME TO name
9849 : : {
6081 tgl@sss.pgh.pa.us 9850 : 12 : RenameStmt *n = makeNode(RenameStmt);
9851 : :
9852 : 12 : n->renameType = OBJECT_TSDICTIONARY;
2710 peter_e@gmx.net 9853 : 12 : n->object = (Node *) $5;
6081 tgl@sss.pgh.pa.us 9854 : 12 : n->newname = $8;
4465 simon@2ndQuadrant.co 9855 : 12 : n->missing_ok = false;
702 peter@eisentraut.org 9856 : 12 : $$ = (Node *) n;
9857 : : }
9858 : : | ALTER TEXT_P SEARCH TEMPLATE any_name RENAME TO name
9859 : : {
6081 tgl@sss.pgh.pa.us 9860 : 6 : RenameStmt *n = makeNode(RenameStmt);
9861 : :
9862 : 6 : n->renameType = OBJECT_TSTEMPLATE;
2710 peter_e@gmx.net 9863 : 6 : n->object = (Node *) $5;
6081 tgl@sss.pgh.pa.us 9864 : 6 : n->newname = $8;
4465 simon@2ndQuadrant.co 9865 : 6 : n->missing_ok = false;
702 peter@eisentraut.org 9866 : 6 : $$ = (Node *) n;
9867 : : }
9868 : : | ALTER TEXT_P SEARCH CONFIGURATION any_name RENAME TO name
9869 : : {
6081 tgl@sss.pgh.pa.us 9870 : 12 : RenameStmt *n = makeNode(RenameStmt);
9871 : :
9872 : 12 : n->renameType = OBJECT_TSCONFIGURATION;
2710 peter_e@gmx.net 9873 : 12 : n->object = (Node *) $5;
6081 tgl@sss.pgh.pa.us 9874 : 12 : n->newname = $8;
4465 simon@2ndQuadrant.co 9875 : 12 : n->missing_ok = false;
702 peter@eisentraut.org 9876 : 12 : $$ = (Node *) n;
9877 : : }
9878 : : | ALTER TYPE_P any_name RENAME TO name
9879 : : {
5870 tgl@sss.pgh.pa.us 9880 : 13 : RenameStmt *n = makeNode(RenameStmt);
9881 : :
9882 : 13 : n->renameType = OBJECT_TYPE;
2710 peter_e@gmx.net 9883 : 13 : n->object = (Node *) $3;
5870 tgl@sss.pgh.pa.us 9884 : 13 : n->newname = $6;
4465 simon@2ndQuadrant.co 9885 : 13 : n->missing_ok = false;
702 peter@eisentraut.org 9886 : 13 : $$ = (Node *) n;
9887 : : }
9888 : : | ALTER TYPE_P any_name RENAME ATTRIBUTE name TO name opt_drop_behavior
9889 : : {
4949 peter_e@gmx.net 9890 : 12 : RenameStmt *n = makeNode(RenameStmt);
9891 : :
9892 : 12 : n->renameType = OBJECT_ATTRIBUTE;
4852 rhaas@postgresql.org 9893 : 12 : n->relationType = OBJECT_TYPE;
4949 peter_e@gmx.net 9894 : 12 : n->relation = makeRangeVarFromAnyName($3, @3, yyscanner);
9895 : 12 : n->subname = $6;
9896 : 12 : n->newname = $8;
4891 9897 : 12 : n->behavior = $9;
4465 simon@2ndQuadrant.co 9898 : 12 : n->missing_ok = false;
702 peter@eisentraut.org 9899 : 12 : $$ = (Node *) n;
9900 : : }
9901 : : ;
9902 : :
9903 : : opt_column: COLUMN
9904 : : | /*EMPTY*/
9905 : : ;
9906 : :
4785 tgl@sss.pgh.pa.us 9907 : 73 : opt_set_data: SET DATA_P { $$ = 1; }
5654 peter_e@gmx.net 9908 : 385 : | /*EMPTY*/ { $$ = 0; }
9909 : : ;
9910 : :
9911 : : /*****************************************************************************
9912 : : *
9913 : : * ALTER THING name DEPENDS ON EXTENSION name
9914 : : *
9915 : : *****************************************************************************/
9916 : :
9917 : : AlterObjectDependsStmt:
9918 : : ALTER FUNCTION function_with_argtypes opt_no DEPENDS ON EXTENSION name
9919 : : {
2931 alvherre@alvh.no-ip. 9920 : 6 : AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt);
9921 : :
9922 : 6 : n->objectType = OBJECT_FUNCTION;
2710 peter_e@gmx.net 9923 : 6 : n->object = (Node *) $3;
1455 alvherre@alvh.no-ip. 9924 : 6 : n->extname = makeString($8);
9925 : 6 : n->remove = $4;
702 peter@eisentraut.org 9926 : 6 : $$ = (Node *) n;
9927 : : }
9928 : : | ALTER PROCEDURE function_with_argtypes opt_no DEPENDS ON EXTENSION name
9929 : : {
2327 peter_e@gmx.net 9930 :UBC 0 : AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt);
9931 : :
9932 : 0 : n->objectType = OBJECT_PROCEDURE;
9933 : 0 : n->object = (Node *) $3;
1455 alvherre@alvh.no-ip. 9934 : 0 : n->extname = makeString($8);
9935 : 0 : n->remove = $4;
702 peter@eisentraut.org 9936 : 0 : $$ = (Node *) n;
9937 : : }
9938 : : | ALTER ROUTINE function_with_argtypes opt_no DEPENDS ON EXTENSION name
9939 : : {
2327 peter_e@gmx.net 9940 : 0 : AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt);
9941 : :
9942 : 0 : n->objectType = OBJECT_ROUTINE;
9943 : 0 : n->object = (Node *) $3;
1455 alvherre@alvh.no-ip. 9944 : 0 : n->extname = makeString($8);
9945 : 0 : n->remove = $4;
702 peter@eisentraut.org 9946 : 0 : $$ = (Node *) n;
9947 : : }
9948 : : | ALTER TRIGGER name ON qualified_name opt_no DEPENDS ON EXTENSION name
9949 : : {
2931 alvherre@alvh.no-ip. 9950 :CBC 5 : AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt);
9951 : :
9952 : 5 : n->objectType = OBJECT_TRIGGER;
9953 : 5 : n->relation = $5;
2710 peter_e@gmx.net 9954 : 5 : n->object = (Node *) list_make1(makeString($3));
1455 alvherre@alvh.no-ip. 9955 : 5 : n->extname = makeString($10);
9956 : 5 : n->remove = $6;
702 peter@eisentraut.org 9957 : 5 : $$ = (Node *) n;
9958 : : }
9959 : : | ALTER MATERIALIZED VIEW qualified_name opt_no DEPENDS ON EXTENSION name
9960 : : {
2931 alvherre@alvh.no-ip. 9961 : 5 : AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt);
9962 : :
9963 : 5 : n->objectType = OBJECT_MATVIEW;
9964 : 5 : n->relation = $4;
1455 9965 : 5 : n->extname = makeString($9);
9966 : 5 : n->remove = $5;
702 peter@eisentraut.org 9967 : 5 : $$ = (Node *) n;
9968 : : }
9969 : : | ALTER INDEX qualified_name opt_no DEPENDS ON EXTENSION name
9970 : : {
2931 alvherre@alvh.no-ip. 9971 : 7 : AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt);
9972 : :
9973 : 7 : n->objectType = OBJECT_INDEX;
9974 : 7 : n->relation = $3;
1455 9975 : 7 : n->extname = makeString($8);
9976 : 7 : n->remove = $4;
702 peter@eisentraut.org 9977 : 7 : $$ = (Node *) n;
9978 : : }
9979 : : ;
9980 : :
1455 alvherre@alvh.no-ip. 9981 : 4 : opt_no: NO { $$ = true; }
9982 : 19 : | /* EMPTY */ { $$ = false; }
9983 : : ;
9984 : :
9985 : : /*****************************************************************************
9986 : : *
9987 : : * ALTER THING name SET SCHEMA name
9988 : : *
9989 : : *****************************************************************************/
9990 : :
9991 : : AlterObjectSchemaStmt:
9992 : : ALTER AGGREGATE aggregate_with_argtypes SET SCHEMA name
9993 : : {
6831 tgl@sss.pgh.pa.us 9994 : 12 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
9995 : :
9996 : 12 : n->objectType = OBJECT_AGGREGATE;
2710 peter_e@gmx.net 9997 : 12 : n->object = (Node *) $3;
2768 9998 : 12 : n->newschema = $6;
4465 simon@2ndQuadrant.co 9999 : 12 : n->missing_ok = false;
702 peter@eisentraut.org 10000 : 12 : $$ = (Node *) n;
10001 : : }
10002 : : | ALTER COLLATION any_name SET SCHEMA name
10003 : : {
4810 peter_e@gmx.net 10004 : 3 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10005 : :
10006 : 3 : n->objectType = OBJECT_COLLATION;
2710 10007 : 3 : n->object = (Node *) $3;
4810 10008 : 3 : n->newschema = $6;
4465 simon@2ndQuadrant.co 10009 : 3 : n->missing_ok = false;
702 peter@eisentraut.org 10010 : 3 : $$ = (Node *) n;
10011 : : }
10012 : : | ALTER CONVERSION_P any_name SET SCHEMA name
10013 : : {
4888 rhaas@postgresql.org 10014 : 12 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10015 : :
10016 : 12 : n->objectType = OBJECT_CONVERSION;
2710 peter_e@gmx.net 10017 : 12 : n->object = (Node *) $3;
4888 rhaas@postgresql.org 10018 : 12 : n->newschema = $6;
4465 simon@2ndQuadrant.co 10019 : 12 : n->missing_ok = false;
702 peter@eisentraut.org 10020 : 12 : $$ = (Node *) n;
10021 : : }
10022 : : | ALTER DOMAIN_P any_name SET SCHEMA name
10023 : : {
6831 tgl@sss.pgh.pa.us 10024 : 3 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10025 : :
10026 : 3 : n->objectType = OBJECT_DOMAIN;
2710 peter_e@gmx.net 10027 : 3 : n->object = (Node *) $3;
6831 tgl@sss.pgh.pa.us 10028 : 3 : n->newschema = $6;
4465 simon@2ndQuadrant.co 10029 : 3 : n->missing_ok = false;
702 peter@eisentraut.org 10030 : 3 : $$ = (Node *) n;
10031 : : }
10032 : : | ALTER EXTENSION name SET SCHEMA name
10033 : : {
4814 tgl@sss.pgh.pa.us 10034 : 5 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10035 : :
10036 : 5 : n->objectType = OBJECT_EXTENSION;
2710 peter_e@gmx.net 10037 : 5 : n->object = (Node *) makeString($3);
4814 tgl@sss.pgh.pa.us 10038 : 5 : n->newschema = $6;
4465 simon@2ndQuadrant.co 10039 : 5 : n->missing_ok = false;
702 peter@eisentraut.org 10040 : 5 : $$ = (Node *) n;
10041 : : }
10042 : : | ALTER FUNCTION function_with_argtypes SET SCHEMA name
10043 : : {
6831 tgl@sss.pgh.pa.us 10044 : 21 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10045 : :
10046 : 21 : n->objectType = OBJECT_FUNCTION;
2710 peter_e@gmx.net 10047 : 21 : n->object = (Node *) $3;
6068 tgl@sss.pgh.pa.us 10048 : 21 : n->newschema = $6;
4465 simon@2ndQuadrant.co 10049 : 21 : n->missing_ok = false;
702 peter@eisentraut.org 10050 : 21 : $$ = (Node *) n;
10051 : : }
10052 : : | ALTER OPERATOR operator_with_argtypes SET SCHEMA name
10053 : : {
4888 rhaas@postgresql.org 10054 : 9 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10055 : :
10056 : 9 : n->objectType = OBJECT_OPERATOR;
2710 peter_e@gmx.net 10057 : 9 : n->object = (Node *) $3;
2664 10058 : 9 : n->newschema = $6;
4465 simon@2ndQuadrant.co 10059 : 9 : n->missing_ok = false;
702 peter@eisentraut.org 10060 : 9 : $$ = (Node *) n;
10061 : : }
10062 : : | ALTER OPERATOR CLASS any_name USING name SET SCHEMA name
10063 : : {
4888 rhaas@postgresql.org 10064 : 12 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10065 : :
10066 : 12 : n->objectType = OBJECT_OPCLASS;
2710 peter_e@gmx.net 10067 : 12 : n->object = (Node *) lcons(makeString($6), $4);
4888 rhaas@postgresql.org 10068 : 12 : n->newschema = $9;
4465 simon@2ndQuadrant.co 10069 : 12 : n->missing_ok = false;
702 peter@eisentraut.org 10070 : 12 : $$ = (Node *) n;
10071 : : }
10072 : : | ALTER OPERATOR FAMILY any_name USING name SET SCHEMA name
10073 : : {
4888 rhaas@postgresql.org 10074 : 12 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10075 : :
10076 : 12 : n->objectType = OBJECT_OPFAMILY;
2710 peter_e@gmx.net 10077 : 12 : n->object = (Node *) lcons(makeString($6), $4);
4888 rhaas@postgresql.org 10078 : 12 : n->newschema = $9;
4465 simon@2ndQuadrant.co 10079 : 12 : n->missing_ok = false;
702 peter@eisentraut.org 10080 : 12 : $$ = (Node *) n;
10081 : : }
10082 : : | ALTER PROCEDURE function_with_argtypes SET SCHEMA name
10083 : : {
2327 peter_e@gmx.net 10084 :UBC 0 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10085 : :
10086 : 0 : n->objectType = OBJECT_PROCEDURE;
10087 : 0 : n->object = (Node *) $3;
10088 : 0 : n->newschema = $6;
10089 : 0 : n->missing_ok = false;
702 peter@eisentraut.org 10090 : 0 : $$ = (Node *) n;
10091 : : }
10092 : : | ALTER ROUTINE function_with_argtypes SET SCHEMA name
10093 : : {
2327 peter_e@gmx.net 10094 : 0 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10095 : :
10096 : 0 : n->objectType = OBJECT_ROUTINE;
10097 : 0 : n->object = (Node *) $3;
10098 : 0 : n->newschema = $6;
10099 : 0 : n->missing_ok = false;
702 peter@eisentraut.org 10100 : 0 : $$ = (Node *) n;
10101 : : }
10102 : : | ALTER TABLE relation_expr SET SCHEMA name
10103 : : {
5782 tgl@sss.pgh.pa.us 10104 :CBC 33 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10105 : :
10106 : 33 : n->objectType = OBJECT_TABLE;
10107 : 33 : n->relation = $3;
10108 : 33 : n->newschema = $6;
4465 simon@2ndQuadrant.co 10109 : 33 : n->missing_ok = false;
702 peter@eisentraut.org 10110 : 33 : $$ = (Node *) n;
10111 : : }
10112 : : | ALTER TABLE IF_P EXISTS relation_expr SET SCHEMA name
10113 : : {
4465 simon@2ndQuadrant.co 10114 : 6 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10115 : :
10116 : 6 : n->objectType = OBJECT_TABLE;
10117 : 6 : n->relation = $5;
10118 : 6 : n->newschema = $8;
10119 : 6 : n->missing_ok = true;
702 peter@eisentraut.org 10120 : 6 : $$ = (Node *) n;
10121 : : }
10122 : : | ALTER STATISTICS any_name SET SCHEMA name
10123 : : {
2578 alvherre@alvh.no-ip. 10124 : 9 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10125 : :
10126 : 9 : n->objectType = OBJECT_STATISTIC_EXT;
10127 : 9 : n->object = (Node *) $3;
10128 : 9 : n->newschema = $6;
10129 : 9 : n->missing_ok = false;
702 peter@eisentraut.org 10130 : 9 : $$ = (Node *) n;
10131 : : }
10132 : : | ALTER TEXT_P SEARCH PARSER any_name SET SCHEMA name
10133 : : {
4888 rhaas@postgresql.org 10134 : 9 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10135 : :
10136 : 9 : n->objectType = OBJECT_TSPARSER;
2710 peter_e@gmx.net 10137 : 9 : n->object = (Node *) $5;
4888 rhaas@postgresql.org 10138 : 9 : n->newschema = $8;
4465 simon@2ndQuadrant.co 10139 : 9 : n->missing_ok = false;
702 peter@eisentraut.org 10140 : 9 : $$ = (Node *) n;
10141 : : }
10142 : : | ALTER TEXT_P SEARCH DICTIONARY any_name SET SCHEMA name
10143 : : {
4888 rhaas@postgresql.org 10144 : 12 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10145 : :
10146 : 12 : n->objectType = OBJECT_TSDICTIONARY;
2710 peter_e@gmx.net 10147 : 12 : n->object = (Node *) $5;
4888 rhaas@postgresql.org 10148 : 12 : n->newschema = $8;
4465 simon@2ndQuadrant.co 10149 : 12 : n->missing_ok = false;
702 peter@eisentraut.org 10150 : 12 : $$ = (Node *) n;
10151 : : }
10152 : : | ALTER TEXT_P SEARCH TEMPLATE any_name SET SCHEMA name
10153 : : {
4888 rhaas@postgresql.org 10154 : 9 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10155 : :
10156 : 9 : n->objectType = OBJECT_TSTEMPLATE;
2710 peter_e@gmx.net 10157 : 9 : n->object = (Node *) $5;
4888 rhaas@postgresql.org 10158 : 9 : n->newschema = $8;
4465 simon@2ndQuadrant.co 10159 : 9 : n->missing_ok = false;
702 peter@eisentraut.org 10160 : 9 : $$ = (Node *) n;
10161 : : }
10162 : : | ALTER TEXT_P SEARCH CONFIGURATION any_name SET SCHEMA name
10163 : : {
4888 rhaas@postgresql.org 10164 : 12 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10165 : :
10166 : 12 : n->objectType = OBJECT_TSCONFIGURATION;
2710 peter_e@gmx.net 10167 : 12 : n->object = (Node *) $5;
4888 rhaas@postgresql.org 10168 : 12 : n->newschema = $8;
4465 simon@2ndQuadrant.co 10169 : 12 : n->missing_ok = false;
702 peter@eisentraut.org 10170 : 12 : $$ = (Node *) n;
10171 : : }
10172 : : | ALTER SEQUENCE qualified_name SET SCHEMA name
10173 : : {
6831 tgl@sss.pgh.pa.us 10174 : 4 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10175 : :
10176 : 4 : n->objectType = OBJECT_SEQUENCE;
10177 : 4 : n->relation = $3;
10178 : 4 : n->newschema = $6;
4465 simon@2ndQuadrant.co 10179 : 4 : n->missing_ok = false;
702 peter@eisentraut.org 10180 : 4 : $$ = (Node *) n;
10181 : : }
10182 : : | ALTER SEQUENCE IF_P EXISTS qualified_name SET SCHEMA name
10183 : : {
4465 simon@2ndQuadrant.co 10184 :UBC 0 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10185 : :
10186 : 0 : n->objectType = OBJECT_SEQUENCE;
10187 : 0 : n->relation = $5;
10188 : 0 : n->newschema = $8;
10189 : 0 : n->missing_ok = true;
702 peter@eisentraut.org 10190 : 0 : $$ = (Node *) n;
10191 : : }
10192 : : | ALTER VIEW qualified_name SET SCHEMA name
10193 : : {
6831 tgl@sss.pgh.pa.us 10194 : 0 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10195 : :
5782 10196 : 0 : n->objectType = OBJECT_VIEW;
6831 10197 : 0 : n->relation = $3;
10198 : 0 : n->newschema = $6;
4465 simon@2ndQuadrant.co 10199 : 0 : n->missing_ok = false;
702 peter@eisentraut.org 10200 : 0 : $$ = (Node *) n;
10201 : : }
10202 : : | ALTER VIEW IF_P EXISTS qualified_name SET SCHEMA name
10203 : : {
4465 simon@2ndQuadrant.co 10204 : 0 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10205 : :
10206 : 0 : n->objectType = OBJECT_VIEW;
10207 : 0 : n->relation = $5;
10208 : 0 : n->newschema = $8;
10209 : 0 : n->missing_ok = true;
702 peter@eisentraut.org 10210 : 0 : $$ = (Node *) n;
10211 : : }
10212 : : | ALTER MATERIALIZED VIEW qualified_name SET SCHEMA name
10213 : : {
4060 kgrittn@postgresql.o 10214 :CBC 3 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10215 : :
10216 : 3 : n->objectType = OBJECT_MATVIEW;
10217 : 3 : n->relation = $4;
10218 : 3 : n->newschema = $7;
10219 : 3 : n->missing_ok = false;
702 peter@eisentraut.org 10220 : 3 : $$ = (Node *) n;
10221 : : }
10222 : : | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name SET SCHEMA name
10223 : : {
4060 kgrittn@postgresql.o 10224 :UBC 0 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10225 : :
10226 : 0 : n->objectType = OBJECT_MATVIEW;
10227 : 0 : n->relation = $6;
10228 : 0 : n->newschema = $9;
10229 : 0 : n->missing_ok = true;
702 peter@eisentraut.org 10230 : 0 : $$ = (Node *) n;
10231 : : }
10232 : : | ALTER FOREIGN TABLE relation_expr SET SCHEMA name
10233 : : {
4852 rhaas@postgresql.org 10234 :CBC 3 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10235 : :
10236 : 3 : n->objectType = OBJECT_FOREIGN_TABLE;
10237 : 3 : n->relation = $4;
10238 : 3 : n->newschema = $7;
4465 simon@2ndQuadrant.co 10239 : 3 : n->missing_ok = false;
702 peter@eisentraut.org 10240 : 3 : $$ = (Node *) n;
10241 : : }
10242 : : | ALTER FOREIGN TABLE IF_P EXISTS relation_expr SET SCHEMA name
10243 : : {
4465 simon@2ndQuadrant.co 10244 : 3 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10245 : :
10246 : 3 : n->objectType = OBJECT_FOREIGN_TABLE;
10247 : 3 : n->relation = $6;
10248 : 3 : n->newschema = $9;
10249 : 3 : n->missing_ok = true;
702 peter@eisentraut.org 10250 : 3 : $$ = (Node *) n;
10251 : : }
10252 : : | ALTER TYPE_P any_name SET SCHEMA name
10253 : : {
6831 tgl@sss.pgh.pa.us 10254 : 6 : AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
10255 : :
10256 : 6 : n->objectType = OBJECT_TYPE;
2710 peter_e@gmx.net 10257 : 6 : n->object = (Node *) $3;
6831 tgl@sss.pgh.pa.us 10258 : 6 : n->newschema = $6;
4465 simon@2ndQuadrant.co 10259 : 6 : n->missing_ok = false;
702 peter@eisentraut.org 10260 : 6 : $$ = (Node *) n;
10261 : : }
10262 : : ;
10263 : :
10264 : : /*****************************************************************************
10265 : : *
10266 : : * ALTER OPERATOR name SET define
10267 : : *
10268 : : *****************************************************************************/
10269 : :
10270 : : AlterOperatorStmt:
10271 : : ALTER OPERATOR operator_with_argtypes SET '(' operator_def_list ')'
10272 : : {
3197 heikki.linnakangas@i 10273 : 301 : AlterOperatorStmt *n = makeNode(AlterOperatorStmt);
10274 : :
2664 peter_e@gmx.net 10275 : 301 : n->opername = $3;
10276 : 301 : n->options = $6;
702 peter@eisentraut.org 10277 : 301 : $$ = (Node *) n;
10278 : : }
10279 : : ;
10280 : :
3197 heikki.linnakangas@i 10281 : 331 : operator_def_list: operator_def_elem { $$ = list_make1($1); }
10282 : 253 : | operator_def_list ',' operator_def_elem { $$ = lappend($1, $3); }
10283 : : ;
10284 : :
10285 : : operator_def_elem: ColLabel '=' NONE
2777 peter_e@gmx.net 10286 : 15 : { $$ = makeDefElem($1, NULL, @1); }
10287 : : | ColLabel '=' operator_def_arg
2532 10288 : 555 : { $$ = makeDefElem($1, (Node *) $3, @1); }
10289 : : | ColLabel
177 tgl@sss.pgh.pa.us 10290 :GNC 14 : { $$ = makeDefElem($1, NULL, @1); }
10291 : : ;
10292 : :
10293 : : /* must be similar enough to def_arg to avoid reduce/reduce conflicts */
10294 : : operator_def_arg:
702 peter@eisentraut.org 10295 :CBC 516 : func_type { $$ = (Node *) $1; }
702 peter@eisentraut.org 10296 :GBC 12 : | reserved_keyword { $$ = (Node *) makeString(pstrdup($1)); }
702 peter@eisentraut.org 10297 :CBC 27 : | qual_all_Op { $$ = (Node *) $1; }
702 peter@eisentraut.org 10298 :UBC 0 : | NumericOnly { $$ = (Node *) $1; }
10299 : 0 : | Sconst { $$ = (Node *) makeString($1); }
10300 : : ;
10301 : :
10302 : : /*****************************************************************************
10303 : : *
10304 : : * ALTER TYPE name SET define
10305 : : *
10306 : : * We repurpose ALTER OPERATOR's version of "definition" here
10307 : : *
10308 : : *****************************************************************************/
10309 : :
10310 : : AlterTypeStmt:
10311 : : ALTER TYPE_P any_name SET '(' operator_def_list ')'
10312 : : {
1500 tgl@sss.pgh.pa.us 10313 :CBC 30 : AlterTypeStmt *n = makeNode(AlterTypeStmt);
10314 : :
10315 : 30 : n->typeName = $3;
10316 : 30 : n->options = $6;
702 peter@eisentraut.org 10317 : 30 : $$ = (Node *) n;
10318 : : }
10319 : : ;
10320 : :
10321 : : /*****************************************************************************
10322 : : *
10323 : : * ALTER THING name OWNER TO newname
10324 : : *
10325 : : *****************************************************************************/
10326 : :
10327 : : AlterOwnerStmt: ALTER AGGREGATE aggregate_with_argtypes OWNER TO RoleSpec
10328 : : {
7233 tgl@sss.pgh.pa.us 10329 : 71 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10330 : :
10331 : 71 : n->objectType = OBJECT_AGGREGATE;
2710 peter_e@gmx.net 10332 : 71 : n->object = (Node *) $3;
2768 10333 : 71 : n->newowner = $6;
702 peter@eisentraut.org 10334 : 71 : $$ = (Node *) n;
10335 : : }
10336 : : | ALTER COLLATION any_name OWNER TO RoleSpec
10337 : : {
4810 peter_e@gmx.net 10338 : 8 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10339 : :
10340 : 8 : n->objectType = OBJECT_COLLATION;
2710 10341 : 8 : n->object = (Node *) $3;
4810 10342 : 8 : n->newowner = $6;
702 peter@eisentraut.org 10343 : 8 : $$ = (Node *) n;
10344 : : }
10345 : : | ALTER CONVERSION_P any_name OWNER TO RoleSpec
10346 : : {
7233 tgl@sss.pgh.pa.us 10347 : 12 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10348 : :
10349 : 12 : n->objectType = OBJECT_CONVERSION;
2710 peter_e@gmx.net 10350 : 12 : n->object = (Node *) $3;
7233 tgl@sss.pgh.pa.us 10351 : 12 : n->newowner = $6;
702 peter@eisentraut.org 10352 : 12 : $$ = (Node *) n;
10353 : : }
10354 : : | ALTER DATABASE name OWNER TO RoleSpec
10355 : : {
7233 tgl@sss.pgh.pa.us 10356 : 22 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10357 : :
10358 : 22 : n->objectType = OBJECT_DATABASE;
2710 peter_e@gmx.net 10359 : 22 : n->object = (Node *) makeString($3);
7233 tgl@sss.pgh.pa.us 10360 : 22 : n->newowner = $6;
702 peter@eisentraut.org 10361 : 22 : $$ = (Node *) n;
10362 : : }
10363 : : | ALTER DOMAIN_P any_name OWNER TO RoleSpec
10364 : : {
7233 tgl@sss.pgh.pa.us 10365 : 19 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10366 : :
10367 : 19 : n->objectType = OBJECT_DOMAIN;
2710 peter_e@gmx.net 10368 : 19 : n->object = (Node *) $3;
7233 tgl@sss.pgh.pa.us 10369 : 19 : n->newowner = $6;
702 peter@eisentraut.org 10370 : 19 : $$ = (Node *) n;
10371 : : }
10372 : : | ALTER FUNCTION function_with_argtypes OWNER TO RoleSpec
10373 : : {
7233 tgl@sss.pgh.pa.us 10374 : 287 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10375 : :
10376 : 287 : n->objectType = OBJECT_FUNCTION;
2710 peter_e@gmx.net 10377 : 287 : n->object = (Node *) $3;
6068 tgl@sss.pgh.pa.us 10378 : 287 : n->newowner = $6;
702 peter@eisentraut.org 10379 : 287 : $$ = (Node *) n;
10380 : : }
10381 : : | ALTER opt_procedural LANGUAGE name OWNER TO RoleSpec
10382 : : {
6229 tgl@sss.pgh.pa.us 10383 : 60 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10384 : :
10385 : 60 : n->objectType = OBJECT_LANGUAGE;
2710 peter_e@gmx.net 10386 : 60 : n->object = (Node *) makeString($4);
6229 tgl@sss.pgh.pa.us 10387 : 60 : n->newowner = $7;
702 peter@eisentraut.org 10388 : 60 : $$ = (Node *) n;
10389 : : }
10390 : : | ALTER LARGE_P OBJECT_P NumericOnly OWNER TO RoleSpec
10391 : : {
5238 itagaki.takahiro@gma 10392 : 6 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10393 : :
10394 : 6 : n->objectType = OBJECT_LARGEOBJECT;
2710 peter_e@gmx.net 10395 : 6 : n->object = (Node *) $4;
5238 itagaki.takahiro@gma 10396 : 6 : n->newowner = $7;
702 peter@eisentraut.org 10397 : 6 : $$ = (Node *) n;
10398 : : }
10399 : : | ALTER OPERATOR operator_with_argtypes OWNER TO RoleSpec
10400 : : {
7233 tgl@sss.pgh.pa.us 10401 : 23 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10402 : :
10403 : 23 : n->objectType = OBJECT_OPERATOR;
2710 peter_e@gmx.net 10404 : 23 : n->object = (Node *) $3;
2664 10405 : 23 : n->newowner = $6;
702 peter@eisentraut.org 10406 : 23 : $$ = (Node *) n;
10407 : : }
10408 : : | ALTER OPERATOR CLASS any_name USING name OWNER TO RoleSpec
10409 : : {
7233 tgl@sss.pgh.pa.us 10410 : 27 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10411 : :
10412 : 27 : n->objectType = OBJECT_OPCLASS;
2710 peter_e@gmx.net 10413 : 27 : n->object = (Node *) lcons(makeString($6), $4);
7233 tgl@sss.pgh.pa.us 10414 : 27 : n->newowner = $9;
702 peter@eisentraut.org 10415 : 27 : $$ = (Node *) n;
10416 : : }
10417 : : | ALTER OPERATOR FAMILY any_name USING name OWNER TO RoleSpec
10418 : : {
6291 tgl@sss.pgh.pa.us 10419 : 31 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10420 : :
10421 : 31 : n->objectType = OBJECT_OPFAMILY;
2710 peter_e@gmx.net 10422 : 31 : n->object = (Node *) lcons(makeString($6), $4);
6291 tgl@sss.pgh.pa.us 10423 : 31 : n->newowner = $9;
702 peter@eisentraut.org 10424 : 31 : $$ = (Node *) n;
10425 : : }
10426 : : | ALTER PROCEDURE function_with_argtypes OWNER TO RoleSpec
10427 : : {
2327 peter_e@gmx.net 10428 : 9 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10429 : :
10430 : 9 : n->objectType = OBJECT_PROCEDURE;
10431 : 9 : n->object = (Node *) $3;
10432 : 9 : n->newowner = $6;
702 peter@eisentraut.org 10433 : 9 : $$ = (Node *) n;
10434 : : }
10435 : : | ALTER ROUTINE function_with_argtypes OWNER TO RoleSpec
10436 : : {
2327 peter_e@gmx.net 10437 :UBC 0 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10438 : :
10439 : 0 : n->objectType = OBJECT_ROUTINE;
10440 : 0 : n->object = (Node *) $3;
10441 : 0 : n->newowner = $6;
702 peter@eisentraut.org 10442 : 0 : $$ = (Node *) n;
10443 : : }
10444 : : | ALTER SCHEMA name OWNER TO RoleSpec
10445 : : {
7233 tgl@sss.pgh.pa.us 10446 :CBC 26 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10447 : :
10448 : 26 : n->objectType = OBJECT_SCHEMA;
2710 peter_e@gmx.net 10449 : 26 : n->object = (Node *) makeString($3);
7233 tgl@sss.pgh.pa.us 10450 : 26 : n->newowner = $6;
702 peter@eisentraut.org 10451 : 26 : $$ = (Node *) n;
10452 : : }
10453 : : | ALTER TYPE_P any_name OWNER TO RoleSpec
10454 : : {
7233 tgl@sss.pgh.pa.us 10455 : 40 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10456 : :
10457 : 40 : n->objectType = OBJECT_TYPE;
2710 peter_e@gmx.net 10458 : 40 : n->object = (Node *) $3;
7233 tgl@sss.pgh.pa.us 10459 : 40 : n->newowner = $6;
702 peter@eisentraut.org 10460 : 40 : $$ = (Node *) n;
10461 : : }
10462 : : | ALTER TABLESPACE name OWNER TO RoleSpec
10463 : : {
7233 tgl@sss.pgh.pa.us 10464 : 3 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10465 : :
10466 : 3 : n->objectType = OBJECT_TABLESPACE;
2710 peter_e@gmx.net 10467 : 3 : n->object = (Node *) makeString($3);
7233 tgl@sss.pgh.pa.us 10468 : 3 : n->newowner = $6;
702 peter@eisentraut.org 10469 : 3 : $$ = (Node *) n;
10470 : : }
10471 : : | ALTER STATISTICS any_name OWNER TO RoleSpec
10472 : : {
2578 alvherre@alvh.no-ip. 10473 : 16 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10474 : :
10475 : 16 : n->objectType = OBJECT_STATISTIC_EXT;
10476 : 16 : n->object = (Node *) $3;
10477 : 16 : n->newowner = $6;
702 peter@eisentraut.org 10478 : 16 : $$ = (Node *) n;
10479 : : }
10480 : : | ALTER TEXT_P SEARCH DICTIONARY any_name OWNER TO RoleSpec
10481 : : {
6081 tgl@sss.pgh.pa.us 10482 : 21 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10483 : :
10484 : 21 : n->objectType = OBJECT_TSDICTIONARY;
2710 peter_e@gmx.net 10485 : 21 : n->object = (Node *) $5;
6081 tgl@sss.pgh.pa.us 10486 : 21 : n->newowner = $8;
702 peter@eisentraut.org 10487 : 21 : $$ = (Node *) n;
10488 : : }
10489 : : | ALTER TEXT_P SEARCH CONFIGURATION any_name OWNER TO RoleSpec
10490 : : {
6081 tgl@sss.pgh.pa.us 10491 : 16 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10492 : :
10493 : 16 : n->objectType = OBJECT_TSCONFIGURATION;
2710 peter_e@gmx.net 10494 : 16 : n->object = (Node *) $5;
6081 tgl@sss.pgh.pa.us 10495 : 16 : n->newowner = $8;
702 peter@eisentraut.org 10496 : 16 : $$ = (Node *) n;
10497 : : }
10498 : : | ALTER FOREIGN DATA_P WRAPPER name OWNER TO RoleSpec
10499 : : {
5595 peter_e@gmx.net 10500 : 10 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10501 : :
10502 : 10 : n->objectType = OBJECT_FDW;
2710 10503 : 10 : n->object = (Node *) makeString($5);
5595 10504 : 10 : n->newowner = $8;
702 peter@eisentraut.org 10505 : 10 : $$ = (Node *) n;
10506 : : }
10507 : : | ALTER SERVER name OWNER TO RoleSpec
10508 : : {
5595 peter_e@gmx.net 10509 : 34 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10510 : :
10511 : 34 : n->objectType = OBJECT_FOREIGN_SERVER;
2710 10512 : 34 : n->object = (Node *) makeString($3);
5595 10513 : 34 : n->newowner = $6;
702 peter@eisentraut.org 10514 : 34 : $$ = (Node *) n;
10515 : : }
10516 : : | ALTER EVENT TRIGGER name OWNER TO RoleSpec
10517 : : {
4288 rhaas@postgresql.org 10518 : 7 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10519 : :
10520 : 7 : n->objectType = OBJECT_EVENT_TRIGGER;
2710 peter_e@gmx.net 10521 : 7 : n->object = (Node *) makeString($4);
4288 rhaas@postgresql.org 10522 : 7 : n->newowner = $7;
702 peter@eisentraut.org 10523 : 7 : $$ = (Node *) n;
10524 : : }
10525 : : | ALTER PUBLICATION name OWNER TO RoleSpec
10526 : : {
2642 peter_e@gmx.net 10527 : 13 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10528 : :
10529 : 13 : n->objectType = OBJECT_PUBLICATION;
2710 10530 : 13 : n->object = (Node *) makeString($3);
2642 10531 : 13 : n->newowner = $6;
702 peter@eisentraut.org 10532 : 13 : $$ = (Node *) n;
10533 : : }
10534 : : | ALTER SUBSCRIPTION name OWNER TO RoleSpec
10535 : : {
2642 peter_e@gmx.net 10536 : 9 : AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
10537 : :
10538 : 9 : n->objectType = OBJECT_SUBSCRIPTION;
2710 10539 : 9 : n->object = (Node *) makeString($3);
2642 10540 : 9 : n->newowner = $6;
702 peter@eisentraut.org 10541 : 9 : $$ = (Node *) n;
10542 : : }
10543 : : ;
10544 : :
10545 : :
10546 : : /*****************************************************************************
10547 : : *
10548 : : * CREATE PUBLICATION name [WITH options]
10549 : : *
10550 : : * CREATE PUBLICATION FOR ALL TABLES [WITH options]
10551 : : *
10552 : : * CREATE PUBLICATION FOR pub_obj [, ...] [WITH options]
10553 : : *
10554 : : * pub_obj is one of:
10555 : : *
10556 : : * TABLE table [, ...]
10557 : : * TABLES IN SCHEMA schema [, ...]
10558 : : *
10559 : : *****************************************************************************/
10560 : :
10561 : : CreatePublicationStmt:
10562 : : CREATE PUBLICATION name opt_definition
10563 : : {
2642 peter_e@gmx.net 10564 : 54 : CreatePublicationStmt *n = makeNode(CreatePublicationStmt);
10565 : :
10566 : 54 : n->pubname = $3;
900 akapila@postgresql.o 10567 : 54 : n->options = $4;
702 peter@eisentraut.org 10568 : 54 : $$ = (Node *) n;
10569 : : }
10570 : : | CREATE PUBLICATION name FOR ALL TABLES opt_definition
10571 : : {
900 akapila@postgresql.o 10572 : 31 : CreatePublicationStmt *n = makeNode(CreatePublicationStmt);
10573 : :
10574 : 31 : n->pubname = $3;
10575 : 31 : n->options = $7;
738 tomas.vondra@postgre 10576 : 31 : n->for_all_tables = true;
702 peter@eisentraut.org 10577 : 31 : $$ = (Node *) n;
10578 : : }
10579 : : | CREATE PUBLICATION name FOR pub_obj_list opt_definition
10580 : : {
900 akapila@postgresql.o 10581 : 276 : CreatePublicationStmt *n = makeNode(CreatePublicationStmt);
10582 : :
10583 : 276 : n->pubname = $3;
10584 : 276 : n->options = $6;
702 peter@eisentraut.org 10585 : 276 : n->pubobjects = (List *) $5;
900 akapila@postgresql.o 10586 : 276 : preprocess_pubobj_list(n->pubobjects, yyscanner);
702 peter@eisentraut.org 10587 : 261 : $$ = (Node *) n;
10588 : : }
10589 : : ;
10590 : :
10591 : : /*
10592 : : * FOR TABLE and FOR TABLES IN SCHEMA specifications
10593 : : *
10594 : : * This rule parses publication objects with and without keyword prefixes.
10595 : : *
10596 : : * The actual type of the object without keyword prefix depends on the previous
10597 : : * one with keyword prefix. It will be preprocessed in preprocess_pubobj_list().
10598 : : *
10599 : : * For the object without keyword prefix, we cannot just use relation_expr here,
10600 : : * because some extended expressions in relation_expr cannot be used as a
10601 : : * schemaname and we cannot differentiate it. So, we extract the rules from
10602 : : * relation_expr here.
10603 : : */
10604 : : PublicationObjSpec:
10605 : : TABLE relation_expr opt_column_list OptWhereClause
10606 : : {
900 akapila@postgresql.o 10607 : 580 : $$ = makeNode(PublicationObjSpec);
10608 : 580 : $$->pubobjtype = PUBLICATIONOBJ_TABLE;
10609 : 580 : $$->pubtable = makeNode(PublicationTable);
10610 : 580 : $$->pubtable->relation = $2;
750 tomas.vondra@postgre 10611 : 580 : $$->pubtable->columns = $3;
10612 : 580 : $$->pubtable->whereClause = $4;
10613 : : }
10614 : : | TABLES IN_P SCHEMA ColId
10615 : : {
900 akapila@postgresql.o 10616 : 166 : $$ = makeNode(PublicationObjSpec);
836 alvherre@alvh.no-ip. 10617 : 166 : $$->pubobjtype = PUBLICATIONOBJ_TABLES_IN_SCHEMA;
570 10618 : 166 : $$->name = $4;
10619 : 166 : $$->location = @4;
10620 : : }
10621 : : | TABLES IN_P SCHEMA CURRENT_SCHEMA
10622 : : {
900 akapila@postgresql.o 10623 : 9 : $$ = makeNode(PublicationObjSpec);
836 alvherre@alvh.no-ip. 10624 : 9 : $$->pubobjtype = PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA;
570 10625 : 9 : $$->location = @4;
10626 : : }
10627 : : | ColId opt_column_list OptWhereClause
10628 : : {
900 akapila@postgresql.o 10629 : 65 : $$ = makeNode(PublicationObjSpec);
10630 : 65 : $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION;
10631 : : /*
10632 : : * If either a row filter or column list is specified, create
10633 : : * a PublicationTable object.
10634 : : */
750 tomas.vondra@postgre 10635 [ + + + + ]: 65 : if ($2 || $3)
10636 : : {
10637 : : /*
10638 : : * The OptWhereClause must be stored here but it is
10639 : : * valid only for tables. For non-table objects, an
10640 : : * error will be thrown later via
10641 : : * preprocess_pubobj_list().
10642 : : */
782 akapila@postgresql.o 10643 : 21 : $$->pubtable = makeNode(PublicationTable);
10644 : 21 : $$->pubtable->relation = makeRangeVar(NULL, $1, @1);
750 tomas.vondra@postgre 10645 : 21 : $$->pubtable->columns = $2;
10646 : 21 : $$->pubtable->whereClause = $3;
10647 : : }
10648 : : else
10649 : : {
782 akapila@postgresql.o 10650 : 44 : $$->name = $1;
10651 : : }
900 10652 : 65 : $$->location = @1;
10653 : : }
10654 : : | ColId indirection opt_column_list OptWhereClause
10655 : : {
10656 : 16 : $$ = makeNode(PublicationObjSpec);
10657 : 16 : $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION;
10658 : 16 : $$->pubtable = makeNode(PublicationTable);
10659 : 16 : $$->pubtable->relation = makeRangeVarFromQualifiedName($1, $2, @1, yyscanner);
750 tomas.vondra@postgre 10660 : 16 : $$->pubtable->columns = $3;
10661 : 16 : $$->pubtable->whereClause = $4;
900 akapila@postgresql.o 10662 : 16 : $$->location = @1;
10663 : : }
10664 : : /* grammar like tablename * , ONLY tablename, ONLY ( tablename ) */
10665 : : | extended_relation_expr opt_column_list OptWhereClause
10666 : : {
10667 : 3 : $$ = makeNode(PublicationObjSpec);
10668 : 3 : $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION;
10669 : 3 : $$->pubtable = makeNode(PublicationTable);
10670 : 3 : $$->pubtable->relation = $1;
750 tomas.vondra@postgre 10671 : 3 : $$->pubtable->columns = $2;
10672 : 3 : $$->pubtable->whereClause = $3;
10673 : : }
10674 : : | CURRENT_SCHEMA
10675 : : {
900 akapila@postgresql.o 10676 : 9 : $$ = makeNode(PublicationObjSpec);
10677 : 9 : $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION;
10678 : 9 : $$->location = @1;
10679 : : }
10680 : : ;
10681 : :
10682 : : pub_obj_list: PublicationObjSpec
951 alvherre@alvh.no-ip. 10683 : 736 : { $$ = list_make1($1); }
10684 : : | pub_obj_list ',' PublicationObjSpec
900 akapila@postgresql.o 10685 : 112 : { $$ = lappend($1, $3); }
10686 : : ;
10687 : :
10688 : : /*****************************************************************************
10689 : : *
10690 : : * ALTER PUBLICATION name SET ( options )
10691 : : *
10692 : : * ALTER PUBLICATION name ADD pub_obj [, ...]
10693 : : *
10694 : : * ALTER PUBLICATION name DROP pub_obj [, ...]
10695 : : *
10696 : : * ALTER PUBLICATION name SET pub_obj [, ...]
10697 : : *
10698 : : * pub_obj is one of:
10699 : : *
10700 : : * TABLE table_name [, ...]
10701 : : * TABLES IN SCHEMA schema_name [, ...]
10702 : : *
10703 : : *****************************************************************************/
10704 : :
10705 : : AlterPublicationStmt:
10706 : : ALTER PUBLICATION name SET definition
10707 : : {
2642 peter_e@gmx.net 10708 : 55 : AlterPublicationStmt *n = makeNode(AlterPublicationStmt);
10709 : :
10710 : 55 : n->pubname = $3;
10711 : 55 : n->options = $5;
702 peter@eisentraut.org 10712 : 55 : $$ = (Node *) n;
10713 : : }
10714 : : | ALTER PUBLICATION name ADD_P pub_obj_list
10715 : : {
2642 peter_e@gmx.net 10716 : 166 : AlterPublicationStmt *n = makeNode(AlterPublicationStmt);
10717 : :
10718 : 166 : n->pubname = $3;
900 akapila@postgresql.o 10719 : 166 : n->pubobjects = $5;
10720 : 166 : preprocess_pubobj_list(n->pubobjects, yyscanner);
832 alvherre@alvh.no-ip. 10721 : 163 : n->action = AP_AddObjects;
702 peter@eisentraut.org 10722 : 163 : $$ = (Node *) n;
10723 : : }
10724 : : | ALTER PUBLICATION name SET pub_obj_list
10725 : : {
2642 peter_e@gmx.net 10726 : 220 : AlterPublicationStmt *n = makeNode(AlterPublicationStmt);
10727 : :
10728 : 220 : n->pubname = $3;
900 akapila@postgresql.o 10729 : 220 : n->pubobjects = $5;
10730 : 220 : preprocess_pubobj_list(n->pubobjects, yyscanner);
832 alvherre@alvh.no-ip. 10731 : 220 : n->action = AP_SetObjects;
702 peter@eisentraut.org 10732 : 220 : $$ = (Node *) n;
10733 : : }
10734 : : | ALTER PUBLICATION name DROP pub_obj_list
10735 : : {
2642 peter_e@gmx.net 10736 : 74 : AlterPublicationStmt *n = makeNode(AlterPublicationStmt);
10737 : :
10738 : 74 : n->pubname = $3;
900 akapila@postgresql.o 10739 : 74 : n->pubobjects = $5;
10740 : 74 : preprocess_pubobj_list(n->pubobjects, yyscanner);
832 alvherre@alvh.no-ip. 10741 : 74 : n->action = AP_DropObjects;
702 peter@eisentraut.org 10742 : 74 : $$ = (Node *) n;
10743 : : }
10744 : : ;
10745 : :
10746 : : /*****************************************************************************
10747 : : *
10748 : : * CREATE SUBSCRIPTION name ...
10749 : : *
10750 : : *****************************************************************************/
10751 : :
10752 : : CreateSubscriptionStmt:
10753 : : CREATE SUBSCRIPTION name CONNECTION Sconst PUBLICATION name_list opt_definition
10754 : : {
2642 peter_e@gmx.net 10755 :ECB (191) : CreateSubscriptionStmt *n =
2642 peter_e@gmx.net 10756 :CBC 211 : makeNode(CreateSubscriptionStmt);
10757 : 211 : n->subname = $3;
10758 : 211 : n->conninfo = $5;
10759 : 211 : n->publication = $7;
10760 : 211 : n->options = $8;
702 peter@eisentraut.org 10761 : 211 : $$ = (Node *) n;
10762 : : }
10763 : : ;
10764 : :
10765 : : /*****************************************************************************
10766 : : *
10767 : : * ALTER SUBSCRIPTION name ...
10768 : : *
10769 : : *****************************************************************************/
10770 : :
10771 : : AlterSubscriptionStmt:
10772 : : ALTER SUBSCRIPTION name SET definition
10773 : : {
2642 peter_e@gmx.net 10774 :ECB (86) : AlterSubscriptionStmt *n =
2642 peter_e@gmx.net 10775 :CBC 90 : makeNode(AlterSubscriptionStmt);
10776 : :
2579 10777 : 90 : n->kind = ALTER_SUBSCRIPTION_OPTIONS;
2642 10778 : 90 : n->subname = $3;
10779 : 90 : n->options = $5;
702 peter@eisentraut.org 10780 : 90 : $$ = (Node *) n;
10781 : : }
10782 : : | ALTER SUBSCRIPTION name CONNECTION Sconst
10783 : : {
2642 peter_e@gmx.net 10784 :ECB (11) : AlterSubscriptionStmt *n =
2642 peter_e@gmx.net 10785 :CBC 13 : makeNode(AlterSubscriptionStmt);
10786 : :
2579 10787 : 13 : n->kind = ALTER_SUBSCRIPTION_CONNECTION;
2642 10788 : 13 : n->subname = $3;
2579 10789 : 13 : n->conninfo = $5;
702 peter@eisentraut.org 10790 : 13 : $$ = (Node *) n;
10791 : : }
10792 : : | ALTER SUBSCRIPTION name REFRESH PUBLICATION opt_definition
10793 : : {
2579 peter_e@gmx.net 10794 :ECB (27) : AlterSubscriptionStmt *n =
2579 peter_e@gmx.net 10795 :CBC 27 : makeNode(AlterSubscriptionStmt);
10796 : :
10797 : 27 : n->kind = ALTER_SUBSCRIPTION_REFRESH;
10798 : 27 : n->subname = $3;
10799 : 27 : n->options = $6;
702 peter@eisentraut.org 10800 : 27 : $$ = (Node *) n;
10801 : : }
10802 : : | ALTER SUBSCRIPTION name ADD_P PUBLICATION name_list opt_definition
10803 : : {
1104 peter@eisentraut.org 10804 :ECB (14) : AlterSubscriptionStmt *n =
1104 peter@eisentraut.org 10805 :CBC 14 : makeNode(AlterSubscriptionStmt);
10806 : :
10807 : 14 : n->kind = ALTER_SUBSCRIPTION_ADD_PUBLICATION;
10808 : 14 : n->subname = $3;
10809 : 14 : n->publication = $6;
10810 : 14 : n->options = $7;
702 10811 : 14 : $$ = (Node *) n;
10812 : : }
10813 : : | ALTER SUBSCRIPTION name DROP PUBLICATION name_list opt_definition
10814 : : {
1104 peter@eisentraut.org 10815 :ECB (13) : AlterSubscriptionStmt *n =
1104 peter@eisentraut.org 10816 :CBC 13 : makeNode(AlterSubscriptionStmt);
10817 : :
10818 : 13 : n->kind = ALTER_SUBSCRIPTION_DROP_PUBLICATION;
10819 : 13 : n->subname = $3;
10820 : 13 : n->publication = $6;
10821 : 13 : n->options = $7;
702 10822 : 13 : $$ = (Node *) n;
10823 : : }
10824 : : | ALTER SUBSCRIPTION name SET PUBLICATION name_list opt_definition
10825 : : {
2642 peter_e@gmx.net 10826 :ECB (20) : AlterSubscriptionStmt *n =
2642 peter_e@gmx.net 10827 :CBC 20 : makeNode(AlterSubscriptionStmt);
10828 : :
1104 peter@eisentraut.org 10829 : 20 : n->kind = ALTER_SUBSCRIPTION_SET_PUBLICATION;
2642 peter_e@gmx.net 10830 : 20 : n->subname = $3;
2579 10831 : 20 : n->publication = $6;
2505 10832 : 20 : n->options = $7;
702 peter@eisentraut.org 10833 : 20 : $$ = (Node *) n;
10834 : : }
10835 : : | ALTER SUBSCRIPTION name ENABLE_P
10836 : : {
2642 peter_e@gmx.net 10837 :ECB (14) : AlterSubscriptionStmt *n =
2642 peter_e@gmx.net 10838 :CBC 22 : makeNode(AlterSubscriptionStmt);
10839 : :
2579 10840 : 22 : n->kind = ALTER_SUBSCRIPTION_ENABLED;
2642 10841 : 22 : n->subname = $3;
10842 : 22 : n->options = list_make1(makeDefElem("enabled",
10843 : : (Node *) makeBoolean(true), @1));
702 peter@eisentraut.org 10844 : 22 : $$ = (Node *) n;
10845 : : }
10846 : : | ALTER SUBSCRIPTION name DISABLE_P
10847 : : {
2642 peter_e@gmx.net 10848 :ECB (9) : AlterSubscriptionStmt *n =
2642 peter_e@gmx.net 10849 :CBC 13 : makeNode(AlterSubscriptionStmt);
10850 : :
2579 10851 : 13 : n->kind = ALTER_SUBSCRIPTION_ENABLED;
2642 10852 : 13 : n->subname = $3;
10853 : 13 : n->options = list_make1(makeDefElem("enabled",
10854 : : (Node *) makeBoolean(false), @1));
702 peter@eisentraut.org 10855 : 13 : $$ = (Node *) n;
10856 : : }
10857 : : | ALTER SUBSCRIPTION name SKIP definition
10858 : : {
754 akapila@postgresql.o 10859 :ECB (12) : AlterSubscriptionStmt *n =
754 akapila@postgresql.o 10860 :CBC 12 : makeNode(AlterSubscriptionStmt);
10861 : :
10862 : 12 : n->kind = ALTER_SUBSCRIPTION_SKIP;
10863 : 12 : n->subname = $3;
10864 : 12 : n->options = $5;
702 peter@eisentraut.org 10865 : 12 : $$ = (Node *) n;
10866 : : }
10867 : : ;
10868 : :
10869 : : /*****************************************************************************
10870 : : *
10871 : : * DROP SUBSCRIPTION [ IF EXISTS ] name
10872 : : *
10873 : : *****************************************************************************/
10874 : :
10875 : : DropSubscriptionStmt: DROP SUBSCRIPTION name opt_drop_behavior
10876 : : {
2642 peter_e@gmx.net 10877 : 93 : DropSubscriptionStmt *n = makeNode(DropSubscriptionStmt);
10878 : :
10879 : 93 : n->subname = $3;
10880 : 93 : n->missing_ok = false;
2532 10881 : 93 : n->behavior = $4;
2642 10882 : 93 : $$ = (Node *) n;
10883 : : }
10884 : : | DROP SUBSCRIPTION IF_P EXISTS name opt_drop_behavior
10885 : : {
10886 : 3 : DropSubscriptionStmt *n = makeNode(DropSubscriptionStmt);
10887 : :
10888 : 3 : n->subname = $5;
10889 : 3 : n->missing_ok = true;
2532 10890 : 3 : n->behavior = $6;
2642 10891 : 3 : $$ = (Node *) n;
10892 : : }
10893 : : ;
10894 : :
10895 : : /*****************************************************************************
10896 : : *
10897 : : * QUERY: Define Rewrite Rule
10898 : : *
10899 : : *****************************************************************************/
10900 : :
10901 : : RuleStmt: CREATE opt_or_replace RULE name AS
10902 : : ON event TO qualified_name where_clause
10903 : : DO opt_instead RuleActionList
10904 : : {
702 peter@eisentraut.org 10905 : 515 : RuleStmt *n = makeNode(RuleStmt);
10906 : :
7895 tgl@sss.pgh.pa.us 10907 : 515 : n->replace = $2;
5274 10908 : 515 : n->relation = $9;
7895 10909 : 515 : n->rulename = $4;
5274 10910 : 515 : n->whereClause = $10;
10911 : 515 : n->event = $7;
10912 : 515 : n->instead = $12;
10913 : 515 : n->actions = $13;
702 peter@eisentraut.org 10914 : 515 : $$ = (Node *) n;
10915 : : }
10916 : : ;
10917 : :
10918 : : RuleActionList:
7972 bruce@momjian.us 10919 : 70 : NOTHING { $$ = NIL; }
7259 neilc@samurai.com 10920 : 422 : | RuleActionStmt { $$ = list_make1($1); }
7972 bruce@momjian.us 10921 : 23 : | '(' RuleActionMulti ')' { $$ = $2; }
10922 : : ;
10923 : :
10924 : : /* the thrashing around here is to discard "empty" statements... */
10925 : : RuleActionMulti:
10926 : : RuleActionMulti ';' RuleActionStmtOrEmpty
7403 neilc@samurai.com 10927 [ + + ]: 31 : { if ($3 != NULL)
8569 bruce@momjian.us 10928 : 23 : $$ = lappend($1, $3);
10929 : : else
8956 tgl@sss.pgh.pa.us 10930 : 8 : $$ = $1;
10931 : : }
10932 : : | RuleActionStmtOrEmpty
7403 neilc@samurai.com 10933 [ + - ]: 23 : { if ($1 != NULL)
7259 10934 : 23 : $$ = list_make1($1);
10935 : : else
8956 tgl@sss.pgh.pa.us 10936 :UBC 0 : $$ = NIL;
10937 : : }
10938 : : ;
10939 : :
10940 : : RuleActionStmt:
10941 : : SelectStmt
10942 : : | InsertStmt
10943 : : | UpdateStmt
10944 : : | DeleteStmt
10945 : : | NotifyStmt
10946 : : ;
10947 : :
10948 : : RuleActionStmtOrEmpty:
7972 bruce@momjian.us 10949 :CBC 46 : RuleActionStmt { $$ = $1; }
7403 neilc@samurai.com 10950 : 8 : | /*EMPTY*/ { $$ = NULL; }
10951 : : ;
10952 : :
7972 bruce@momjian.us 10953 : 9 : event: SELECT { $$ = CMD_SELECT; }
10954 : 191 : | UPDATE { $$ = CMD_UPDATE; }
10955 : 79 : | DELETE_P { $$ = CMD_DELETE; }
10956 : 236 : | INSERT { $$ = CMD_INSERT; }
10957 : : ;
10958 : :
10959 : : opt_instead:
2433 peter_e@gmx.net 10960 : 356 : INSTEAD { $$ = true; }
10961 : 78 : | ALSO { $$ = false; }
10962 : 81 : | /*EMPTY*/ { $$ = false; }
10963 : : ;
10964 : :
10965 : :
10966 : : /*****************************************************************************
10967 : : *
10968 : : * QUERY:
10969 : : * NOTIFY <identifier> can appear both in rule bodies and
10970 : : * as a query-level command
10971 : : *
10972 : : *****************************************************************************/
10973 : :
10974 : : NotifyStmt: NOTIFY ColId notify_payload
10975 : : {
9715 bruce@momjian.us 10976 : 61 : NotifyStmt *n = makeNode(NotifyStmt);
10977 : :
5704 tgl@sss.pgh.pa.us 10978 : 61 : n->conditionname = $2;
5171 10979 : 61 : n->payload = $3;
702 peter@eisentraut.org 10980 : 61 : $$ = (Node *) n;
10981 : : }
10982 : : ;
10983 : :
10984 : : notify_payload:
5171 tgl@sss.pgh.pa.us 10985 : 31 : ',' Sconst { $$ = $2; }
10986 : 30 : | /*EMPTY*/ { $$ = NULL; }
10987 : : ;
10988 : :
10989 : : ListenStmt: LISTEN ColId
10990 : : {
9715 bruce@momjian.us 10991 : 37 : ListenStmt *n = makeNode(ListenStmt);
10992 : :
5704 tgl@sss.pgh.pa.us 10993 : 37 : n->conditionname = $2;
702 peter@eisentraut.org 10994 : 37 : $$ = (Node *) n;
10995 : : }
10996 : : ;
10997 : :
10998 : : UnlistenStmt:
10999 : : UNLISTEN ColId
11000 : : {
9364 scrappy@hub.org 11001 : 3 : UnlistenStmt *n = makeNode(UnlistenStmt);
11002 : :
5704 tgl@sss.pgh.pa.us 11003 : 3 : n->conditionname = $2;
702 peter@eisentraut.org 11004 : 3 : $$ = (Node *) n;
11005 : : }
11006 : : | UNLISTEN '*'
11007 : : {
9319 lockhart@fourpalms.o 11008 : 16 : UnlistenStmt *n = makeNode(UnlistenStmt);
11009 : :
5704 tgl@sss.pgh.pa.us 11010 : 16 : n->conditionname = NULL;
702 peter@eisentraut.org 11011 : 16 : $$ = (Node *) n;
11012 : : }
11013 : : ;
11014 : :
11015 : :
11016 : : /*****************************************************************************
11017 : : *
11018 : : * Transactions:
11019 : : *
11020 : : * BEGIN / COMMIT / ROLLBACK
11021 : : * (also older versions END / ABORT)
11022 : : *
11023 : : *****************************************************************************/
11024 : :
11025 : : TransactionStmt:
11026 : : ABORT_P opt_transaction opt_transaction_chain
11027 : : {
9715 bruce@momjian.us 11028 : 102 : TransactionStmt *n = makeNode(TransactionStmt);
11029 : :
7734 tgl@sss.pgh.pa.us 11030 : 102 : n->kind = TRANS_STMT_ROLLBACK;
7924 bruce@momjian.us 11031 : 102 : n->options = NIL;
1848 peter@eisentraut.org 11032 : 102 : n->chain = $3;
262 michael@paquier.xyz 11033 :GNC 102 : n->location = -1;
702 peter@eisentraut.org 11034 :CBC 102 : $$ = (Node *) n;
11035 : : }
11036 : : | START TRANSACTION transaction_mode_list_or_empty
11037 : : {
9715 bruce@momjian.us 11038 : 791 : TransactionStmt *n = makeNode(TransactionStmt);
11039 : :
7734 tgl@sss.pgh.pa.us 11040 : 791 : n->kind = TRANS_STMT_START;
7924 bruce@momjian.us 11041 : 791 : n->options = $3;
262 michael@paquier.xyz 11042 :GNC 791 : n->location = -1;
702 peter@eisentraut.org 11043 :CBC 791 : $$ = (Node *) n;
11044 : : }
11045 : : | COMMIT opt_transaction opt_transaction_chain
11046 : : {
8652 lockhart@fourpalms.o 11047 : 5677 : TransactionStmt *n = makeNode(TransactionStmt);
11048 : :
7734 tgl@sss.pgh.pa.us 11049 : 5677 : n->kind = TRANS_STMT_COMMIT;
7924 bruce@momjian.us 11050 : 5677 : n->options = NIL;
1848 peter@eisentraut.org 11051 : 5677 : n->chain = $3;
262 michael@paquier.xyz 11052 :GNC 5677 : n->location = -1;
702 peter@eisentraut.org 11053 :CBC 5677 : $$ = (Node *) n;
11054 : : }
11055 : : | ROLLBACK opt_transaction opt_transaction_chain
11056 : : {
9715 bruce@momjian.us 11057 : 1163 : TransactionStmt *n = makeNode(TransactionStmt);
11058 : :
7734 tgl@sss.pgh.pa.us 11059 : 1163 : n->kind = TRANS_STMT_ROLLBACK;
7924 bruce@momjian.us 11060 : 1163 : n->options = NIL;
1848 peter@eisentraut.org 11061 : 1163 : n->chain = $3;
262 michael@paquier.xyz 11062 :GNC 1163 : n->location = -1;
702 peter@eisentraut.org 11063 :CBC 1163 : $$ = (Node *) n;
11064 : : }
11065 : : | SAVEPOINT ColId
11066 : : {
7201 tgl@sss.pgh.pa.us 11067 : 1027 : TransactionStmt *n = makeNode(TransactionStmt);
11068 : :
11069 : 1027 : n->kind = TRANS_STMT_SAVEPOINT;
2249 peter_e@gmx.net 11070 : 1027 : n->savepoint_name = $2;
262 michael@paquier.xyz 11071 :GNC 1027 : n->location = @2;
702 peter@eisentraut.org 11072 :CBC 1027 : $$ = (Node *) n;
11073 : : }
11074 : : | RELEASE SAVEPOINT ColId
11075 : : {
7185 tgl@sss.pgh.pa.us 11076 : 104 : TransactionStmt *n = makeNode(TransactionStmt);
11077 : :
11078 : 104 : n->kind = TRANS_STMT_RELEASE;
2249 peter_e@gmx.net 11079 : 104 : n->savepoint_name = $3;
262 michael@paquier.xyz 11080 :GNC 104 : n->location = @3;
702 peter@eisentraut.org 11081 :CBC 104 : $$ = (Node *) n;
11082 : : }
11083 : : | RELEASE ColId
11084 : : {
7201 tgl@sss.pgh.pa.us 11085 : 47 : TransactionStmt *n = makeNode(TransactionStmt);
11086 : :
11087 : 47 : n->kind = TRANS_STMT_RELEASE;
2249 peter_e@gmx.net 11088 : 47 : n->savepoint_name = $2;
262 michael@paquier.xyz 11089 :GNC 47 : n->location = @2;
702 peter@eisentraut.org 11090 :CBC 47 : $$ = (Node *) n;
11091 : : }
11092 : : | ROLLBACK opt_transaction TO SAVEPOINT ColId
11093 : : {
7201 tgl@sss.pgh.pa.us 11094 : 109 : TransactionStmt *n = makeNode(TransactionStmt);
11095 : :
11096 : 109 : n->kind = TRANS_STMT_ROLLBACK_TO;
2249 peter_e@gmx.net 11097 : 109 : n->savepoint_name = $5;
262 michael@paquier.xyz 11098 :GNC 109 : n->location = @5;
702 peter@eisentraut.org 11099 :CBC 109 : $$ = (Node *) n;
11100 : : }
11101 : : | ROLLBACK opt_transaction TO ColId
11102 : : {
7185 tgl@sss.pgh.pa.us 11103 : 255 : TransactionStmt *n = makeNode(TransactionStmt);
11104 : :
11105 : 255 : n->kind = TRANS_STMT_ROLLBACK_TO;
2249 peter_e@gmx.net 11106 : 255 : n->savepoint_name = $4;
262 michael@paquier.xyz 11107 :GNC 255 : n->location = @4;
702 peter@eisentraut.org 11108 :CBC 255 : $$ = (Node *) n;
11109 : : }
11110 : : | PREPARE TRANSACTION Sconst
11111 : : {
6876 tgl@sss.pgh.pa.us 11112 : 421 : TransactionStmt *n = makeNode(TransactionStmt);
11113 : :
11114 : 421 : n->kind = TRANS_STMT_PREPARE;
11115 : 421 : n->gid = $3;
246 michael@paquier.xyz 11116 :GNC 421 : n->location = @3;
702 peter@eisentraut.org 11117 :CBC 421 : $$ = (Node *) n;
11118 : : }
11119 : : | COMMIT PREPARED Sconst
11120 : : {
6876 tgl@sss.pgh.pa.us 11121 : 337 : TransactionStmt *n = makeNode(TransactionStmt);
11122 : :
11123 : 337 : n->kind = TRANS_STMT_COMMIT_PREPARED;
11124 : 337 : n->gid = $3;
246 michael@paquier.xyz 11125 :GNC 337 : n->location = @3;
702 peter@eisentraut.org 11126 :CBC 337 : $$ = (Node *) n;
11127 : : }
11128 : : | ROLLBACK PREPARED Sconst
11129 : : {
6876 tgl@sss.pgh.pa.us 11130 : 38 : TransactionStmt *n = makeNode(TransactionStmt);
11131 : :
11132 : 38 : n->kind = TRANS_STMT_ROLLBACK_PREPARED;
11133 : 38 : n->gid = $3;
246 michael@paquier.xyz 11134 :GNC 38 : n->location = @3;
702 peter@eisentraut.org 11135 :CBC 38 : $$ = (Node *) n;
11136 : : }
11137 : : ;
11138 : :
11139 : : TransactionStmtLegacy:
11140 : : BEGIN_P opt_transaction transaction_mode_list_or_empty
11141 : : {
1103 11142 : 6882 : TransactionStmt *n = makeNode(TransactionStmt);
11143 : :
11144 : 6882 : n->kind = TRANS_STMT_BEGIN;
11145 : 6882 : n->options = $3;
262 michael@paquier.xyz 11146 :GNC 6882 : n->location = -1;
702 peter@eisentraut.org 11147 :CBC 6882 : $$ = (Node *) n;
11148 : : }
11149 : : | END_P opt_transaction opt_transaction_chain
11150 : : {
1103 11151 : 180 : TransactionStmt *n = makeNode(TransactionStmt);
11152 : :
11153 : 180 : n->kind = TRANS_STMT_COMMIT;
11154 : 180 : n->options = NIL;
11155 : 180 : n->chain = $3;
262 michael@paquier.xyz 11156 :GNC 180 : n->location = -1;
702 peter@eisentraut.org 11157 :CBC 180 : $$ = (Node *) n;
11158 : : }
11159 : : ;
11160 : :
11161 : : opt_transaction: WORK
11162 : : | TRANSACTION
11163 : : | /*EMPTY*/
11164 : : ;
11165 : :
11166 : : transaction_mode_item:
11167 : : ISOLATION LEVEL iso_level
7185 tgl@sss.pgh.pa.us 11168 : 3287 : { $$ = makeDefElem("transaction_isolation",
2777 peter_e@gmx.net 11169 : 3287 : makeStringConst($3, @3), @1); }
11170 : : | READ ONLY
7185 tgl@sss.pgh.pa.us 11171 : 650 : { $$ = makeDefElem("transaction_read_only",
2433 peter_e@gmx.net 11172 : 650 : makeIntConst(true, @1), @1); }
11173 : : | READ WRITE
7185 tgl@sss.pgh.pa.us 11174 : 44 : { $$ = makeDefElem("transaction_read_only",
2433 peter_e@gmx.net 11175 : 44 : makeIntConst(false, @1), @1); }
11176 : : | DEFERRABLE
4815 heikki.linnakangas@i 11177 : 22 : { $$ = makeDefElem("transaction_deferrable",
11178 : : makeIntConst(true, @1), @1); }
11179 : : | NOT DEFERRABLE
11180 : 5 : { $$ = makeDefElem("transaction_deferrable",
2433 peter_e@gmx.net 11181 : 5 : makeIntConst(false, @1), @1); }
11182 : : ;
11183 : :
11184 : : /* Syntax with commas is SQL-spec, without commas is Postgres historical */
11185 : : transaction_mode_list:
11186 : : transaction_mode_item
7185 tgl@sss.pgh.pa.us 11187 : 3392 : { $$ = list_make1($1); }
11188 : : | transaction_mode_list ',' transaction_mode_item
11189 : 442 : { $$ = lappend($1, $3); }
11190 : : | transaction_mode_list transaction_mode_item
11191 : 174 : { $$ = lappend($1, $2); }
11192 : : ;
11193 : :
11194 : : transaction_mode_list_or_empty:
11195 : : transaction_mode_list
11196 : : | /* EMPTY */
7765 peter_e@gmx.net 11197 : 4551 : { $$ = NIL; }
11198 : : ;
11199 : :
11200 : : opt_transaction_chain:
1848 peter@eisentraut.org 11201 : 60 : AND CHAIN { $$ = true; }
11202 : 1 : | AND NO CHAIN { $$ = false; }
11203 : 7061 : | /* EMPTY */ { $$ = false; }
11204 : : ;
11205 : :
11206 : :
11207 : : /*****************************************************************************
11208 : : *
11209 : : * QUERY:
11210 : : * CREATE [ OR REPLACE ] [ TEMP ] VIEW <viewname> '('target-list ')'
11211 : : * AS <query> [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
11212 : : *
11213 : : *****************************************************************************/
11214 : :
11215 : : ViewStmt: CREATE OptTemp VIEW qualified_name opt_column_list opt_reloptions
11216 : : AS SelectStmt opt_check_option
11217 : : {
702 11218 : 6553 : ViewStmt *n = makeNode(ViewStmt);
11219 : :
7895 tgl@sss.pgh.pa.us 11220 : 6553 : n->view = $4;
4871 rhaas@postgresql.org 11221 : 6553 : n->view->relpersistence = $2;
7895 tgl@sss.pgh.pa.us 11222 : 6553 : n->aliases = $5;
4497 rhaas@postgresql.org 11223 : 6553 : n->query = $8;
6242 tgl@sss.pgh.pa.us 11224 : 6553 : n->replace = false;
4497 rhaas@postgresql.org 11225 : 6553 : n->options = $6;
3923 sfrost@snowman.net 11226 : 6553 : n->withCheckOption = $9;
7011 neilc@samurai.com 11227 : 6553 : $$ = (Node *) n;
11228 : : }
11229 : : | CREATE OR REPLACE OptTemp VIEW qualified_name opt_column_list opt_reloptions
11230 : : AS SelectStmt opt_check_option
11231 : : {
702 peter@eisentraut.org 11232 : 122 : ViewStmt *n = makeNode(ViewStmt);
11233 : :
7011 neilc@samurai.com 11234 : 122 : n->view = $6;
4871 rhaas@postgresql.org 11235 : 122 : n->view->relpersistence = $4;
7011 neilc@samurai.com 11236 : 122 : n->aliases = $7;
4497 rhaas@postgresql.org 11237 : 122 : n->query = $10;
6242 tgl@sss.pgh.pa.us 11238 : 122 : n->replace = true;
4497 rhaas@postgresql.org 11239 : 122 : n->options = $8;
3923 sfrost@snowman.net 11240 : 122 : n->withCheckOption = $11;
7011 neilc@samurai.com 11241 : 122 : $$ = (Node *) n;
11242 : : }
11243 : : | CREATE OptTemp RECURSIVE VIEW qualified_name '(' columnList ')' opt_reloptions
11244 : : AS SelectStmt opt_check_option
11245 : : {
702 peter@eisentraut.org 11246 : 4 : ViewStmt *n = makeNode(ViewStmt);
11247 : :
4091 peter_e@gmx.net 11248 : 4 : n->view = $5;
11249 : 4 : n->view->relpersistence = $2;
11250 : 4 : n->aliases = $7;
11251 : 4 : n->query = makeRecursiveViewSelect(n->view->relname, n->aliases, $11);
11252 : 4 : n->replace = false;
11253 : 4 : n->options = $9;
3923 sfrost@snowman.net 11254 : 4 : n->withCheckOption = $12;
11255 [ - + ]: 4 : if (n->withCheckOption != NO_CHECK_OPTION)
3923 sfrost@snowman.net 11256 [ # # ]:UBC 0 : ereport(ERROR,
11257 : : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
11258 : : errmsg("WITH CHECK OPTION not supported on recursive views"),
11259 : : parser_errposition(@12)));
4091 peter_e@gmx.net 11260 :CBC 4 : $$ = (Node *) n;
11261 : : }
11262 : : | CREATE OR REPLACE OptTemp RECURSIVE VIEW qualified_name '(' columnList ')' opt_reloptions
11263 : : AS SelectStmt opt_check_option
11264 : : {
702 peter@eisentraut.org 11265 : 3 : ViewStmt *n = makeNode(ViewStmt);
11266 : :
4091 peter_e@gmx.net 11267 : 3 : n->view = $7;
11268 : 3 : n->view->relpersistence = $4;
11269 : 3 : n->aliases = $9;
11270 : 3 : n->query = makeRecursiveViewSelect(n->view->relname, n->aliases, $13);
11271 : 3 : n->replace = true;
11272 : 3 : n->options = $11;
3923 sfrost@snowman.net 11273 : 3 : n->withCheckOption = $14;
11274 [ - + ]: 3 : if (n->withCheckOption != NO_CHECK_OPTION)
3923 sfrost@snowman.net 11275 [ # # ]:UBC 0 : ereport(ERROR,
11276 : : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
11277 : : errmsg("WITH CHECK OPTION not supported on recursive views"),
11278 : : parser_errposition(@14)));
4091 peter_e@gmx.net 11279 :CBC 3 : $$ = (Node *) n;
11280 : : }
11281 : : ;
11282 : :
11283 : : opt_check_option:
3923 sfrost@snowman.net 11284 : 45 : WITH CHECK OPTION { $$ = CASCADED_CHECK_OPTION; }
11285 : 3 : | WITH CASCADED CHECK OPTION { $$ = CASCADED_CHECK_OPTION; }
11286 : 12 : | WITH LOCAL CHECK OPTION { $$ = LOCAL_CHECK_OPTION; }
11287 : 6622 : | /* EMPTY */ { $$ = NO_CHECK_OPTION; }
11288 : : ;
11289 : :
11290 : : /*****************************************************************************
11291 : : *
11292 : : * QUERY:
11293 : : * LOAD "filename"
11294 : : *
11295 : : *****************************************************************************/
11296 : :
11297 : : LoadStmt: LOAD file_name
11298 : : {
702 peter@eisentraut.org 11299 : 29 : LoadStmt *n = makeNode(LoadStmt);
11300 : :
9715 bruce@momjian.us 11301 : 29 : n->filename = $2;
702 peter@eisentraut.org 11302 : 29 : $$ = (Node *) n;
11303 : : }
11304 : : ;
11305 : :
11306 : :
11307 : : /*****************************************************************************
11308 : : *
11309 : : * CREATE DATABASE
11310 : : *
11311 : : *****************************************************************************/
11312 : :
11313 : : CreatedbStmt:
11314 : : CREATE DATABASE name opt_with createdb_opt_list
11315 : : {
8572 tgl@sss.pgh.pa.us 11316 : 319 : CreatedbStmt *n = makeNode(CreatedbStmt);
11317 : :
9715 bruce@momjian.us 11318 : 319 : n->dbname = $3;
7971 11319 : 319 : n->options = $5;
702 peter@eisentraut.org 11320 : 319 : $$ = (Node *) n;
11321 : : }
11322 : : ;
11323 : :
11324 : : createdb_opt_list:
3575 tgl@sss.pgh.pa.us 11325 : 243 : createdb_opt_items { $$ = $1; }
7971 bruce@momjian.us 11326 : 88 : | /* EMPTY */ { $$ = NIL; }
11327 : : ;
11328 : :
11329 : : createdb_opt_items:
3575 tgl@sss.pgh.pa.us 11330 : 243 : createdb_opt_item { $$ = list_make1($1); }
11331 : 315 : | createdb_opt_items createdb_opt_item { $$ = lappend($1, $2); }
11332 : : ;
11333 : :
11334 : : createdb_opt_item:
11335 : : createdb_opt_name opt_equal NumericOnly
11336 : : {
527 11337 : 90 : $$ = makeDefElem($1, $3, @1);
11338 : : }
11339 : : | createdb_opt_name opt_equal opt_boolean_or_string
11340 : : {
702 peter@eisentraut.org 11341 : 468 : $$ = makeDefElem($1, (Node *) makeString($3), @1);
11342 : : }
11343 : : | createdb_opt_name opt_equal DEFAULT
11344 : : {
2777 peter_e@gmx.net 11345 :UBC 0 : $$ = makeDefElem($1, NULL, @1);
11346 : : }
11347 : : ;
11348 : :
11349 : : /*
11350 : : * Ideally we'd use ColId here, but that causes shift/reduce conflicts against
11351 : : * the ALTER DATABASE SET/RESET syntaxes. Instead call out specific keywords
11352 : : * we need, and allow IDENT so that database option names don't have to be
11353 : : * parser keywords unless they are already keywords for other reasons.
11354 : : *
11355 : : * XXX this coding technique is fragile since if someone makes a formerly
11356 : : * non-keyword option name into a keyword and forgets to add it here, the
11357 : : * option will silently break. Best defense is to provide a regression test
11358 : : * exercising every such option, at least at the syntax level.
11359 : : */
11360 : : createdb_opt_name:
3575 tgl@sss.pgh.pa.us 11361 :CBC 378 : IDENT { $$ = $1; }
11362 : 1 : | CONNECTION LIMIT { $$ = pstrdup("connection_limit"); }
11363 : 30 : | ENCODING { $$ = pstrdup($1); }
3575 tgl@sss.pgh.pa.us 11364 :UBC 0 : | LOCATION { $$ = pstrdup($1); }
3575 tgl@sss.pgh.pa.us 11365 :CBC 1 : | OWNER { $$ = pstrdup($1); }
11366 : 8 : | TABLESPACE { $$ = pstrdup($1); }
11367 : 140 : | TEMPLATE { $$ = pstrdup($1); }
11368 : : ;
11369 : :
11370 : : /*
11371 : : * Though the equals sign doesn't match other WITH options, pg_dump uses
11372 : : * equals for backward compatibility, and it doesn't seem worth removing it.
11373 : : */
11374 : : opt_equal: '='
11375 : : | /*EMPTY*/
11376 : : ;
11377 : :
11378 : :
11379 : : /*****************************************************************************
11380 : : *
11381 : : * ALTER DATABASE
11382 : : *
11383 : : *****************************************************************************/
11384 : :
11385 : : AlterDatabaseStmt:
11386 : : ALTER DATABASE name WITH createdb_opt_list
11387 : : {
6832 tgl@sss.pgh.pa.us 11388 :UBC 0 : AlterDatabaseStmt *n = makeNode(AlterDatabaseStmt);
11389 : :
11390 : 0 : n->dbname = $3;
11391 : 0 : n->options = $5;
702 peter@eisentraut.org 11392 : 0 : $$ = (Node *) n;
11393 : : }
11394 : : | ALTER DATABASE name createdb_opt_list
11395 : : {
3575 tgl@sss.pgh.pa.us 11396 :CBC 12 : AlterDatabaseStmt *n = makeNode(AlterDatabaseStmt);
11397 : :
11398 : 12 : n->dbname = $3;
11399 : 12 : n->options = $4;
702 peter@eisentraut.org 11400 : 12 : $$ = (Node *) n;
11401 : : }
11402 : : | ALTER DATABASE name SET TABLESPACE name
11403 : : {
5637 tgl@sss.pgh.pa.us 11404 : 5 : AlterDatabaseStmt *n = makeNode(AlterDatabaseStmt);
11405 : :
11406 : 5 : n->dbname = $3;
11407 : 5 : n->options = list_make1(makeDefElem("tablespace",
11408 : : (Node *) makeString($6), @6));
702 peter@eisentraut.org 11409 : 5 : $$ = (Node *) n;
11410 : : }
11411 : : | ALTER DATABASE name REFRESH COLLATION VERSION_P
11412 : : {
790 11413 : 3 : AlterDatabaseRefreshCollStmt *n = makeNode(AlterDatabaseRefreshCollStmt);
11414 : :
11415 : 3 : n->dbname = $3;
702 11416 : 3 : $$ = (Node *) n;
11417 : : }
11418 : : ;
11419 : :
11420 : : AlterDatabaseSetStmt:
11421 : : ALTER DATABASE name SetResetClause
11422 : : {
8080 peter_e@gmx.net 11423 : 535 : AlterDatabaseSetStmt *n = makeNode(AlterDatabaseSetStmt);
11424 : :
11425 : 535 : n->dbname = $3;
6068 tgl@sss.pgh.pa.us 11426 : 535 : n->setstmt = $4;
702 peter@eisentraut.org 11427 : 535 : $$ = (Node *) n;
11428 : : }
11429 : : ;
11430 : :
11431 : :
11432 : : /*****************************************************************************
11433 : : *
11434 : : * DROP DATABASE [ IF EXISTS ] dbname [ [ WITH ] ( options ) ]
11435 : : *
11436 : : * This is implicitly CASCADE, no need for drop behavior
11437 : : *****************************************************************************/
11438 : :
11439 : : DropdbStmt: DROP DATABASE name
11440 : : {
8060 tgl@sss.pgh.pa.us 11441 : 36 : DropdbStmt *n = makeNode(DropdbStmt);
11442 : :
11443 : 36 : n->dbname = $3;
2433 peter_e@gmx.net 11444 : 36 : n->missing_ok = false;
1615 akapila@postgresql.o 11445 : 36 : n->options = NULL;
702 peter@eisentraut.org 11446 : 36 : $$ = (Node *) n;
11447 : : }
11448 : : | DROP DATABASE IF_P EXISTS name
11449 : : {
6718 andrew@dunslane.net 11450 : 2 : DropdbStmt *n = makeNode(DropdbStmt);
11451 : :
11452 : 2 : n->dbname = $5;
2433 peter_e@gmx.net 11453 : 2 : n->missing_ok = true;
1615 akapila@postgresql.o 11454 : 2 : n->options = NULL;
702 peter@eisentraut.org 11455 : 2 : $$ = (Node *) n;
11456 : : }
11457 : : | DROP DATABASE name opt_with '(' drop_option_list ')'
11458 : : {
1615 akapila@postgresql.o 11459 : 7 : DropdbStmt *n = makeNode(DropdbStmt);
11460 : :
11461 : 7 : n->dbname = $3;
11462 : 7 : n->missing_ok = false;
11463 : 7 : n->options = $6;
702 peter@eisentraut.org 11464 : 7 : $$ = (Node *) n;
11465 : : }
11466 : : | DROP DATABASE IF_P EXISTS name opt_with '(' drop_option_list ')'
11467 : : {
1615 akapila@postgresql.o 11468 : 6 : DropdbStmt *n = makeNode(DropdbStmt);
11469 : :
11470 : 6 : n->dbname = $5;
11471 : 6 : n->missing_ok = true;
11472 : 6 : n->options = $8;
702 peter@eisentraut.org 11473 : 6 : $$ = (Node *) n;
11474 : : }
11475 : : ;
11476 : :
11477 : : drop_option_list:
11478 : : drop_option
11479 : : {
1615 akapila@postgresql.o 11480 : 13 : $$ = list_make1((Node *) $1);
11481 : : }
11482 : : | drop_option_list ',' drop_option
11483 : : {
1615 akapila@postgresql.o 11484 :UBC 0 : $$ = lappend($1, (Node *) $3);
11485 : : }
11486 : : ;
11487 : :
11488 : : /*
11489 : : * Currently only the FORCE option is supported, but the syntax is designed
11490 : : * to be extensible so that we can add more options in the future if required.
11491 : : */
11492 : : drop_option:
11493 : : FORCE
11494 : : {
1615 akapila@postgresql.o 11495 :CBC 13 : $$ = makeDefElem("force", NULL, @1);
11496 : : }
11497 : : ;
11498 : :
11499 : : /*****************************************************************************
11500 : : *
11501 : : * ALTER COLLATION
11502 : : *
11503 : : *****************************************************************************/
11504 : :
11505 : : AlterCollationStmt: ALTER COLLATION any_name REFRESH VERSION_P
11506 : : {
1073 tmunro@postgresql.or 11507 : 3 : AlterCollationStmt *n = makeNode(AlterCollationStmt);
11508 : :
11509 : 3 : n->collname = $3;
702 peter@eisentraut.org 11510 : 3 : $$ = (Node *) n;
11511 : : }
11512 : : ;
11513 : :
11514 : :
11515 : : /*****************************************************************************
11516 : : *
11517 : : * ALTER SYSTEM
11518 : : *
11519 : : * This is used to change configuration parameters persistently.
11520 : : *****************************************************************************/
11521 : :
11522 : : AlterSystemStmt:
11523 : : ALTER SYSTEM_P SET generic_set
11524 : : {
3770 ishii@postgresql.org 11525 : 55 : AlterSystemStmt *n = makeNode(AlterSystemStmt);
11526 : :
11527 : 55 : n->setstmt = $4;
702 peter@eisentraut.org 11528 : 55 : $$ = (Node *) n;
11529 : : }
11530 : : | ALTER SYSTEM_P RESET generic_reset
11531 : : {
3512 fujii@postgresql.org 11532 : 24 : AlterSystemStmt *n = makeNode(AlterSystemStmt);
11533 : :
11534 : 24 : n->setstmt = $4;
702 peter@eisentraut.org 11535 : 24 : $$ = (Node *) n;
11536 : : }
11537 : : ;
11538 : :
11539 : :
11540 : : /*****************************************************************************
11541 : : *
11542 : : * Manipulate a domain
11543 : : *
11544 : : *****************************************************************************/
11545 : :
11546 : : CreateDomainStmt:
11547 : : CREATE DOMAIN_P any_name opt_as Typename ColQualList
11548 : : {
8062 bruce@momjian.us 11549 : 564 : CreateDomainStmt *n = makeNode(CreateDomainStmt);
11550 : :
11551 : 564 : n->domainname = $3;
5386 peter_e@gmx.net 11552 : 564 : n->typeName = $5;
4785 tgl@sss.pgh.pa.us 11553 : 564 : SplitColQualList($6, &n->constraints, &n->collClause,
11554 : : yyscanner);
702 peter@eisentraut.org 11555 : 564 : $$ = (Node *) n;
11556 : : }
11557 : : ;
11558 : :
11559 : : AlterDomainStmt:
11560 : : /* ALTER DOMAIN <domain> {SET DEFAULT <expr>|DROP DEFAULT} */
11561 : : ALTER DOMAIN_P any_name alter_column_default
11562 : : {
7800 bruce@momjian.us 11563 : 7 : AlterDomainStmt *n = makeNode(AlterDomainStmt);
11564 : :
11565 : 7 : n->subtype = 'T';
5386 peter_e@gmx.net 11566 : 7 : n->typeName = $3;
7800 bruce@momjian.us 11567 : 7 : n->def = $4;
702 peter@eisentraut.org 11568 : 7 : $$ = (Node *) n;
11569 : : }
11570 : : /* ALTER DOMAIN <domain> DROP NOT NULL */
11571 : : | ALTER DOMAIN_P any_name DROP NOT NULL_P
11572 : : {
7800 bruce@momjian.us 11573 : 6 : AlterDomainStmt *n = makeNode(AlterDomainStmt);
11574 : :
11575 : 6 : n->subtype = 'N';
5386 peter_e@gmx.net 11576 : 6 : n->typeName = $3;
702 peter@eisentraut.org 11577 : 6 : $$ = (Node *) n;
11578 : : }
11579 : : /* ALTER DOMAIN <domain> SET NOT NULL */
11580 : : | ALTER DOMAIN_P any_name SET NOT NULL_P
11581 : : {
7800 bruce@momjian.us 11582 : 12 : AlterDomainStmt *n = makeNode(AlterDomainStmt);
11583 : :
11584 : 12 : n->subtype = 'O';
5386 peter_e@gmx.net 11585 : 12 : n->typeName = $3;
702 peter@eisentraut.org 11586 : 12 : $$ = (Node *) n;
11587 : : }
11588 : : /* ALTER DOMAIN <domain> ADD CONSTRAINT ... */
11589 : : | ALTER DOMAIN_P any_name ADD_P TableConstraint
11590 : : {
7800 bruce@momjian.us 11591 : 84 : AlterDomainStmt *n = makeNode(AlterDomainStmt);
11592 : :
11593 : 84 : n->subtype = 'C';
5386 peter_e@gmx.net 11594 : 84 : n->typeName = $3;
7800 bruce@momjian.us 11595 : 84 : n->def = $5;
702 peter@eisentraut.org 11596 : 84 : $$ = (Node *) n;
11597 : : }
11598 : : /* ALTER DOMAIN <domain> DROP CONSTRAINT <name> [RESTRICT|CASCADE] */
11599 : : | ALTER DOMAIN_P any_name DROP CONSTRAINT name opt_drop_behavior
11600 : : {
7800 bruce@momjian.us 11601 : 24 : AlterDomainStmt *n = makeNode(AlterDomainStmt);
11602 : :
11603 : 24 : n->subtype = 'X';
5386 peter_e@gmx.net 11604 : 24 : n->typeName = $3;
7800 bruce@momjian.us 11605 : 24 : n->name = $6;
11606 : 24 : n->behavior = $7;
4483 peter_e@gmx.net 11607 : 24 : n->missing_ok = false;
702 peter@eisentraut.org 11608 : 24 : $$ = (Node *) n;
11609 : : }
11610 : : /* ALTER DOMAIN <domain> DROP CONSTRAINT IF EXISTS <name> [RESTRICT|CASCADE] */
11611 : : | ALTER DOMAIN_P any_name DROP CONSTRAINT IF_P EXISTS name opt_drop_behavior
11612 : : {
4483 peter_e@gmx.net 11613 : 3 : AlterDomainStmt *n = makeNode(AlterDomainStmt);
11614 : :
11615 : 3 : n->subtype = 'X';
11616 : 3 : n->typeName = $3;
11617 : 3 : n->name = $8;
11618 : 3 : n->behavior = $9;
11619 : 3 : n->missing_ok = true;
702 peter@eisentraut.org 11620 : 3 : $$ = (Node *) n;
11621 : : }
11622 : : /* ALTER DOMAIN <domain> VALIDATE CONSTRAINT <name> */
11623 : : | ALTER DOMAIN_P any_name VALIDATE CONSTRAINT name
11624 : : {
4701 alvherre@alvh.no-ip. 11625 : 6 : AlterDomainStmt *n = makeNode(AlterDomainStmt);
11626 : :
11627 : 6 : n->subtype = 'V';
11628 : 6 : n->typeName = $3;
11629 : 6 : n->name = $6;
702 peter@eisentraut.org 11630 : 6 : $$ = (Node *) n;
11631 : : }
11632 : : ;
11633 : :
11634 : : opt_as: AS
11635 : : | /* EMPTY */
11636 : : ;
11637 : :
11638 : :
11639 : : /*****************************************************************************
11640 : : *
11641 : : * Manipulate a text search dictionary or configuration
11642 : : *
11643 : : *****************************************************************************/
11644 : :
11645 : : AlterTSDictionaryStmt:
11646 : : ALTER TEXT_P SEARCH DICTIONARY any_name definition
11647 : : {
6081 tgl@sss.pgh.pa.us 11648 : 20 : AlterTSDictionaryStmt *n = makeNode(AlterTSDictionaryStmt);
11649 : :
11650 : 20 : n->dictname = $5;
11651 : 20 : n->options = $6;
702 peter@eisentraut.org 11652 : 20 : $$ = (Node *) n;
11653 : : }
11654 : : ;
11655 : :
11656 : : AlterTSConfigurationStmt:
11657 : : ALTER TEXT_P SEARCH CONFIGURATION any_name ADD_P MAPPING FOR name_list any_with any_name_list
11658 : : {
6081 tgl@sss.pgh.pa.us 11659 : 3191 : AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
11660 : :
3261 alvherre@alvh.no-ip. 11661 : 3191 : n->kind = ALTER_TSCONFIG_ADD_MAPPING;
6081 tgl@sss.pgh.pa.us 11662 : 3191 : n->cfgname = $5;
11663 : 3191 : n->tokentype = $9;
11664 : 3191 : n->dicts = $11;
11665 : 3191 : n->override = false;
11666 : 3191 : n->replace = false;
702 peter@eisentraut.org 11667 : 3191 : $$ = (Node *) n;
11668 : : }
11669 : : | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING FOR name_list any_with any_name_list
11670 : : {
6081 tgl@sss.pgh.pa.us 11671 : 13 : AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
11672 : :
3261 alvherre@alvh.no-ip. 11673 : 13 : n->kind = ALTER_TSCONFIG_ALTER_MAPPING_FOR_TOKEN;
6081 tgl@sss.pgh.pa.us 11674 : 13 : n->cfgname = $5;
11675 : 13 : n->tokentype = $9;
11676 : 13 : n->dicts = $11;
11677 : 13 : n->override = true;
11678 : 13 : n->replace = false;
702 peter@eisentraut.org 11679 : 13 : $$ = (Node *) n;
11680 : : }
11681 : : | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING REPLACE any_name any_with any_name
11682 : : {
6081 tgl@sss.pgh.pa.us 11683 : 9 : AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
11684 : :
3261 alvherre@alvh.no-ip. 11685 : 9 : n->kind = ALTER_TSCONFIG_REPLACE_DICT;
6081 tgl@sss.pgh.pa.us 11686 : 9 : n->cfgname = $5;
11687 : 9 : n->tokentype = NIL;
11688 : 9 : n->dicts = list_make2($9,$11);
11689 : 9 : n->override = false;
11690 : 9 : n->replace = true;
702 peter@eisentraut.org 11691 : 9 : $$ = (Node *) n;
11692 : : }
11693 : : | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING FOR name_list REPLACE any_name any_with any_name
11694 : : {
6081 tgl@sss.pgh.pa.us 11695 :UBC 0 : AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
11696 : :
3261 alvherre@alvh.no-ip. 11697 : 0 : n->kind = ALTER_TSCONFIG_REPLACE_DICT_FOR_TOKEN;
6081 tgl@sss.pgh.pa.us 11698 : 0 : n->cfgname = $5;
11699 : 0 : n->tokentype = $9;
11700 : 0 : n->dicts = list_make2($11,$13);
11701 : 0 : n->override = false;
11702 : 0 : n->replace = true;
702 peter@eisentraut.org 11703 : 0 : $$ = (Node *) n;
11704 : : }
11705 : : | ALTER TEXT_P SEARCH CONFIGURATION any_name DROP MAPPING FOR name_list
11706 : : {
6081 tgl@sss.pgh.pa.us 11707 :CBC 9 : AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
11708 : :
3261 alvherre@alvh.no-ip. 11709 : 9 : n->kind = ALTER_TSCONFIG_DROP_MAPPING;
6081 tgl@sss.pgh.pa.us 11710 : 9 : n->cfgname = $5;
11711 : 9 : n->tokentype = $9;
11712 : 9 : n->missing_ok = false;
702 peter@eisentraut.org 11713 : 9 : $$ = (Node *) n;
11714 : : }
11715 : : | ALTER TEXT_P SEARCH CONFIGURATION any_name DROP MAPPING IF_P EXISTS FOR name_list
11716 : : {
6081 tgl@sss.pgh.pa.us 11717 : 6 : AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
11718 : :
3261 alvherre@alvh.no-ip. 11719 : 6 : n->kind = ALTER_TSCONFIG_DROP_MAPPING;
6081 tgl@sss.pgh.pa.us 11720 : 6 : n->cfgname = $5;
11721 : 6 : n->tokentype = $11;
11722 : 6 : n->missing_ok = true;
702 peter@eisentraut.org 11723 : 6 : $$ = (Node *) n;
11724 : : }
11725 : : ;
11726 : :
11727 : : /* Use this if TIME or ORDINALITY after WITH should be taken as an identifier */
11728 : : any_with: WITH
11729 : : | WITH_LA
11730 : : ;
11731 : :
11732 : :
11733 : : /*****************************************************************************
11734 : : *
11735 : : * Manipulate a conversion
11736 : : *
11737 : : * CREATE [DEFAULT] CONVERSION <conversion_name>
11738 : : * FOR <encoding_name> TO <encoding_name> FROM <func_name>
11739 : : *
11740 : : *****************************************************************************/
11741 : :
11742 : : CreateConversionStmt:
11743 : : CREATE opt_default CONVERSION_P any_name FOR Sconst
11744 : : TO Sconst FROM any_name
11745 : : {
4548 peter_e@gmx.net 11746 : 32 : CreateConversionStmt *n = makeNode(CreateConversionStmt);
11747 : :
11748 : 32 : n->conversion_name = $4;
11749 : 32 : n->for_encoding_name = $6;
11750 : 32 : n->to_encoding_name = $8;
11751 : 32 : n->func_name = $10;
11752 : 32 : n->def = $2;
702 peter@eisentraut.org 11753 : 32 : $$ = (Node *) n;
11754 : : }
11755 : : ;
11756 : :
11757 : : /*****************************************************************************
11758 : : *
11759 : : * QUERY:
11760 : : * CLUSTER (options) [ <qualified_name> [ USING <index_name> ] ]
11761 : : * CLUSTER [VERBOSE] [ <qualified_name> [ USING <index_name> ] ]
11762 : : * CLUSTER [VERBOSE] <index_name> ON <qualified_name> (for pre-8.3)
11763 : : *
11764 : : *****************************************************************************/
11765 : :
11766 : : ClusterStmt:
11767 : : CLUSTER '(' utility_option_list ')' qualified_name cluster_index_specification
11768 : : {
4548 peter_e@gmx.net 11769 :UNC 0 : ClusterStmt *n = makeNode(ClusterStmt);
11770 : :
270 nathan@postgresql.or 11771 : 0 : n->relation = $5;
11772 : 0 : n->indexname = $6;
11773 : 0 : n->params = $3;
702 peter@eisentraut.org 11774 : 0 : $$ = (Node *) n;
11775 : : }
11776 : : | CLUSTER '(' utility_option_list ')'
11777 : : {
270 nathan@postgresql.or 11778 : 0 : ClusterStmt *n = makeNode(ClusterStmt);
11779 : :
11780 : 0 : n->relation = NULL;
11781 : 0 : n->indexname = NULL;
11782 : 0 : n->params = $3;
11783 : 0 : $$ = (Node *) n;
11784 : : }
11785 : : /* unparenthesized VERBOSE kept for pre-14 compatibility */
11786 : : | CLUSTER opt_verbose qualified_name cluster_index_specification
11787 : : {
1228 michael@paquier.xyz 11788 :CBC 96 : ClusterStmt *n = makeNode(ClusterStmt);
11789 : :
270 nathan@postgresql.or 11790 : 96 : n->relation = $3;
11791 : 96 : n->indexname = $4;
11792 : 96 : n->params = NIL;
11793 [ - + ]: 96 : if ($2)
270 nathan@postgresql.or 11794 :UBC 0 : n->params = lappend(n->params, makeDefElem("verbose", NULL, @2));
702 peter@eisentraut.org 11795 :CBC 96 : $$ = (Node *) n;
11796 : : }
11797 : : /* unparenthesized VERBOSE kept for pre-17 compatibility */
11798 : : | CLUSTER opt_verbose
11799 : : {
4548 peter_e@gmx.net 11800 : 16 : ClusterStmt *n = makeNode(ClusterStmt);
11801 : :
11802 : 16 : n->relation = NULL;
11803 : 16 : n->indexname = NULL;
1228 michael@paquier.xyz 11804 : 16 : n->params = NIL;
2091 11805 [ + + ]: 16 : if ($2)
1228 11806 : 8 : n->params = lappend(n->params, makeDefElem("verbose", NULL, @2));
702 peter@eisentraut.org 11807 : 16 : $$ = (Node *) n;
11808 : : }
11809 : : /* kept for pre-8.3 compatibility */
11810 : : | CLUSTER opt_verbose name ON qualified_name
11811 : : {
4548 peter_e@gmx.net 11812 : 9 : ClusterStmt *n = makeNode(ClusterStmt);
11813 : :
11814 : 9 : n->relation = $5;
11815 : 9 : n->indexname = $3;
1228 michael@paquier.xyz 11816 : 9 : n->params = NIL;
2091 11817 [ - + ]: 9 : if ($2)
1228 michael@paquier.xyz 11818 :UBC 0 : n->params = lappend(n->params, makeDefElem("verbose", NULL, @2));
702 peter@eisentraut.org 11819 :CBC 9 : $$ = (Node *) n;
11820 : : }
11821 : : ;
11822 : :
11823 : : cluster_index_specification:
1404 11824 : 78 : USING name { $$ = $2; }
6216 bruce@momjian.us 11825 : 18 : | /*EMPTY*/ { $$ = NULL; }
11826 : : ;
11827 : :
11828 : :
11829 : : /*****************************************************************************
11830 : : *
11831 : : * QUERY:
11832 : : * VACUUM
11833 : : * ANALYZE
11834 : : *
11835 : : *****************************************************************************/
11836 : :
11837 : : VacuumStmt: VACUUM opt_full opt_freeze opt_verbose opt_analyze opt_vacuum_relation_list
11838 : : {
9715 11839 : 531 : VacuumStmt *n = makeNode(VacuumStmt);
11840 : :
1854 rhaas@postgresql.org 11841 : 531 : n->options = NIL;
5263 tgl@sss.pgh.pa.us 11842 [ + + ]: 531 : if ($2)
1854 rhaas@postgresql.org 11843 : 58 : n->options = lappend(n->options,
11844 : 58 : makeDefElem("full", NULL, @2));
3315 alvherre@alvh.no-ip. 11845 [ + + ]: 531 : if ($3)
1854 rhaas@postgresql.org 11846 : 70 : n->options = lappend(n->options,
11847 : 70 : makeDefElem("freeze", NULL, @3));
5263 tgl@sss.pgh.pa.us 11848 [ + + ]: 531 : if ($4)
1854 rhaas@postgresql.org 11849 : 9 : n->options = lappend(n->options,
11850 : 9 : makeDefElem("verbose", NULL, @4));
2287 11851 [ + + ]: 531 : if ($5)
1854 11852 : 139 : n->options = lappend(n->options,
11853 : 139 : makeDefElem("analyze", NULL, @5));
2287 11854 : 531 : n->rels = $6;
1854 11855 : 531 : n->is_vacuumcmd = true;
702 peter@eisentraut.org 11856 : 531 : $$ = (Node *) n;
11857 : : }
11858 : : | VACUUM '(' utility_option_list ')' opt_vacuum_relation_list
11859 : : {
5263 tgl@sss.pgh.pa.us 11860 : 2477 : VacuumStmt *n = makeNode(VacuumStmt);
11861 : :
1854 rhaas@postgresql.org 11862 : 2477 : n->options = $3;
2385 tgl@sss.pgh.pa.us 11863 : 2477 : n->rels = $5;
1854 rhaas@postgresql.org 11864 : 2477 : n->is_vacuumcmd = true;
5263 tgl@sss.pgh.pa.us 11865 : 2477 : $$ = (Node *) n;
11866 : : }
11867 : : ;
11868 : :
11869 : : AnalyzeStmt: analyze_keyword opt_verbose opt_vacuum_relation_list
11870 : : {
8378 11871 : 2128 : VacuumStmt *n = makeNode(VacuumStmt);
11872 : :
1854 rhaas@postgresql.org 11873 : 2128 : n->options = NIL;
5263 tgl@sss.pgh.pa.us 11874 [ - + ]: 2128 : if ($2)
1854 rhaas@postgresql.org 11875 :UBC 0 : n->options = lappend(n->options,
11876 : 0 : makeDefElem("verbose", NULL, @2));
2385 tgl@sss.pgh.pa.us 11877 :CBC 2128 : n->rels = $3;
1854 rhaas@postgresql.org 11878 : 2128 : n->is_vacuumcmd = false;
702 peter@eisentraut.org 11879 : 2128 : $$ = (Node *) n;
11880 : : }
11881 : : | analyze_keyword '(' utility_option_list ')' opt_vacuum_relation_list
11882 : : {
2232 andres@anarazel.de 11883 : 93 : VacuumStmt *n = makeNode(VacuumStmt);
11884 : :
1854 rhaas@postgresql.org 11885 : 93 : n->options = $3;
2232 andres@anarazel.de 11886 : 93 : n->rels = $5;
1854 rhaas@postgresql.org 11887 : 93 : n->is_vacuumcmd = false;
2232 andres@anarazel.de 11888 : 93 : $$ = (Node *) n;
11889 : : }
11890 : : ;
11891 : :
11892 : : utility_option_list:
11893 : : utility_option_elem
11894 : : {
1854 rhaas@postgresql.org 11895 : 8768 : $$ = list_make1($1);
11896 : : }
11897 : : | utility_option_list ',' utility_option_elem
11898 : : {
11899 : 4068 : $$ = lappend($1, $3);
11900 : : }
11901 : : ;
11902 : :
11903 : : analyze_keyword:
11904 : : ANALYZE
11905 : : | ANALYSE /* British */
11906 : : ;
11907 : :
11908 : : utility_option_elem:
11909 : : utility_option_name utility_option_arg
11910 : : {
1843 11911 : 12836 : $$ = makeDefElem($1, $2, @1);
11912 : : }
11913 : : ;
11914 : :
11915 : : utility_option_name:
1854 11916 : 11709 : NonReservedWord { $$ = $1; }
11917 : 1056 : | analyze_keyword { $$ = "analyze"; }
382 alvherre@alvh.no-ip. 11918 : 74 : | FORMAT_LA { $$ = "format"; }
11919 : : ;
11920 : :
11921 : : utility_option_arg:
1843 rhaas@postgresql.org 11922 : 7290 : opt_boolean_or_string { $$ = (Node *) makeString($1); }
1250 peter@eisentraut.org 11923 : 184 : | NumericOnly { $$ = (Node *) $1; }
11924 : 5362 : | /* EMPTY */ { $$ = NULL; }
11925 : : ;
11926 : :
11927 : : opt_analyze:
2287 rhaas@postgresql.org 11928 : 139 : analyze_keyword { $$ = true; }
11929 : 392 : | /*EMPTY*/ { $$ = false; }
11930 : : ;
11931 : :
11932 : : opt_verbose:
2433 peter_e@gmx.net 11933 : 17 : VERBOSE { $$ = true; }
11934 : 3909 : | /*EMPTY*/ { $$ = false; }
11935 : : ;
11936 : :
11937 : 58 : opt_full: FULL { $$ = true; }
11938 : 473 : | /*EMPTY*/ { $$ = false; }
11939 : : ;
11940 : :
11941 : 70 : opt_freeze: FREEZE { $$ = true; }
11942 : 461 : | /*EMPTY*/ { $$ = false; }
11943 : : ;
11944 : :
11945 : : opt_name_list:
7972 bruce@momjian.us 11946 : 1229 : '(' name_list ')' { $$ = $2; }
11947 : 6183 : | /*EMPTY*/ { $$ = NIL; }
11948 : : ;
11949 : :
11950 : : vacuum_relation:
11951 : : qualified_name opt_name_list
11952 : : {
2385 tgl@sss.pgh.pa.us 11953 : 5158 : $$ = (Node *) makeVacuumRelation($1, InvalidOid, $2);
11954 : : }
11955 : : ;
11956 : :
11957 : : vacuum_relation_list:
11958 : : vacuum_relation
11959 : 5084 : { $$ = list_make1($1); }
11960 : : | vacuum_relation_list ',' vacuum_relation
11961 : 74 : { $$ = lappend($1, $3); }
11962 : : ;
11963 : :
11964 : : opt_vacuum_relation_list:
11965 : 5084 : vacuum_relation_list { $$ = $1; }
11966 : 145 : | /*EMPTY*/ { $$ = NIL; }
11967 : : ;
11968 : :
11969 : :
11970 : : /*****************************************************************************
11971 : : *
11972 : : * QUERY:
11973 : : * EXPLAIN [ANALYZE] [VERBOSE] query
11974 : : * EXPLAIN ( options ) query
11975 : : *
11976 : : *****************************************************************************/
11977 : :
11978 : : ExplainStmt:
11979 : : EXPLAIN ExplainableStmt
11980 : : {
5376 11981 : 3817 : ExplainStmt *n = makeNode(ExplainStmt);
11982 : :
11983 : 3817 : n->query = $2;
11984 : 3817 : n->options = NIL;
11985 : 3817 : $$ = (Node *) n;
11986 : : }
11987 : : | EXPLAIN analyze_keyword opt_verbose ExplainableStmt
11988 : : {
8244 11989 : 1146 : ExplainStmt *n = makeNode(ExplainStmt);
11990 : :
6242 11991 : 1146 : n->query = $4;
2777 peter_e@gmx.net 11992 : 1146 : n->options = list_make1(makeDefElem("analyze", NULL, @2));
5376 tgl@sss.pgh.pa.us 11993 [ - + ]: 1146 : if ($3)
5376 tgl@sss.pgh.pa.us 11994 :UBC 0 : n->options = lappend(n->options,
2777 peter_e@gmx.net 11995 : 0 : makeDefElem("verbose", NULL, @3));
5376 tgl@sss.pgh.pa.us 11996 :CBC 1146 : $$ = (Node *) n;
11997 : : }
11998 : : | EXPLAIN VERBOSE ExplainableStmt
11999 : : {
5376 tgl@sss.pgh.pa.us 12000 :UBC 0 : ExplainStmt *n = makeNode(ExplainStmt);
12001 : :
12002 : 0 : n->query = $3;
2777 peter_e@gmx.net 12003 : 0 : n->options = list_make1(makeDefElem("verbose", NULL, @2));
5376 tgl@sss.pgh.pa.us 12004 : 0 : $$ = (Node *) n;
12005 : : }
12006 : : | EXPLAIN '(' utility_option_list ')' ExplainableStmt
12007 : : {
5376 tgl@sss.pgh.pa.us 12008 :CBC 6120 : ExplainStmt *n = makeNode(ExplainStmt);
12009 : :
12010 : 6120 : n->query = $5;
12011 : 6120 : n->options = $3;
12012 : 6120 : $$ = (Node *) n;
12013 : : }
12014 : : ;
12015 : :
12016 : : ExplainableStmt:
12017 : : SelectStmt
12018 : : | InsertStmt
12019 : : | UpdateStmt
12020 : : | DeleteStmt
12021 : : | MergeStmt
12022 : : | DeclareCursorStmt
12023 : : | CreateAsStmt
12024 : : | CreateMatViewStmt
12025 : : | RefreshMatViewStmt
12026 : : | ExecuteStmt /* by default all are $$=$1 */
12027 : : ;
12028 : :
12029 : : /*****************************************************************************
12030 : : *
12031 : : * QUERY:
12032 : : * PREPARE <plan_name> [(args, ...)] AS <query>
12033 : : *
12034 : : *****************************************************************************/
12035 : :
12036 : : PrepareStmt: PREPARE name prep_type_clause AS PreparableStmt
12037 : : {
7901 12038 : 862 : PrepareStmt *n = makeNode(PrepareStmt);
12039 : :
12040 : 862 : n->name = $2;
12041 : 862 : n->argtypes = $3;
6242 12042 : 862 : n->query = $5;
7901 12043 : 862 : $$ = (Node *) n;
12044 : : }
12045 : : ;
12046 : :
6291 12047 : 727 : prep_type_clause: '(' type_list ')' { $$ = $2; }
7901 12048 : 138 : | /* EMPTY */ { $$ = NIL; }
12049 : : ;
12050 : :
12051 : : PreparableStmt:
12052 : : SelectStmt
12053 : : | InsertStmt
12054 : : | UpdateStmt
12055 : : | DeleteStmt
12056 : : | MergeStmt /* by default all are $$=$1 */
12057 : : ;
12058 : :
12059 : : /*****************************************************************************
12060 : : *
12061 : : * EXECUTE <plan_name> [(params, ...)]
12062 : : * CREATE TABLE <name> AS EXECUTE <plan_name> [(params, ...)]
12063 : : *
12064 : : *****************************************************************************/
12065 : :
12066 : : ExecuteStmt: EXECUTE name execute_param_clause
12067 : : {
12068 : 5925 : ExecuteStmt *n = makeNode(ExecuteStmt);
12069 : :
12070 : 5925 : n->name = $2;
12071 : 5925 : n->params = $3;
7593 peter_e@gmx.net 12072 : 5925 : $$ = (Node *) n;
12073 : : }
12074 : : | CREATE OptTemp TABLE create_as_target AS
12075 : : EXECUTE name execute_param_clause opt_with_data
12076 : : {
4409 tgl@sss.pgh.pa.us 12077 : 36 : CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt);
7593 peter_e@gmx.net 12078 : 36 : ExecuteStmt *n = makeNode(ExecuteStmt);
12079 : :
6263 tgl@sss.pgh.pa.us 12080 : 36 : n->name = $7;
12081 : 36 : n->params = $8;
4409 12082 : 36 : ctas->query = (Node *) n;
12083 : 36 : ctas->into = $4;
1373 michael@paquier.xyz 12084 : 36 : ctas->objtype = OBJECT_TABLE;
4409 tgl@sss.pgh.pa.us 12085 : 36 : ctas->is_select_into = false;
1885 michael@paquier.xyz 12086 : 36 : ctas->if_not_exists = false;
12087 : : /* cram additional flags into the IntoClause */
4525 tgl@sss.pgh.pa.us 12088 : 36 : $4->rel->relpersistence = $2;
12089 : 36 : $4->skipData = !($9);
4409 12090 : 36 : $$ = (Node *) ctas;
12091 : : }
12092 : : | CREATE OptTemp TABLE IF_P NOT EXISTS create_as_target AS
12093 : : EXECUTE name execute_param_clause opt_with_data
12094 : : {
1885 michael@paquier.xyz 12095 : 6 : CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt);
12096 : 6 : ExecuteStmt *n = makeNode(ExecuteStmt);
12097 : :
12098 : 6 : n->name = $10;
12099 : 6 : n->params = $11;
12100 : 6 : ctas->query = (Node *) n;
12101 : 6 : ctas->into = $7;
1373 12102 : 6 : ctas->objtype = OBJECT_TABLE;
1885 12103 : 6 : ctas->is_select_into = false;
12104 : 6 : ctas->if_not_exists = true;
12105 : : /* cram additional flags into the IntoClause */
12106 : 6 : $7->rel->relpersistence = $2;
12107 : 6 : $7->skipData = !($12);
12108 : 6 : $$ = (Node *) ctas;
12109 : : }
12110 : : ;
12111 : :
7834 tgl@sss.pgh.pa.us 12112 : 5428 : execute_param_clause: '(' expr_list ')' { $$ = $2; }
7901 12113 : 539 : | /* EMPTY */ { $$ = NIL; }
12114 : : ;
12115 : :
12116 : : /*****************************************************************************
12117 : : *
12118 : : * QUERY:
12119 : : * DEALLOCATE [PREPARE] <plan_name>
12120 : : *
12121 : : *****************************************************************************/
12122 : :
12123 : : DeallocateStmt: DEALLOCATE name
12124 : : {
12125 : 1124 : DeallocateStmt *n = makeNode(DeallocateStmt);
12126 : :
12127 : 1124 : n->name = $2;
231 michael@paquier.xyz 12128 :GNC 1124 : n->isall = false;
12129 : 1124 : n->location = @2;
7901 tgl@sss.pgh.pa.us 12130 :CBC 1124 : $$ = (Node *) n;
12131 : : }
12132 : : | DEALLOCATE PREPARE name
12133 : : {
12134 : 10 : DeallocateStmt *n = makeNode(DeallocateStmt);
12135 : :
12136 : 10 : n->name = $3;
231 michael@paquier.xyz 12137 :GNC 10 : n->isall = false;
12138 : 10 : n->location = @3;
7901 tgl@sss.pgh.pa.us 12139 :CBC 10 : $$ = (Node *) n;
12140 : : }
12141 : : | DEALLOCATE ALL
12142 : : {
6212 neilc@samurai.com 12143 : 24 : DeallocateStmt *n = makeNode(DeallocateStmt);
12144 : :
12145 : 24 : n->name = NULL;
231 michael@paquier.xyz 12146 :GNC 24 : n->isall = true;
12147 : 24 : n->location = -1;
6212 neilc@samurai.com 12148 :CBC 24 : $$ = (Node *) n;
12149 : : }
12150 : : | DEALLOCATE PREPARE ALL
12151 : : {
6212 neilc@samurai.com 12152 :GBC 1 : DeallocateStmt *n = makeNode(DeallocateStmt);
12153 : :
12154 : 1 : n->name = NULL;
231 michael@paquier.xyz 12155 :GNC 1 : n->isall = true;
12156 : 1 : n->location = -1;
6212 neilc@samurai.com 12157 :GBC 1 : $$ = (Node *) n;
12158 : : }
12159 : : ;
12160 : :
12161 : : /*****************************************************************************
12162 : : *
12163 : : * QUERY:
12164 : : * INSERT STATEMENTS
12165 : : *
12166 : : *****************************************************************************/
12167 : :
12168 : : InsertStmt:
12169 : : opt_with_clause INSERT INTO insert_target insert_rest
12170 : : opt_on_conflict returning_clause
12171 : : {
4930 tgl@sss.pgh.pa.us 12172 :CBC 35039 : $5->relation = $4;
3264 andres@anarazel.de 12173 : 35039 : $5->onConflictClause = $6;
12174 : 35039 : $5->returningList = $7;
4930 tgl@sss.pgh.pa.us 12175 : 35039 : $5->withClause = $1;
12176 : 35039 : $$ = (Node *) $5;
12177 : : }
12178 : : ;
12179 : :
12180 : : /*
12181 : : * Can't easily make AS optional here, because VALUES in insert_rest would
12182 : : * have a shift/reduce conflict with VALUES as an optional alias. We could
12183 : : * easily allow unreserved_keywords as optional aliases, but that'd be an odd
12184 : : * divergence from other places. So just require AS for now.
12185 : : */
12186 : : insert_target:
12187 : : qualified_name
12188 : : {
3264 andres@anarazel.de 12189 : 34976 : $$ = $1;
12190 : : }
12191 : : | qualified_name AS ColId
12192 : : {
12193 : 63 : $1->alias = makeAlias($3, NIL);
12194 : 63 : $$ = $1;
12195 : : }
12196 : : ;
12197 : :
12198 : : insert_rest:
12199 : : SelectStmt
12200 : : {
9592 bruce@momjian.us 12201 : 23516 : $$ = makeNode(InsertStmt);
9035 tgl@sss.pgh.pa.us 12202 : 23516 : $$->cols = NIL;
8592 12203 : 23516 : $$->selectStmt = $1;
12204 : : }
12205 : : | OVERRIDING override_kind VALUE_P SelectStmt
12206 : : {
2565 peter_e@gmx.net 12207 : 48 : $$ = makeNode(InsertStmt);
12208 : 48 : $$->cols = NIL;
12209 : 48 : $$->override = $2;
12210 : 48 : $$->selectStmt = $4;
12211 : : }
12212 : : | '(' insert_column_list ')' SelectStmt
12213 : : {
9218 bruce@momjian.us 12214 : 6091 : $$ = makeNode(InsertStmt);
12215 : 6091 : $$->cols = $2;
6465 mail@joeconway.com 12216 : 6091 : $$->selectStmt = $4;
12217 : : }
12218 : : | '(' insert_column_list ')' OVERRIDING override_kind VALUE_P SelectStmt
12219 : : {
2565 peter_e@gmx.net 12220 :UBC 0 : $$ = makeNode(InsertStmt);
12221 : 0 : $$->cols = $2;
12222 : 0 : $$->override = $5;
12223 : 0 : $$->selectStmt = $7;
12224 : : }
12225 : : | DEFAULT VALUES
12226 : : {
9218 bruce@momjian.us 12227 :CBC 5384 : $$ = makeNode(InsertStmt);
6465 mail@joeconway.com 12228 : 5384 : $$->cols = NIL;
12229 : 5384 : $$->selectStmt = NULL;
12230 : : }
12231 : : ;
12232 : :
12233 : : override_kind:
2565 peter_e@gmx.net 12234 : 33 : USER { $$ = OVERRIDING_USER_VALUE; }
12235 : 30 : | SYSTEM_P { $$ = OVERRIDING_SYSTEM_VALUE; }
12236 : : ;
12237 : :
12238 : : insert_column_list:
12239 : : insert_column_item
7249 tgl@sss.pgh.pa.us 12240 : 6232 : { $$ = list_make1($1); }
12241 : : | insert_column_list ',' insert_column_item
7971 bruce@momjian.us 12242 : 6957 : { $$ = lappend($1, $3); }
12243 : : ;
12244 : :
12245 : : insert_column_item:
12246 : : ColId opt_indirection
12247 : : {
7249 tgl@sss.pgh.pa.us 12248 : 13189 : $$ = makeNode(ResTarget);
12249 : 13189 : $$->name = $1;
5389 12250 : 13189 : $$->indirection = check_indirection($2, yyscanner);
7249 12251 : 13189 : $$->val = NULL;
6597 12252 : 13189 : $$->location = @1;
12253 : : }
12254 : : ;
12255 : :
12256 : : opt_on_conflict:
12257 : : ON CONFLICT opt_conf_expr DO UPDATE SET set_clause_list where_clause
12258 : : {
3264 andres@anarazel.de 12259 : 575 : $$ = makeNode(OnConflictClause);
12260 : 575 : $$->action = ONCONFLICT_UPDATE;
12261 : 575 : $$->infer = $3;
12262 : 575 : $$->targetList = $7;
12263 : 575 : $$->whereClause = $8;
12264 : 575 : $$->location = @1;
12265 : : }
12266 : : |
12267 : : ON CONFLICT opt_conf_expr DO NOTHING
12268 : : {
12269 : 161 : $$ = makeNode(OnConflictClause);
12270 : 161 : $$->action = ONCONFLICT_NOTHING;
12271 : 161 : $$->infer = $3;
12272 : 161 : $$->targetList = NIL;
12273 : 161 : $$->whereClause = NULL;
12274 : 161 : $$->location = @1;
12275 : : }
12276 : : | /*EMPTY*/
12277 : : {
12278 : 34303 : $$ = NULL;
12279 : : }
12280 : : ;
12281 : :
12282 : : opt_conf_expr:
12283 : : '(' index_params ')' where_clause
12284 : : {
12285 : 631 : $$ = makeNode(InferClause);
12286 : 631 : $$->indexElems = $2;
12287 : 631 : $$->whereClause = $4;
12288 : 631 : $$->conname = NULL;
12289 : 631 : $$->location = @1;
12290 : : }
12291 : : |
12292 : : ON CONSTRAINT name
12293 : : {
12294 : 24 : $$ = makeNode(InferClause);
12295 : 24 : $$->indexElems = NIL;
12296 : 24 : $$->whereClause = NULL;
12297 : 24 : $$->conname = $3;
12298 : 24 : $$->location = @1;
12299 : : }
12300 : : | /*EMPTY*/
12301 : : {
12302 : 81 : $$ = NULL;
12303 : : }
12304 : : ;
12305 : :
12306 : : returning_clause:
6455 tgl@sss.pgh.pa.us 12307 : 1347 : RETURNING target_list { $$ = $2; }
12308 : 43629 : | /* EMPTY */ { $$ = NIL; }
12309 : : ;
12310 : :
12311 : :
12312 : : /*****************************************************************************
12313 : : *
12314 : : * QUERY:
12315 : : * DELETE STATEMENTS
12316 : : *
12317 : : *****************************************************************************/
12318 : :
12319 : : DeleteStmt: opt_with_clause DELETE_P FROM relation_expr_opt_alias
12320 : : using_clause where_or_current_clause returning_clause
12321 : : {
9715 bruce@momjian.us 12322 : 2254 : DeleteStmt *n = makeNode(DeleteStmt);
12323 : :
4930 tgl@sss.pgh.pa.us 12324 : 2254 : n->relation = $4;
12325 : 2254 : n->usingClause = $5;
12326 : 2254 : n->whereClause = $6;
12327 : 2254 : n->returningList = $7;
12328 : 2254 : n->withClause = $1;
702 peter@eisentraut.org 12329 : 2254 : $$ = (Node *) n;
12330 : : }
12331 : : ;
12332 : :
12333 : : using_clause:
4548 peter_e@gmx.net 12334 : 54 : USING from_list { $$ = $2; }
6947 neilc@samurai.com 12335 : 2200 : | /*EMPTY*/ { $$ = NIL; }
12336 : : ;
12337 : :
12338 : :
12339 : : /*****************************************************************************
12340 : : *
12341 : : * QUERY:
12342 : : * LOCK TABLE
12343 : : *
12344 : : *****************************************************************************/
12345 : :
12346 : : LockStmt: LOCK_P opt_table relation_expr_list opt_lock opt_nowait
12347 : : {
702 peter@eisentraut.org 12348 : 574 : LockStmt *n = makeNode(LockStmt);
12349 : :
8060 tgl@sss.pgh.pa.us 12350 : 574 : n->relations = $3;
9099 bruce@momjian.us 12351 : 574 : n->mode = $4;
7339 ishii@postgresql.org 12352 : 574 : n->nowait = $5;
702 peter@eisentraut.org 12353 : 574 : $$ = (Node *) n;
12354 : : }
12355 : : ;
12356 : :
4548 peter_e@gmx.net 12357 : 527 : opt_lock: IN_P lock_type MODE { $$ = $2; }
7971 bruce@momjian.us 12358 : 47 : | /*EMPTY*/ { $$ = AccessExclusiveLock; }
12359 : : ;
12360 : :
12361 : 282 : lock_type: ACCESS SHARE { $$ = AccessShareLock; }
12362 : 7 : | ROW SHARE { $$ = RowShareLock; }
12363 : 44 : | ROW EXCLUSIVE { $$ = RowExclusiveLock; }
12364 : 33 : | SHARE UPDATE EXCLUSIVE { $$ = ShareUpdateExclusiveLock; }
12365 : 40 : | SHARE { $$ = ShareLock; }
12366 : 7 : | SHARE ROW EXCLUSIVE { $$ = ShareRowExclusiveLock; }
12367 : 51 : | EXCLUSIVE { $$ = ExclusiveLock; }
12368 : 63 : | ACCESS EXCLUSIVE { $$ = AccessExclusiveLock; }
12369 : : ;
12370 : :
2433 peter_e@gmx.net 12371 : 173 : opt_nowait: NOWAIT { $$ = true; }
12372 : 416 : | /*EMPTY*/ { $$ = false; }
12373 : : ;
12374 : :
12375 : : opt_nowait_or_skip:
3477 alvherre@alvh.no-ip. 12376 : 25 : NOWAIT { $$ = LockWaitError; }
12377 : 95 : | SKIP LOCKED { $$ = LockWaitSkip; }
12378 : 2459 : | /*EMPTY*/ { $$ = LockWaitBlock; }
12379 : : ;
12380 : :
12381 : :
12382 : : /*****************************************************************************
12383 : : *
12384 : : * QUERY:
12385 : : * UpdateStmt (UPDATE)
12386 : : *
12387 : : *****************************************************************************/
12388 : :
12389 : : UpdateStmt: opt_with_clause UPDATE relation_expr_opt_alias
12390 : : SET set_clause_list
12391 : : from_clause
12392 : : where_or_current_clause
12393 : : returning_clause
12394 : : {
6434 bruce@momjian.us 12395 : 6720 : UpdateStmt *n = makeNode(UpdateStmt);
12396 : :
4930 tgl@sss.pgh.pa.us 12397 : 6720 : n->relation = $3;
12398 : 6720 : n->targetList = $5;
12399 : 6720 : n->fromClause = $6;
12400 : 6720 : n->whereClause = $7;
12401 : 6720 : n->returningList = $8;
12402 : 6720 : n->withClause = $1;
702 peter@eisentraut.org 12403 : 6720 : $$ = (Node *) n;
12404 : : }
12405 : : ;
12406 : :
12407 : : set_clause_list:
6433 tgl@sss.pgh.pa.us 12408 : 8046 : set_clause { $$ = $1; }
12409 : 1852 : | set_clause_list ',' set_clause { $$ = list_concat($1,$3); }
12410 : : ;
12411 : :
12412 : : set_clause:
12413 : : set_target '=' a_expr
12414 : : {
2700 12415 : 9807 : $1->val = (Node *) $3;
12416 : 9807 : $$ = list_make1($1);
12417 : : }
12418 : : | '(' set_target_list ')' '=' a_expr
12419 : : {
702 peter@eisentraut.org 12420 : 91 : int ncolumns = list_length($2);
12421 : 91 : int i = 1;
12422 : : ListCell *col_cell;
12423 : :
12424 : : /* Create a MultiAssignRef source for each target */
3588 tgl@sss.pgh.pa.us 12425 [ + - + + : 281 : foreach(col_cell, $2)
+ + ]
12426 : : {
702 peter@eisentraut.org 12427 : 190 : ResTarget *res_col = (ResTarget *) lfirst(col_cell);
3588 tgl@sss.pgh.pa.us 12428 : 190 : MultiAssignRef *r = makeNode(MultiAssignRef);
12429 : :
2700 12430 : 190 : r->source = (Node *) $5;
3588 12431 : 190 : r->colno = i;
12432 : 190 : r->ncolumns = ncolumns;
12433 : 190 : res_col->val = (Node *) r;
12434 : 190 : i++;
12435 : : }
12436 : :
6433 12437 : 91 : $$ = $2;
12438 : : }
12439 : : ;
12440 : :
12441 : : set_target:
12442 : : ColId opt_indirection
12443 : : {
12444 : 10000 : $$ = makeNode(ResTarget);
12445 : 10000 : $$->name = $1;
5389 12446 : 10000 : $$->indirection = check_indirection($2, yyscanner);
6433 12447 : 10000 : $$->val = NULL; /* upper production sets this */
12448 : 10000 : $$->location = @1;
12449 : : }
12450 : : ;
12451 : :
12452 : : set_target_list:
12453 : 94 : set_target { $$ = list_make1($1); }
12454 : 99 : | set_target_list ',' set_target { $$ = lappend($1,$3); }
12455 : : ;
12456 : :
12457 : :
12458 : : /*****************************************************************************
12459 : : *
12460 : : * QUERY:
12461 : : * MERGE
12462 : : *
12463 : : *****************************************************************************/
12464 : :
12465 : : MergeStmt:
12466 : : opt_with_clause MERGE INTO relation_expr_opt_alias
12467 : : USING table_ref
12468 : : ON a_expr
12469 : : merge_when_list
12470 : : returning_clause
12471 : : {
702 peter@eisentraut.org 12472 : 963 : MergeStmt *m = makeNode(MergeStmt);
12473 : :
748 alvherre@alvh.no-ip. 12474 : 963 : m->withClause = $1;
12475 : 963 : m->relation = $4;
12476 : 963 : m->sourceRelation = $6;
12477 : 963 : m->joinCondition = $8;
12478 : 963 : m->mergeWhenClauses = $9;
28 dean.a.rasheed@gmail 12479 :GNC 963 : m->returningList = $10;
12480 : :
702 peter@eisentraut.org 12481 :CBC 963 : $$ = (Node *) m;
12482 : : }
12483 : : ;
12484 : :
12485 : : merge_when_list:
748 alvherre@alvh.no-ip. 12486 : 963 : merge_when_clause { $$ = list_make1($1); }
12487 : 559 : | merge_when_list merge_when_clause { $$ = lappend($1,$2); }
12488 : : ;
12489 : :
12490 : : /*
12491 : : * A WHEN clause may be WHEN MATCHED, WHEN NOT MATCHED BY SOURCE, or WHEN NOT
12492 : : * MATCHED [BY TARGET]. The first two cases match target tuples, and support
12493 : : * UPDATE/DELETE/DO NOTHING actions. The third case does not match target
12494 : : * tuples, and only supports INSERT/DO NOTHING actions.
12495 : : */
12496 : : merge_when_clause:
12497 : : merge_when_tgt_matched opt_merge_when_condition THEN merge_update
12498 : : {
15 dean.a.rasheed@gmail 12499 :GNC 751 : $4->matchKind = $1;
12500 : 751 : $4->condition = $2;
12501 : :
12502 : 751 : $$ = (Node *) $4;
12503 : : }
12504 : : | merge_when_tgt_matched opt_merge_when_condition THEN merge_delete
12505 : : {
12506 : 235 : $4->matchKind = $1;
12507 : 235 : $4->condition = $2;
12508 : :
12509 : 235 : $$ = (Node *) $4;
12510 : : }
12511 : : | merge_when_tgt_not_matched opt_merge_when_condition THEN merge_insert
12512 : : {
12513 : 506 : $4->matchKind = $1;
12514 : 506 : $4->condition = $2;
12515 : :
12516 : 506 : $$ = (Node *) $4;
12517 : : }
12518 : : | merge_when_tgt_matched opt_merge_when_condition THEN DO NOTHING
12519 : : {
748 alvherre@alvh.no-ip. 12520 :CBC 23 : MergeWhenClause *m = makeNode(MergeWhenClause);
12521 : :
15 dean.a.rasheed@gmail 12522 :GNC 23 : m->matchKind = $1;
748 alvherre@alvh.no-ip. 12523 :CBC 23 : m->commandType = CMD_NOTHING;
15 dean.a.rasheed@gmail 12524 :GNC 23 : m->condition = $2;
12525 : :
702 peter@eisentraut.org 12526 :CBC 23 : $$ = (Node *) m;
12527 : : }
12528 : : | merge_when_tgt_not_matched opt_merge_when_condition THEN DO NOTHING
12529 : : {
748 alvherre@alvh.no-ip. 12530 : 7 : MergeWhenClause *m = makeNode(MergeWhenClause);
12531 : :
15 dean.a.rasheed@gmail 12532 :GNC 7 : m->matchKind = $1;
748 alvherre@alvh.no-ip. 12533 :CBC 7 : m->commandType = CMD_NOTHING;
15 dean.a.rasheed@gmail 12534 :GNC 7 : m->condition = $2;
12535 : :
702 peter@eisentraut.org 12536 :CBC 7 : $$ = (Node *) m;
12537 : : }
12538 : : ;
12539 : :
12540 : : merge_when_tgt_matched:
15 dean.a.rasheed@gmail 12541 :GNC 934 : WHEN MATCHED { $$ = MERGE_WHEN_MATCHED; }
12542 : 84 : | WHEN NOT MATCHED BY SOURCE { $$ = MERGE_WHEN_NOT_MATCHED_BY_SOURCE; }
12543 : : ;
12544 : :
12545 : : merge_when_tgt_not_matched:
12546 : 516 : WHEN NOT MATCHED { $$ = MERGE_WHEN_NOT_MATCHED_BY_TARGET; }
12547 : 9 : | WHEN NOT MATCHED BY TARGET { $$ = MERGE_WHEN_NOT_MATCHED_BY_TARGET; }
12548 : : ;
12549 : :
12550 : : opt_merge_when_condition:
748 alvherre@alvh.no-ip. 12551 :CBC 401 : AND a_expr { $$ = $2; }
12552 : 1142 : | { $$ = NULL; }
12553 : : ;
12554 : :
12555 : : merge_update:
12556 : : UPDATE SET set_clause_list
12557 : : {
12558 : 751 : MergeWhenClause *n = makeNode(MergeWhenClause);
12559 : 751 : n->commandType = CMD_UPDATE;
12560 : 751 : n->override = OVERRIDING_NOT_SET;
12561 : 751 : n->targetList = $3;
12562 : 751 : n->values = NIL;
12563 : :
12564 : 751 : $$ = n;
12565 : : }
12566 : : ;
12567 : :
12568 : : merge_delete:
12569 : : DELETE_P
12570 : : {
12571 : 235 : MergeWhenClause *n = makeNode(MergeWhenClause);
12572 : 235 : n->commandType = CMD_DELETE;
12573 : 235 : n->override = OVERRIDING_NOT_SET;
12574 : 235 : n->targetList = NIL;
12575 : 235 : n->values = NIL;
12576 : :
12577 : 235 : $$ = n;
12578 : : }
12579 : : ;
12580 : :
12581 : : merge_insert:
12582 : : INSERT merge_values_clause
12583 : : {
12584 : 347 : MergeWhenClause *n = makeNode(MergeWhenClause);
12585 : 347 : n->commandType = CMD_INSERT;
12586 : 347 : n->override = OVERRIDING_NOT_SET;
12587 : 347 : n->targetList = NIL;
12588 : 347 : n->values = $2;
12589 : 347 : $$ = n;
12590 : : }
12591 : : | INSERT OVERRIDING override_kind VALUE_P merge_values_clause
12592 : : {
748 alvherre@alvh.no-ip. 12593 :UBC 0 : MergeWhenClause *n = makeNode(MergeWhenClause);
12594 : 0 : n->commandType = CMD_INSERT;
12595 : 0 : n->override = $3;
12596 : 0 : n->targetList = NIL;
12597 : 0 : n->values = $5;
12598 : 0 : $$ = n;
12599 : : }
12600 : : | INSERT '(' insert_column_list ')' merge_values_clause
12601 : : {
748 alvherre@alvh.no-ip. 12602 :CBC 126 : MergeWhenClause *n = makeNode(MergeWhenClause);
12603 : 126 : n->commandType = CMD_INSERT;
12604 : 126 : n->override = OVERRIDING_NOT_SET;
12605 : 126 : n->targetList = $3;
12606 : 126 : n->values = $5;
12607 : 126 : $$ = n;
12608 : : }
12609 : : | INSERT '(' insert_column_list ')' OVERRIDING override_kind VALUE_P merge_values_clause
12610 : : {
12611 : 15 : MergeWhenClause *n = makeNode(MergeWhenClause);
12612 : 15 : n->commandType = CMD_INSERT;
12613 : 15 : n->override = $6;
12614 : 15 : n->targetList = $3;
12615 : 15 : n->values = $8;
12616 : 15 : $$ = n;
12617 : : }
12618 : : | INSERT DEFAULT VALUES
12619 : : {
12620 : 18 : MergeWhenClause *n = makeNode(MergeWhenClause);
12621 : 18 : n->commandType = CMD_INSERT;
12622 : 18 : n->override = OVERRIDING_NOT_SET;
12623 : 18 : n->targetList = NIL;
12624 : 18 : n->values = NIL;
12625 : 18 : $$ = n;
12626 : : }
12627 : : ;
12628 : :
12629 : : merge_values_clause:
12630 : : VALUES '(' expr_list ')'
12631 : : {
12632 : 488 : $$ = $3;
12633 : : }
12634 : : ;
12635 : :
12636 : : /*****************************************************************************
12637 : : *
12638 : : * QUERY:
12639 : : * CURSOR STATEMENTS
12640 : : *
12641 : : *****************************************************************************/
12642 : : DeclareCursorStmt: DECLARE cursor_name cursor_options CURSOR opt_hold FOR SelectStmt
12643 : : {
7706 tgl@sss.pgh.pa.us 12644 : 1323 : DeclareCursorStmt *n = makeNode(DeclareCursorStmt);
12645 : :
9715 bruce@momjian.us 12646 : 1323 : n->portalname = $2;
12647 : : /* currently we always set FAST_PLAN option */
6208 tgl@sss.pgh.pa.us 12648 : 1323 : n->options = $3 | $5 | CURSOR_OPT_FAST_PLAN;
7689 bruce@momjian.us 12649 : 1323 : n->query = $7;
702 peter@eisentraut.org 12650 : 1323 : $$ = (Node *) n;
12651 : : }
12652 : : ;
12653 : :
5268 alvherre@alvh.no-ip. 12654 : 5173 : cursor_name: name { $$ = $1; }
12655 : : ;
12656 : :
7706 tgl@sss.pgh.pa.us 12657 : 1323 : cursor_options: /*EMPTY*/ { $$ = 0; }
7689 bruce@momjian.us 12658 : 12 : | cursor_options NO SCROLL { $$ = $1 | CURSOR_OPT_NO_SCROLL; }
7706 tgl@sss.pgh.pa.us 12659 : 120 : | cursor_options SCROLL { $$ = $1 | CURSOR_OPT_SCROLL; }
7689 bruce@momjian.us 12660 : 5 : | cursor_options BINARY { $$ = $1 | CURSOR_OPT_BINARY; }
1103 peter@eisentraut.org 12661 :UBC 0 : | cursor_options ASENSITIVE { $$ = $1 | CURSOR_OPT_ASENSITIVE; }
7706 tgl@sss.pgh.pa.us 12662 :CBC 3 : | cursor_options INSENSITIVE { $$ = $1 | CURSOR_OPT_INSENSITIVE; }
12663 : : ;
12664 : :
6208 12665 : 1274 : opt_hold: /* EMPTY */ { $$ = 0; }
12666 : 46 : | WITH HOLD { $$ = CURSOR_OPT_HOLD; }
12667 : 3 : | WITHOUT HOLD { $$ = 0; }
12668 : : ;
12669 : :
12670 : : /*****************************************************************************
12671 : : *
12672 : : * QUERY:
12673 : : * SELECT STATEMENTS
12674 : : *
12675 : : *****************************************************************************/
12676 : :
12677 : : /* A complete SELECT statement looks like this.
12678 : : *
12679 : : * The rule returns either a single SelectStmt node or a tree of them,
12680 : : * representing a set-operation tree.
12681 : : *
12682 : : * There is an ambiguity when a sub-SELECT is within an a_expr and there
12683 : : * are excess parentheses: do the parentheses belong to the sub-SELECT or
12684 : : * to the surrounding a_expr? We don't really care, but bison wants to know.
12685 : : * To resolve the ambiguity, we are careful to define the grammar so that
12686 : : * the decision is staved off as long as possible: as long as we can keep
12687 : : * absorbing parentheses into the sub-SELECT, we will do so, and only when
12688 : : * it's no longer possible to do that will we decide that parens belong to
12689 : : * the expression. For example, in "SELECT (((SELECT 2)) + 3)" the extra
12690 : : * parentheses are treated as part of the sub-select. The necessity of doing
12691 : : * it that way is shown by "SELECT (((SELECT 2)) UNION SELECT 2)". Had we
12692 : : * parsed "((SELECT 2))" as an a_expr, it'd be too late to go back to the
12693 : : * SELECT viewpoint when we see the UNION.
12694 : : *
12695 : : * This approach is implemented by defining a nonterminal select_with_parens,
12696 : : * which represents a SELECT with at least one outer layer of parentheses,
12697 : : * and being careful to use select_with_parens, never '(' SelectStmt ')',
12698 : : * in the expression grammar. We will then have shift-reduce conflicts
12699 : : * which we can resolve in favor of always treating '(' <select> ')' as
12700 : : * a select_with_parens. To resolve the conflicts, the productions that
12701 : : * conflict with the select_with_parens productions are manually given
12702 : : * precedences lower than the precedence of ')', thereby ensuring that we
12703 : : * shift ')' (and then reduce to select_with_parens) rather than trying to
12704 : : * reduce the inner <select> nonterminal to something else. We use UMINUS
12705 : : * precedence for this, which is a fairly arbitrary choice.
12706 : : *
12707 : : * To be able to define select_with_parens itself without ambiguity, we need
12708 : : * a nonterminal select_no_parens that represents a SELECT structure with no
12709 : : * outermost parentheses. This is a little bit tedious, but it works.
12710 : : *
12711 : : * In non-expression contexts, we use SelectStmt which can represent a SELECT
12712 : : * with or without outer parentheses.
12713 : : */
12714 : :
12715 : : SelectStmt: select_no_parens %prec UMINUS
12716 : : | select_with_parens %prec UMINUS
12717 : : ;
12718 : :
12719 : : select_with_parens:
7972 bruce@momjian.us 12720 : 26496 : '(' select_no_parens ')' { $$ = $2; }
12721 : 75 : | '(' select_with_parens ')' { $$ = $2; }
12722 : : ;
12723 : :
12724 : : /*
12725 : : * This rule parses the equivalent of the standard's <query expression>.
12726 : : * The duplicative productions are annoying, but hard to get rid of without
12727 : : * creating shift/reduce conflicts.
12728 : : *
12729 : : * The locking clause (FOR UPDATE etc) may be before or after LIMIT/OFFSET.
12730 : : * In <=7.2.X, LIMIT/OFFSET had to be after FOR UPDATE
12731 : : * We now support both orderings, but prefer LIMIT/OFFSET before the locking
12732 : : * clause.
12733 : : * 2002-08-28 bjm
12734 : : */
12735 : : select_no_parens:
12736 : 202510 : simple_select { $$ = $1; }
12737 : : | select_clause sort_clause
12738 : : {
6559 tgl@sss.pgh.pa.us 12739 : 27264 : insertSelectOptions((SelectStmt *) $1, $2, NIL,
12740 : : NULL, NULL,
12741 : : yyscanner);
7972 bruce@momjian.us 12742 : 27264 : $$ = $1;
12743 : : }
12744 : : | select_clause opt_sort_clause for_locking_clause opt_select_limit
12745 : : {
7900 12746 : 2357 : insertSelectOptions((SelectStmt *) $1, $2, $3,
1468 alvherre@alvh.no-ip. 12747 : 2357 : $4,
12748 : : NULL,
12749 : : yyscanner);
7972 bruce@momjian.us 12750 : 2357 : $$ = $1;
12751 : : }
12752 : : | select_clause opt_sort_clause select_limit opt_for_locking_clause
12753 : : {
7900 12754 : 2300 : insertSelectOptions((SelectStmt *) $1, $2, $4,
1468 alvherre@alvh.no-ip. 12755 : 2300 : $3,
12756 : : NULL,
12757 : : yyscanner);
7972 bruce@momjian.us 12758 : 2294 : $$ = $1;
12759 : : }
12760 : : | with_clause select_clause
12761 : : {
5671 tgl@sss.pgh.pa.us 12762 : 933 : insertSelectOptions((SelectStmt *) $2, NULL, NIL,
12763 : : NULL,
5389 12764 : 933 : $1,
12765 : : yyscanner);
5671 12766 : 933 : $$ = $2;
12767 : : }
12768 : : | with_clause select_clause sort_clause
12769 : : {
12770 : 244 : insertSelectOptions((SelectStmt *) $2, $3, NIL,
12771 : : NULL,
5389 12772 : 244 : $1,
12773 : : yyscanner);
5671 12774 : 244 : $$ = $2;
12775 : : }
12776 : : | with_clause select_clause opt_sort_clause for_locking_clause opt_select_limit
12777 : : {
12778 : 3 : insertSelectOptions((SelectStmt *) $2, $3, $4,
1468 alvherre@alvh.no-ip. 12779 : 3 : $5,
5389 tgl@sss.pgh.pa.us 12780 : 3 : $1,
12781 : : yyscanner);
5671 12782 : 3 : $$ = $2;
12783 : : }
12784 : : | with_clause select_clause opt_sort_clause select_limit opt_for_locking_clause
12785 : : {
12786 : 32 : insertSelectOptions((SelectStmt *) $2, $3, $5,
1468 alvherre@alvh.no-ip. 12787 : 32 : $4,
5389 tgl@sss.pgh.pa.us 12788 : 32 : $1,
12789 : : yyscanner);
5671 12790 : 32 : $$ = $2;
12791 : : }
12792 : : ;
12793 : :
12794 : : select_clause:
7972 bruce@momjian.us 12795 : 46847 : simple_select { $$ = $1; }
12796 : 236 : | select_with_parens { $$ = $1; }
12797 : : ;
12798 : :
12799 : : /*
12800 : : * This rule parses SELECT statements that can appear within set operations,
12801 : : * including UNION, INTERSECT and EXCEPT. '(' and ')' can be used to specify
12802 : : * the ordering of the set operations. Without '(' and ')' we want the
12803 : : * operations to be ordered per the precedence specs at the head of this file.
12804 : : *
12805 : : * As with select_no_parens, simple_select cannot have outer parentheses,
12806 : : * but can have parenthesized subclauses.
12807 : : *
12808 : : * It might appear that we could fold the first two alternatives into one
12809 : : * by using opt_distinct_clause. However, that causes a shift/reduce conflict
12810 : : * against INSERT ... SELECT ... ON CONFLICT. We avoid the ambiguity by
12811 : : * requiring SELECT DISTINCT [ON] to be followed by a non-empty target_list.
12812 : : *
12813 : : * Note that sort clauses cannot be included at this level --- SQL requires
12814 : : * SELECT foo UNION SELECT bar ORDER BY baz
12815 : : * to be parsed as
12816 : : * (SELECT foo UNION SELECT bar) ORDER BY baz
12817 : : * not
12818 : : * SELECT foo UNION (SELECT bar ORDER BY baz)
12819 : : * Likewise for WITH, FOR UPDATE and LIMIT. Therefore, those clauses are
12820 : : * described as part of the select_no_parens production, not simple_select.
12821 : : * This does not limit functionality, because you can reintroduce these
12822 : : * clauses inside parentheses.
12823 : : *
12824 : : * NOTE: only the leftmost component SelectStmt should have INTO.
12825 : : * However, this is not checked by the grammar; parse analysis must check it.
12826 : : */
12827 : : simple_select:
12828 : : SELECT opt_all_clause opt_target_list
12829 : : into_clause from_clause where_clause
12830 : : group_clause having_clause window_clause
12831 : : {
3264 andres@anarazel.de 12832 : 211676 : SelectStmt *n = makeNode(SelectStmt);
12833 : :
12834 : 211676 : n->targetList = $3;
12835 : 211676 : n->intoClause = $4;
12836 : 211676 : n->fromClause = $5;
12837 : 211676 : n->whereClause = $6;
1123 tomas.vondra@postgre 12838 : 211676 : n->groupClause = ($7)->list;
12839 : 211676 : n->groupDistinct = ($7)->distinct;
3264 andres@anarazel.de 12840 : 211676 : n->havingClause = $8;
12841 : 211676 : n->windowClause = $9;
702 peter@eisentraut.org 12842 : 211676 : $$ = (Node *) n;
12843 : : }
12844 : : | SELECT distinct_clause target_list
12845 : : into_clause from_clause where_clause
12846 : : group_clause having_clause window_clause
12847 : : {
9592 bruce@momjian.us 12848 : 1506 : SelectStmt *n = makeNode(SelectStmt);
12849 : :
8844 tgl@sss.pgh.pa.us 12850 : 1506 : n->distinctClause = $2;
9715 bruce@momjian.us 12851 : 1506 : n->targetList = $3;
6197 tgl@sss.pgh.pa.us 12852 : 1506 : n->intoClause = $4;
9715 bruce@momjian.us 12853 : 1506 : n->fromClause = $5;
12854 : 1506 : n->whereClause = $6;
1123 tomas.vondra@postgre 12855 : 1506 : n->groupClause = ($7)->list;
12856 : 1506 : n->groupDistinct = ($7)->distinct;
9715 bruce@momjian.us 12857 : 1506 : n->havingClause = $8;
5586 tgl@sss.pgh.pa.us 12858 : 1506 : n->windowClause = $9;
702 peter@eisentraut.org 12859 : 1506 : $$ = (Node *) n;
12860 : : }
6465 mail@joeconway.com 12861 : 29080 : | values_clause { $$ = $1; }
12862 : : | TABLE relation_expr
12863 : : {
12864 : : /* same as SELECT * FROM relation_expr */
702 peter@eisentraut.org 12865 : 123 : ColumnRef *cr = makeNode(ColumnRef);
12866 : 123 : ResTarget *rt = makeNode(ResTarget);
5624 peter_e@gmx.net 12867 : 123 : SelectStmt *n = makeNode(SelectStmt);
12868 : :
12869 : 123 : cr->fields = list_make1(makeNode(A_Star));
12870 : 123 : cr->location = -1;
12871 : :
12872 : 123 : rt->name = NULL;
12873 : 123 : rt->indirection = NIL;
702 peter@eisentraut.org 12874 : 123 : rt->val = (Node *) cr;
5624 peter_e@gmx.net 12875 : 123 : rt->location = -1;
12876 : :
12877 : 123 : n->targetList = list_make1(rt);
12878 : 123 : n->fromClause = list_make1($2);
702 peter@eisentraut.org 12879 : 123 : $$ = (Node *) n;
12880 : : }
12881 : : | select_clause UNION set_quantifier select_clause
12882 : : {
1123 tomas.vondra@postgre 12883 : 6632 : $$ = makeSetOp(SETOP_UNION, $3 == SET_QUANTIFIER_ALL, $1, $4);
12884 : : }
12885 : : | select_clause INTERSECT set_quantifier select_clause
12886 : : {
12887 : 120 : $$ = makeSetOp(SETOP_INTERSECT, $3 == SET_QUANTIFIER_ALL, $1, $4);
12888 : : }
12889 : : | select_clause EXCEPT set_quantifier select_clause
12890 : : {
12891 : 220 : $$ = makeSetOp(SETOP_EXCEPT, $3 == SET_QUANTIFIER_ALL, $1, $4);
12892 : : }
12893 : : ;
12894 : :
12895 : : /*
12896 : : * SQL standard WITH clause looks like:
12897 : : *
12898 : : * WITH [ RECURSIVE ] <query name> [ (<column>,...) ]
12899 : : * AS (query) [ SEARCH or CYCLE clause ]
12900 : : *
12901 : : * Recognizing WITH_LA here allows a CTE to be named TIME or ORDINALITY.
12902 : : */
12903 : : with_clause:
12904 : : WITH cte_list
12905 : : {
5671 tgl@sss.pgh.pa.us 12906 : 858 : $$ = makeNode(WithClause);
12907 : 858 : $$->ctes = $2;
12908 : 858 : $$->recursive = false;
12909 : 858 : $$->location = @1;
12910 : : }
12911 : : | WITH_LA cte_list
12912 : : {
3337 12913 : 3 : $$ = makeNode(WithClause);
12914 : 3 : $$->ctes = $2;
12915 : 3 : $$->recursive = false;
12916 : 3 : $$->location = @1;
12917 : : }
12918 : : | WITH RECURSIVE cte_list
12919 : : {
5671 12920 : 550 : $$ = makeNode(WithClause);
12921 : 550 : $$->ctes = $3;
12922 : 550 : $$->recursive = true;
12923 : 550 : $$->location = @1;
12924 : : }
12925 : : ;
12926 : :
12927 : : cte_list:
12928 : 1411 : common_table_expr { $$ = list_make1($1); }
12929 : 548 : | cte_list ',' common_table_expr { $$ = lappend($1, $3); }
12930 : : ;
12931 : :
12932 : : common_table_expr: name opt_name_list AS opt_materialized '(' PreparableStmt ')' opt_search_clause opt_cycle_clause
12933 : : {
12934 : 1959 : CommonTableExpr *n = makeNode(CommonTableExpr);
12935 : :
12936 : 1959 : n->ctename = $1;
12937 : 1959 : n->aliascolnames = $2;
1884 12938 : 1959 : n->ctematerialized = $4;
12939 : 1959 : n->ctequery = $6;
1168 peter@eisentraut.org 12940 : 1959 : n->search_clause = castNode(CTESearchClause, $8);
12941 : 1959 : n->cycle_clause = castNode(CTECycleClause, $9);
5671 tgl@sss.pgh.pa.us 12942 : 1959 : n->location = @1;
12943 : 1959 : $$ = (Node *) n;
12944 : : }
12945 : : ;
12946 : :
12947 : : opt_materialized:
1884 12948 : 83 : MATERIALIZED { $$ = CTEMaterializeAlways; }
12949 : 24 : | NOT MATERIALIZED { $$ = CTEMaterializeNever; }
12950 : 1852 : | /*EMPTY*/ { $$ = CTEMaterializeDefault; }
12951 : : ;
12952 : :
12953 : : opt_search_clause:
12954 : : SEARCH DEPTH FIRST_P BY columnList SET ColId
12955 : : {
1168 peter@eisentraut.org 12956 : 45 : CTESearchClause *n = makeNode(CTESearchClause);
12957 : :
12958 : 45 : n->search_col_list = $5;
12959 : 45 : n->search_breadth_first = false;
12960 : 45 : n->search_seq_column = $7;
12961 : 45 : n->location = @1;
12962 : 45 : $$ = (Node *) n;
12963 : : }
12964 : : | SEARCH BREADTH FIRST_P BY columnList SET ColId
12965 : : {
12966 : 18 : CTESearchClause *n = makeNode(CTESearchClause);
12967 : :
12968 : 18 : n->search_col_list = $5;
12969 : 18 : n->search_breadth_first = true;
12970 : 18 : n->search_seq_column = $7;
12971 : 18 : n->location = @1;
12972 : 18 : $$ = (Node *) n;
12973 : : }
12974 : : | /*EMPTY*/
12975 : : {
12976 : 1896 : $$ = NULL;
12977 : : }
12978 : : ;
12979 : :
12980 : : opt_cycle_clause:
12981 : : CYCLE columnList SET ColId TO AexprConst DEFAULT AexprConst USING ColId
12982 : : {
12983 : 33 : CTECycleClause *n = makeNode(CTECycleClause);
12984 : :
12985 : 33 : n->cycle_col_list = $2;
12986 : 33 : n->cycle_mark_column = $4;
12987 : 33 : n->cycle_mark_value = $6;
12988 : 33 : n->cycle_mark_default = $8;
12989 : 33 : n->cycle_path_column = $10;
12990 : 33 : n->location = @1;
12991 : 33 : $$ = (Node *) n;
12992 : : }
12993 : : | CYCLE columnList SET ColId USING ColId
12994 : : {
1142 12995 : 30 : CTECycleClause *n = makeNode(CTECycleClause);
12996 : :
12997 : 30 : n->cycle_col_list = $2;
12998 : 30 : n->cycle_mark_column = $4;
12999 : 30 : n->cycle_mark_value = makeBoolAConst(true, -1);
13000 : 30 : n->cycle_mark_default = makeBoolAConst(false, -1);
13001 : 30 : n->cycle_path_column = $6;
13002 : 30 : n->location = @1;
13003 : 30 : $$ = (Node *) n;
13004 : : }
13005 : : | /*EMPTY*/
13006 : : {
1168 13007 : 1896 : $$ = NULL;
13008 : : }
13009 : : ;
13010 : :
13011 : : opt_with_clause:
4930 tgl@sss.pgh.pa.us 13012 : 199 : with_clause { $$ = $1; }
13013 : 44830 : | /*EMPTY*/ { $$ = NULL; }
13014 : : ;
13015 : :
13016 : : into_clause:
13017 : : INTO OptTempTableName
13018 : : {
6263 13019 : 65 : $$ = makeNode(IntoClause);
13020 : 65 : $$->rel = $2;
13021 : 65 : $$->colNames = NIL;
13022 : 65 : $$->options = NIL;
13023 : 65 : $$->onCommit = ONCOMMIT_NOOP;
13024 : 65 : $$->tableSpaceName = NULL;
4020 13025 : 65 : $$->viewQuery = NULL;
4525 13026 : 65 : $$->skipData = false;
13027 : : }
13028 : : | /*EMPTY*/
6263 13029 : 213126 : { $$ = NULL; }
13030 : : ;
13031 : :
13032 : : /*
13033 : : * Redundancy here is needed to avoid shift/reduce conflicts,
13034 : : * since TEMP is not a reserved word. See also OptTemp.
13035 : : */
13036 : : OptTempTableName:
13037 : : TEMPORARY opt_table qualified_name
13038 : : {
8060 tgl@sss.pgh.pa.us 13039 :UBC 0 : $$ = $3;
4871 rhaas@postgresql.org 13040 : 0 : $$->relpersistence = RELPERSISTENCE_TEMP;
13041 : : }
13042 : : | TEMP opt_table qualified_name
13043 : : {
8060 tgl@sss.pgh.pa.us 13044 :CBC 3 : $$ = $3;
4871 rhaas@postgresql.org 13045 : 3 : $$->relpersistence = RELPERSISTENCE_TEMP;
13046 : : }
13047 : : | LOCAL TEMPORARY opt_table qualified_name
13048 : : {
8060 tgl@sss.pgh.pa.us 13049 :UBC 0 : $$ = $4;
4871 rhaas@postgresql.org 13050 : 0 : $$->relpersistence = RELPERSISTENCE_TEMP;
13051 : : }
13052 : : | LOCAL TEMP opt_table qualified_name
13053 : : {
8060 tgl@sss.pgh.pa.us 13054 : 0 : $$ = $4;
4871 rhaas@postgresql.org 13055 : 0 : $$->relpersistence = RELPERSISTENCE_TEMP;
13056 : : }
13057 : : | GLOBAL TEMPORARY opt_table qualified_name
13058 : : {
4323 tgl@sss.pgh.pa.us 13059 [ # # ]: 0 : ereport(WARNING,
13060 : : (errmsg("GLOBAL is deprecated in temporary table creation"),
13061 : : parser_errposition(@1)));
8060 13062 : 0 : $$ = $4;
4871 rhaas@postgresql.org 13063 : 0 : $$->relpersistence = RELPERSISTENCE_TEMP;
13064 : : }
13065 : : | GLOBAL TEMP opt_table qualified_name
13066 : : {
4323 tgl@sss.pgh.pa.us 13067 [ # # ]: 0 : ereport(WARNING,
13068 : : (errmsg("GLOBAL is deprecated in temporary table creation"),
13069 : : parser_errposition(@1)));
8060 13070 : 0 : $$ = $4;
4871 rhaas@postgresql.org 13071 : 0 : $$->relpersistence = RELPERSISTENCE_TEMP;
13072 : : }
13073 : : | UNLOGGED opt_table qualified_name
13074 : : {
4855 13075 : 0 : $$ = $3;
13076 : 0 : $$->relpersistence = RELPERSISTENCE_UNLOGGED;
13077 : : }
13078 : : | TABLE qualified_name
13079 : : {
8060 tgl@sss.pgh.pa.us 13080 :CBC 15 : $$ = $2;
4871 rhaas@postgresql.org 13081 : 15 : $$->relpersistence = RELPERSISTENCE_PERMANENT;
13082 : : }
13083 : : | qualified_name
13084 : : {
8060 tgl@sss.pgh.pa.us 13085 : 47 : $$ = $1;
4871 rhaas@postgresql.org 13086 : 47 : $$->relpersistence = RELPERSISTENCE_PERMANENT;
13087 : : }
13088 : : ;
13089 : :
13090 : : opt_table: TABLE
13091 : : | /*EMPTY*/
13092 : : ;
13093 : :
13094 : : set_quantifier:
1123 tomas.vondra@postgre 13095 : 3226 : ALL { $$ = SET_QUANTIFIER_ALL; }
13096 : 16 : | DISTINCT { $$ = SET_QUANTIFIER_DISTINCT; }
13097 : 5831 : | /*EMPTY*/ { $$ = SET_QUANTIFIER_DEFAULT; }
13098 : : ;
13099 : :
13100 : : /* We use (NIL) as a placeholder to indicate that all target expressions
13101 : : * should be placed in the DISTINCT list during parsetree analysis.
13102 : : */
13103 : : distinct_clause:
7259 neilc@samurai.com 13104 : 1418 : DISTINCT { $$ = list_make1(NIL); }
7972 bruce@momjian.us 13105 : 91 : | DISTINCT ON '(' expr_list ')' { $$ = $4; }
13106 : : ;
13107 : :
13108 : : opt_all_clause:
13109 : : ALL
13110 : : | /*EMPTY*/
13111 : : ;
13112 : :
13113 : : opt_distinct_clause:
1178 tgl@sss.pgh.pa.us 13114 :UBC 0 : distinct_clause { $$ = $1; }
1178 tgl@sss.pgh.pa.us 13115 :CBC 20482 : | opt_all_clause { $$ = NIL; }
13116 : : ;
13117 : :
13118 : : opt_sort_clause:
13119 : 3264 : sort_clause { $$ = $1; }
7900 bruce@momjian.us 13120 : 166689 : | /*EMPTY*/ { $$ = NIL; }
13121 : : ;
13122 : :
13123 : : sort_clause:
7972 13124 : 30946 : ORDER BY sortby_list { $$ = $3; }
13125 : : ;
13126 : :
13127 : : sortby_list:
7259 neilc@samurai.com 13128 : 30955 : sortby { $$ = list_make1($1); }
7972 bruce@momjian.us 13129 : 12193 : | sortby_list ',' sortby { $$ = lappend($1, $3); }
13130 : : ;
13131 : :
13132 : : sortby: a_expr USING qual_all_Op opt_nulls_order
13133 : : {
7546 tgl@sss.pgh.pa.us 13134 : 110 : $$ = makeNode(SortBy);
9384 scrappy@hub.org 13135 : 110 : $$->node = $1;
6305 tgl@sss.pgh.pa.us 13136 : 110 : $$->sortby_dir = SORTBY_USING;
13137 : 110 : $$->sortby_nulls = $4;
7546 13138 : 110 : $$->useOp = $3;
5704 13139 : 110 : $$->location = @3;
13140 : : }
13141 : : | a_expr opt_asc_desc opt_nulls_order
13142 : : {
7546 13143 : 43038 : $$ = makeNode(SortBy);
13144 : 43038 : $$->node = $1;
6238 meskes@postgresql.or 13145 : 43038 : $$->sortby_dir = $2;
6305 tgl@sss.pgh.pa.us 13146 : 43038 : $$->sortby_nulls = $3;
7546 13147 : 43038 : $$->useOp = NIL;
5704 13148 : 43038 : $$->location = -1; /* no operator */
13149 : : }
13150 : : ;
13151 : :
13152 : :
13153 : : select_limit:
13154 : : limit_clause offset_clause
13155 : : {
1468 alvherre@alvh.no-ip. 13156 : 84 : $$ = $1;
13157 : 84 : ($$)->limitOffset = $2;
13158 : : }
13159 : : | offset_clause limit_clause
13160 : : {
13161 : 107 : $$ = $2;
13162 : 107 : ($$)->limitOffset = $1;
13163 : : }
13164 : : | limit_clause
13165 : : {
13166 : 2037 : $$ = $1;
13167 : : }
13168 : : | offset_clause
13169 : : {
13170 : 199 : SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit));
13171 : :
13172 : 199 : n->limitOffset = $1;
13173 : 199 : n->limitCount = NULL;
13174 : 199 : n->limitOption = LIMIT_OPTION_COUNT;
13175 : 199 : $$ = n;
13176 : : }
13177 : : ;
13178 : :
13179 : : opt_select_limit:
5353 tgl@sss.pgh.pa.us 13180 : 95 : select_limit { $$ = $1; }
1468 alvherre@alvh.no-ip. 13181 : 22747 : | /* EMPTY */ { $$ = NULL; }
13182 : : ;
13183 : :
13184 : : limit_clause:
13185 : : LIMIT select_limit_value
13186 : : {
13187 : 2188 : SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit));
13188 : :
13189 : 2188 : n->limitOffset = NULL;
13190 : 2188 : n->limitCount = $2;
13191 : 2188 : n->limitOption = LIMIT_OPTION_COUNT;
13192 : 2188 : $$ = n;
13193 : : }
13194 : : | LIMIT select_limit_value ',' select_offset_value
13195 : : {
13196 : : /* Disabled because it was too confusing, bjm 2002-02-18 */
7575 tgl@sss.pgh.pa.us 13197 [ # # ]:UBC 0 : ereport(ERROR,
13198 : : (errcode(ERRCODE_SYNTAX_ERROR),
13199 : : errmsg("LIMIT #,# syntax is not supported"),
13200 : : errhint("Use separate LIMIT and OFFSET clauses."),
13201 : : parser_errposition(@1)));
13202 : : }
13203 : : /* SQL:2008 syntax */
13204 : : /* to avoid shift/reduce conflicts, handle the optional value with
13205 : : * a separate production rather than an opt_ expression. The fact
13206 : : * that ONLY is fully reserved means that this way, we defer any
13207 : : * decision about what rule reduces ROW or ROWS to the point where
13208 : : * we can see the ONLY token in the lookahead slot.
13209 : : */
13210 : : | FETCH first_or_next select_fetch_first_value row_or_rows ONLY
13211 : : {
1468 alvherre@alvh.no-ip. 13212 :CBC 10 : SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit));
13213 : :
13214 : 10 : n->limitOffset = NULL;
13215 : 10 : n->limitCount = $3;
13216 : 10 : n->limitOption = LIMIT_OPTION_COUNT;
13217 : 10 : $$ = n;
13218 : : }
13219 : : | FETCH first_or_next select_fetch_first_value row_or_rows WITH TIES
13220 : : {
13221 : 27 : SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit));
13222 : :
13223 : 27 : n->limitOffset = NULL;
13224 : 27 : n->limitCount = $3;
13225 : 27 : n->limitOption = LIMIT_OPTION_WITH_TIES;
13226 : 27 : $$ = n;
13227 : : }
13228 : : | FETCH first_or_next row_or_rows ONLY
13229 : : {
1468 alvherre@alvh.no-ip. 13230 :UBC 0 : SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit));
13231 : :
13232 : 0 : n->limitOffset = NULL;
13233 : 0 : n->limitCount = makeIntConst(1, -1);
13234 : 0 : n->limitOption = LIMIT_OPTION_COUNT;
13235 : 0 : $$ = n;
13236 : : }
13237 : : | FETCH first_or_next row_or_rows WITH TIES
13238 : : {
1427 alvherre@alvh.no-ip. 13239 :CBC 3 : SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit));
13240 : :
13241 : 3 : n->limitOffset = NULL;
13242 : 3 : n->limitCount = makeIntConst(1, -1);
13243 : 3 : n->limitOption = LIMIT_OPTION_WITH_TIES;
13244 : 3 : $$ = n;
13245 : : }
13246 : : ;
13247 : :
13248 : : offset_clause:
13249 : : OFFSET select_offset_value
5353 tgl@sss.pgh.pa.us 13250 : 390 : { $$ = $2; }
13251 : : /* SQL:2008 syntax */
13252 : : | OFFSET select_fetch_first_value row_or_rows
5353 tgl@sss.pgh.pa.us 13253 :UBC 0 : { $$ = $2; }
13254 : : ;
13255 : :
13256 : : select_limit_value:
7591 tgl@sss.pgh.pa.us 13257 :CBC 2187 : a_expr { $$ = $1; }
13258 : : | ALL
13259 : : {
13260 : : /* LIMIT ALL is represented as a NULL constant */
5708 13261 : 1 : $$ = makeNullAConst(@1);
13262 : : }
13263 : : ;
13264 : :
13265 : : select_offset_value:
5353 13266 : 390 : a_expr { $$ = $1; }
13267 : : ;
13268 : :
13269 : : /*
13270 : : * Allowing full expressions without parentheses causes various parsing
13271 : : * problems with the trailing ROW/ROWS key words. SQL spec only calls for
13272 : : * <simple value specification>, which is either a literal or a parameter (but
13273 : : * an <SQL parameter reference> could be an identifier, bringing up conflicts
13274 : : * with ROW/ROWS). We solve this by leveraging the presence of ONLY (see above)
13275 : : * to determine whether the expression is missing rather than trying to make it
13276 : : * optional in this rule.
13277 : : *
13278 : : * c_expr covers almost all the spec-required cases (and more), but it doesn't
13279 : : * cover signed numeric literals, which are allowed by the spec. So we include
13280 : : * those here explicitly. We need FCONST as well as ICONST because values that
13281 : : * don't fit in the platform's "long", but do fit in bigint, should still be
13282 : : * accepted here. (This is possible in 64-bit Windows as well as all 32-bit
13283 : : * builds.)
13284 : : */
13285 : : select_fetch_first_value:
2155 rhodiumtoad@postgres 13286 : 37 : c_expr { $$ = $1; }
13287 : : | '+' I_or_F_const
2155 rhodiumtoad@postgres 13288 :UBC 0 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2, @1); }
13289 : : | '-' I_or_F_const
13290 : 0 : { $$ = doNegate($2, @1); }
13291 : : ;
13292 : :
13293 : : I_or_F_const:
13294 : 0 : Iconst { $$ = makeIntConst($1,@1); }
13295 : 0 : | FCONST { $$ = makeFloatConst($1,@1); }
13296 : : ;
13297 : :
13298 : : /* noise words */
5353 tgl@sss.pgh.pa.us 13299 :CBC 16 : row_or_rows: ROW { $$ = 0; }
13300 : 24 : | ROWS { $$ = 0; }
13301 : : ;
13302 : :
13303 : 40 : first_or_next: FIRST_P { $$ = 0; }
5353 tgl@sss.pgh.pa.us 13304 :UBC 0 : | NEXT { $$ = 0; }
13305 : : ;
13306 : :
13307 : :
13308 : : /*
13309 : : * This syntax for group_clause tries to follow the spec quite closely.
13310 : : * However, the spec allows only column references, not expressions,
13311 : : * which introduces an ambiguity between implicit row constructors
13312 : : * (a,b) and lists of column references.
13313 : : *
13314 : : * We handle this by using the a_expr production for what the spec calls
13315 : : * <ordinary grouping set>, which in the spec represents either one column
13316 : : * reference or a parenthesized list of column references. Then, we check the
13317 : : * top node of the a_expr to see if it's an implicit RowExpr, and if so, just
13318 : : * grab and use the list, discarding the node. (this is done in parse analysis,
13319 : : * not here)
13320 : : *
13321 : : * (we abuse the row_format field of RowExpr to distinguish implicit and
13322 : : * explicit row constructors; it's debatable if anyone sanely wants to use them
13323 : : * in a group clause, but if they have a reason to, we make it possible.)
13324 : : *
13325 : : * Each item in the group_clause list is either an expression tree or a
13326 : : * GroupingSet node of some type.
13327 : : */
13328 : : group_clause:
13329 : : GROUP_P BY set_quantifier group_by_list
13330 : : {
1123 tomas.vondra@postgre 13331 :CBC 2095 : GroupClause *n = (GroupClause *) palloc(sizeof(GroupClause));
13332 : :
13333 : 2095 : n->distinct = $3 == SET_QUANTIFIER_DISTINCT;
13334 : 2095 : n->list = $4;
13335 : 2095 : $$ = n;
13336 : : }
13337 : : | /*EMPTY*/
13338 : : {
13339 : 231569 : GroupClause *n = (GroupClause *) palloc(sizeof(GroupClause));
13340 : :
13341 : 231569 : n->distinct = false;
13342 : 231569 : n->list = NIL;
13343 : 231569 : $$ = n;
13344 : : }
13345 : : ;
13346 : :
13347 : : group_by_list:
3256 andres@anarazel.de 13348 : 2340 : group_by_item { $$ = list_make1($1); }
13349 : 1361 : | group_by_list ',' group_by_item { $$ = lappend($1,$3); }
13350 : : ;
13351 : :
13352 : : group_by_item:
13353 : 3128 : a_expr { $$ = $1; }
13354 : 111 : | empty_grouping_set { $$ = $1; }
13355 : 92 : | cube_clause { $$ = $1; }
13356 : 125 : | rollup_clause { $$ = $1; }
13357 : 245 : | grouping_sets_clause { $$ = $1; }
13358 : : ;
13359 : :
13360 : : empty_grouping_set:
13361 : : '(' ')'
13362 : : {
13363 : 111 : $$ = (Node *) makeGroupingSet(GROUPING_SET_EMPTY, NIL, @1);
13364 : : }
13365 : : ;
13366 : :
13367 : : /*
13368 : : * These hacks rely on setting precedence of CUBE and ROLLUP below that of '(',
13369 : : * so that they shift in these rules rather than reducing the conflicting
13370 : : * unreserved_keyword rule.
13371 : : */
13372 : :
13373 : : rollup_clause:
13374 : : ROLLUP '(' expr_list ')'
13375 : : {
13376 : 125 : $$ = (Node *) makeGroupingSet(GROUPING_SET_ROLLUP, $3, @1);
13377 : : }
13378 : : ;
13379 : :
13380 : : cube_clause:
13381 : : CUBE '(' expr_list ')'
13382 : : {
13383 : 92 : $$ = (Node *) makeGroupingSet(GROUPING_SET_CUBE, $3, @1);
13384 : : }
13385 : : ;
13386 : :
13387 : : grouping_sets_clause:
13388 : : GROUPING SETS '(' group_by_list ')'
13389 : : {
13390 : 245 : $$ = (Node *) makeGroupingSet(GROUPING_SET_SETS, $4, @1);
13391 : : }
13392 : : ;
13393 : :
13394 : : having_clause:
7972 bruce@momjian.us 13395 : 387 : HAVING a_expr { $$ = $2; }
13396 : 233277 : | /*EMPTY*/ { $$ = NULL; }
13397 : : ;
13398 : :
13399 : : for_locking_clause:
6559 tgl@sss.pgh.pa.us 13400 : 2530 : for_locking_items { $$ = $1; }
6559 tgl@sss.pgh.pa.us 13401 :UBC 0 : | FOR READ ONLY { $$ = NIL; }
13402 : : ;
13403 : :
13404 : : opt_for_locking_clause:
6559 tgl@sss.pgh.pa.us 13405 :CBC 170 : for_locking_clause { $$ = $1; }
13406 : 22644 : | /* EMPTY */ { $$ = NIL; }
13407 : : ;
13408 : :
13409 : : for_locking_items:
13410 : 2530 : for_locking_item { $$ = list_make1($1); }
13411 : 49 : | for_locking_items for_locking_item { $$ = lappend($1, $2); }
13412 : : ;
13413 : :
13414 : : for_locking_item:
13415 : : for_locking_strength locked_rels_list opt_nowait_or_skip
13416 : : {
6831 13417 : 2579 : LockingClause *n = makeNode(LockingClause);
13418 : :
4099 alvherre@alvh.no-ip. 13419 : 2579 : n->lockedRels = $2;
13420 : 2579 : n->strength = $1;
3477 13421 : 2579 : n->waitPolicy = $3;
6831 tgl@sss.pgh.pa.us 13422 : 2579 : $$ = (Node *) n;
13423 : : }
13424 : : ;
13425 : :
13426 : : for_locking_strength:
1250 peter@eisentraut.org 13427 : 728 : FOR UPDATE { $$ = LCS_FORUPDATE; }
13428 : 33 : | FOR NO KEY UPDATE { $$ = LCS_FORNOKEYUPDATE; }
13429 : 107 : | FOR SHARE { $$ = LCS_FORSHARE; }
13430 : 1711 : | FOR KEY SHARE { $$ = LCS_FORKEYSHARE; }
13431 : : ;
13432 : :
13433 : : locked_rels_list:
5704 tgl@sss.pgh.pa.us 13434 : 1714 : OF qualified_name_list { $$ = $2; }
6831 13435 : 865 : | /* EMPTY */ { $$ = NIL; }
13436 : : ;
13437 : :
13438 : :
13439 : : /*
13440 : : * We should allow ROW '(' expr_list ')' too, but that seems to require
13441 : : * making VALUES a fully reserved word, which will probably break more apps
13442 : : * than allowing the noise-word is worth.
13443 : : */
13444 : : values_clause:
13445 : : VALUES '(' expr_list ')'
13446 : : {
6465 mail@joeconway.com 13447 : 29080 : SelectStmt *n = makeNode(SelectStmt);
13448 : :
2700 tgl@sss.pgh.pa.us 13449 : 29080 : n->valuesLists = list_make1($3);
6465 mail@joeconway.com 13450 : 29080 : $$ = (Node *) n;
13451 : : }
13452 : : | values_clause ',' '(' expr_list ')'
13453 : : {
13454 : 12168 : SelectStmt *n = (SelectStmt *) $1;
13455 : :
2700 tgl@sss.pgh.pa.us 13456 : 12168 : n->valuesLists = lappend(n->valuesLists, $4);
6465 mail@joeconway.com 13457 : 12168 : $$ = (Node *) n;
13458 : : }
13459 : : ;
13460 : :
13461 : :
13462 : : /*****************************************************************************
13463 : : *
13464 : : * clauses common to all Optimizable Stmts:
13465 : : * from_clause - allow list of both JOIN expressions and table names
13466 : : * where_clause - qualifications for joins or restrictions
13467 : : *
13468 : : *****************************************************************************/
13469 : :
13470 : : from_clause:
7972 bruce@momjian.us 13471 : 136669 : FROM from_list { $$ = $2; }
13472 : 103715 : | /*EMPTY*/ { $$ = NIL; }
13473 : : ;
13474 : :
13475 : : from_list:
7259 neilc@samurai.com 13476 : 137003 : table_ref { $$ = list_make1($1); }
7971 bruce@momjian.us 13477 : 26713 : | from_list ',' table_ref { $$ = lappend($1, $3); }
13478 : : ;
13479 : :
13480 : : /*
13481 : : * table_ref is where an alias clause can be attached.
13482 : : */
13483 : : table_ref: relation_expr opt_alias_clause
13484 : : {
8060 tgl@sss.pgh.pa.us 13485 : 173328 : $1->alias = $2;
8615 13486 : 173328 : $$ = (Node *) $1;
13487 : : }
13488 : : | relation_expr opt_alias_clause tablesample_clause
13489 : : {
3186 13490 : 127 : RangeTableSample *n = (RangeTableSample *) $3;
13491 : :
13492 : 127 : $1->alias = $2;
13493 : : /* relation_expr goes inside the RangeTableSample node */
13494 : 127 : n->relation = (Node *) $1;
13495 : 127 : $$ = (Node *) n;
13496 : : }
13497 : : | func_table func_alias_clause
13498 : : {
3797 13499 : 20365 : RangeFunction *n = (RangeFunction *) $1;
13500 : :
4268 13501 : 20365 : n->alias = linitial($2);
13502 : 20365 : n->coldeflist = lsecond($2);
7924 bruce@momjian.us 13503 : 20365 : $$ = (Node *) n;
13504 : : }
13505 : : | LATERAL_P func_table func_alias_clause
13506 : : {
3797 tgl@sss.pgh.pa.us 13507 : 497 : RangeFunction *n = (RangeFunction *) $2;
13508 : :
4268 13509 : 497 : n->lateral = true;
13510 : 497 : n->alias = linitial($3);
13511 : 497 : n->coldeflist = lsecond($3);
8008 13512 : 497 : $$ = (Node *) n;
13513 : : }
13514 : : | xmltable opt_alias_clause
13515 : : {
2594 alvherre@alvh.no-ip. 13516 : 40 : RangeTableFunc *n = (RangeTableFunc *) $1;
13517 : :
13518 : 40 : n->alias = $2;
13519 : 40 : $$ = (Node *) n;
13520 : : }
13521 : : | LATERAL_P xmltable opt_alias_clause
13522 : : {
13523 : 70 : RangeTableFunc *n = (RangeTableFunc *) $2;
13524 : :
13525 : 70 : n->lateral = true;
13526 : 70 : n->alias = $3;
13527 : 70 : $$ = (Node *) n;
13528 : : }
13529 : : | select_with_parens opt_alias_clause
13530 : : {
4268 tgl@sss.pgh.pa.us 13531 : 6249 : RangeSubselect *n = makeNode(RangeSubselect);
13532 : :
13533 : 6249 : n->lateral = false;
13534 : 6249 : n->subquery = $1;
13535 : 6249 : n->alias = $2;
13536 : 6249 : $$ = (Node *) n;
13537 : : }
13538 : : | LATERAL_P select_with_parens opt_alias_clause
13539 : : {
8615 13540 : 696 : RangeSubselect *n = makeNode(RangeSubselect);
13541 : :
4268 13542 : 696 : n->lateral = true;
13543 : 696 : n->subquery = $2;
13544 : 696 : n->alias = $3;
8615 13545 : 696 : $$ = (Node *) n;
13546 : : }
13547 : : | joined_table
13548 : : {
13549 : 36779 : $$ = (Node *) $1;
13550 : : }
13551 : : | '(' joined_table ')' alias_clause
13552 : : {
13553 : 87 : $2->alias = $4;
13554 : 87 : $$ = (Node *) $2;
13555 : : }
13556 : : | json_table opt_alias_clause
13557 : : {
10 amitlan@postgresql.o 13558 :GNC 194 : JsonTable *jt = castNode(JsonTable, $1);
13559 : :
13560 : 194 : jt->alias = $2;
13561 : 194 : $$ = (Node *) jt;
13562 : : }
13563 : : | LATERAL_P json_table opt_alias_clause
13564 : : {
10 amitlan@postgresql.o 13565 :UNC 0 : JsonTable *jt = castNode(JsonTable, $2);
13566 : :
13567 : 0 : jt->alias = $3;
13568 : 0 : jt->lateral = true;
13569 : 0 : $$ = (Node *) jt;
13570 : : }
13571 : : ;
13572 : :
13573 : :
13574 : : /*
13575 : : * It may seem silly to separate joined_table from table_ref, but there is
13576 : : * method in SQL's madness: if you don't do it this way you get reduce-
13577 : : * reduce conflicts, because it's not clear to the parser generator whether
13578 : : * to expect alias_clause after ')' or not. For the same reason we must
13579 : : * treat 'JOIN' and 'join_type JOIN' separately, rather than allowing
13580 : : * join_type to expand to empty; if we try it, the parser generator can't
13581 : : * figure out when to reduce an empty join_type right after table_ref.
13582 : : *
13583 : : * Note that a CROSS JOIN is the same as an unqualified
13584 : : * INNER JOIN, and an INNER JOIN/ON has the same shape
13585 : : * but a qualification expression to limit membership.
13586 : : * A NATURAL JOIN implicitly matches column names between
13587 : : * tables and the shape is determined by which columns are
13588 : : * in common. We'll collect columns during the later transformations.
13589 : : */
13590 : :
13591 : : joined_table:
13592 : : '(' joined_table ')'
13593 : : {
8615 tgl@sss.pgh.pa.us 13594 :CBC 1689 : $$ = $2;
13595 : : }
13596 : : | table_ref CROSS JOIN table_ref
13597 : : {
13598 : : /* CROSS JOIN is same as unqualified inner join */
702 peter@eisentraut.org 13599 : 149 : JoinExpr *n = makeNode(JoinExpr);
13600 : :
8615 tgl@sss.pgh.pa.us 13601 : 149 : n->jointype = JOIN_INNER;
2433 peter_e@gmx.net 13602 : 149 : n->isNatural = false;
8615 tgl@sss.pgh.pa.us 13603 : 149 : n->larg = $1;
13604 : 149 : n->rarg = $4;
5386 peter_e@gmx.net 13605 : 149 : n->usingClause = NIL;
1110 peter@eisentraut.org 13606 : 149 : n->join_using_alias = NULL;
8615 tgl@sss.pgh.pa.us 13607 : 149 : n->quals = NULL;
8825 lockhart@fourpalms.o 13608 : 149 : $$ = n;
13609 : : }
13610 : : | table_ref join_type JOIN table_ref join_qual
13611 : : {
702 peter@eisentraut.org 13612 : 22250 : JoinExpr *n = makeNode(JoinExpr);
13613 : :
8615 tgl@sss.pgh.pa.us 13614 : 22250 : n->jointype = $2;
2433 peter_e@gmx.net 13615 : 22250 : n->isNatural = false;
8615 tgl@sss.pgh.pa.us 13616 : 22250 : n->larg = $1;
13617 : 22250 : n->rarg = $4;
13618 [ + - + + ]: 22250 : if ($5 != NULL && IsA($5, List))
13619 : : {
13620 : : /* USING clause */
1110 peter@eisentraut.org 13621 : 243 : n->usingClause = linitial_node(List, castNode(List, $5));
13622 : 243 : n->join_using_alias = lsecond_node(Alias, castNode(List, $5));
13623 : : }
13624 : : else
13625 : : {
13626 : : /* ON clause */
13627 : 22007 : n->quals = $5;
13628 : : }
8825 lockhart@fourpalms.o 13629 : 22250 : $$ = n;
13630 : : }
13631 : : | table_ref JOIN table_ref join_qual
13632 : : {
13633 : : /* letting join_type reduce to empty doesn't work */
702 peter@eisentraut.org 13634 : 14338 : JoinExpr *n = makeNode(JoinExpr);
13635 : :
8615 tgl@sss.pgh.pa.us 13636 : 14338 : n->jointype = JOIN_INNER;
2433 peter_e@gmx.net 13637 : 14338 : n->isNatural = false;
8615 tgl@sss.pgh.pa.us 13638 : 14338 : n->larg = $1;
13639 : 14338 : n->rarg = $3;
13640 [ + - + + ]: 14338 : if ($4 != NULL && IsA($4, List))
13641 : : {
13642 : : /* USING clause */
1110 peter@eisentraut.org 13643 : 354 : n->usingClause = linitial_node(List, castNode(List, $4));
13644 : 354 : n->join_using_alias = lsecond_node(Alias, castNode(List, $4));
13645 : : }
13646 : : else
13647 : : {
13648 : : /* ON clause */
13649 : 13984 : n->quals = $4;
13650 : : }
8615 tgl@sss.pgh.pa.us 13651 : 14338 : $$ = n;
13652 : : }
13653 : : | table_ref NATURAL join_type JOIN table_ref
13654 : : {
702 peter@eisentraut.org 13655 : 39 : JoinExpr *n = makeNode(JoinExpr);
13656 : :
8615 tgl@sss.pgh.pa.us 13657 : 39 : n->jointype = $3;
2433 peter_e@gmx.net 13658 : 39 : n->isNatural = true;
8615 tgl@sss.pgh.pa.us 13659 : 39 : n->larg = $1;
13660 : 39 : n->rarg = $5;
5386 peter_e@gmx.net 13661 : 39 : n->usingClause = NIL; /* figure out which columns later... */
1110 peter@eisentraut.org 13662 : 39 : n->join_using_alias = NULL;
8615 tgl@sss.pgh.pa.us 13663 : 39 : n->quals = NULL; /* fill later */
13664 : 39 : $$ = n;
13665 : : }
13666 : : | table_ref NATURAL JOIN table_ref
13667 : : {
13668 : : /* letting join_type reduce to empty doesn't work */
702 peter@eisentraut.org 13669 : 90 : JoinExpr *n = makeNode(JoinExpr);
13670 : :
8615 tgl@sss.pgh.pa.us 13671 : 90 : n->jointype = JOIN_INNER;
2433 peter_e@gmx.net 13672 : 90 : n->isNatural = true;
8615 tgl@sss.pgh.pa.us 13673 : 90 : n->larg = $1;
13674 : 90 : n->rarg = $4;
5386 peter_e@gmx.net 13675 : 90 : n->usingClause = NIL; /* figure out which columns later... */
1110 peter@eisentraut.org 13676 : 90 : n->join_using_alias = NULL;
8615 tgl@sss.pgh.pa.us 13677 : 90 : n->quals = NULL; /* fill later */
8825 lockhart@fourpalms.o 13678 : 90 : $$ = n;
13679 : : }
13680 : : ;
13681 : :
13682 : : alias_clause:
13683 : : AS ColId '(' name_list ')'
13684 : : {
8060 tgl@sss.pgh.pa.us 13685 : 2723 : $$ = makeNode(Alias);
13686 : 2723 : $$->aliasname = $2;
13687 : 2723 : $$->colnames = $4;
13688 : : }
13689 : : | AS ColId
13690 : : {
13691 : 5786 : $$ = makeNode(Alias);
13692 : 5786 : $$->aliasname = $2;
13693 : : }
13694 : : | ColId '(' name_list ')'
13695 : : {
13696 : 2707 : $$ = makeNode(Alias);
13697 : 2707 : $$->aliasname = $1;
13698 : 2707 : $$->colnames = $3;
13699 : : }
13700 : : | ColId
13701 : : {
13702 : 114772 : $$ = makeNode(Alias);
13703 : 114772 : $$->aliasname = $1;
13704 : : }
13705 : : ;
13706 : :
4268 13707 : 111878 : opt_alias_clause: alias_clause { $$ = $1; }
13708 : 68826 : | /*EMPTY*/ { $$ = NULL; }
13709 : : ;
13710 : :
13711 : : /*
13712 : : * The alias clause after JOIN ... USING only accepts the AS ColId spelling,
13713 : : * per SQL standard. (The grammar could parse the other variants, but they
13714 : : * don't seem to be useful, and it might lead to parser problems in the
13715 : : * future.)
13716 : : */
13717 : : opt_alias_clause_for_join_using:
13718 : : AS ColId
13719 : : {
1110 peter@eisentraut.org 13720 : 42 : $$ = makeNode(Alias);
13721 : 42 : $$->aliasname = $2;
13722 : : /* the column name list will be inserted later */
13723 : : }
13724 : 555 : | /*EMPTY*/ { $$ = NULL; }
13725 : : ;
13726 : :
13727 : : /*
13728 : : * func_alias_clause can include both an Alias and a coldeflist, so we make it
13729 : : * return a 2-element list that gets disassembled by calling production.
13730 : : */
13731 : : func_alias_clause:
13732 : : alias_clause
13733 : : {
4268 tgl@sss.pgh.pa.us 13734 : 14023 : $$ = list_make2($1, NIL);
13735 : : }
13736 : : | AS '(' TableFuncElementList ')'
13737 : : {
13738 : 52 : $$ = list_make2(NULL, $3);
13739 : : }
13740 : : | AS ColId '(' TableFuncElementList ')'
13741 : : {
702 peter@eisentraut.org 13742 : 298 : Alias *a = makeNode(Alias);
13743 : :
4268 tgl@sss.pgh.pa.us 13744 : 298 : a->aliasname = $2;
13745 : 298 : $$ = list_make2(a, $4);
13746 : : }
13747 : : | ColId '(' TableFuncElementList ')'
13748 : : {
702 peter@eisentraut.org 13749 : 25 : Alias *a = makeNode(Alias);
13750 : :
4268 tgl@sss.pgh.pa.us 13751 : 25 : a->aliasname = $1;
13752 : 25 : $$ = list_make2(a, $3);
13753 : : }
13754 : : | /*EMPTY*/
13755 : : {
13756 : 6464 : $$ = list_make2(NULL, NIL);
13757 : : }
13758 : : ;
13759 : :
1249 peter@eisentraut.org 13760 : 509 : join_type: FULL opt_outer { $$ = JOIN_FULL; }
13761 : 19714 : | LEFT opt_outer { $$ = JOIN_LEFT; }
13762 : 172 : | RIGHT opt_outer { $$ = JOIN_RIGHT; }
7972 bruce@momjian.us 13763 : 1894 : | INNER_P { $$ = JOIN_INNER; }
13764 : : ;
13765 : :
13766 : : /* OUTER is just noise... */
13767 : : opt_outer: OUTER_P
13768 : : | /*EMPTY*/
13769 : : ;
13770 : :
13771 : : /* JOIN qualification clauses
13772 : : * Possibilities are:
13773 : : * USING ( column list ) [ AS alias ]
13774 : : * allows only unqualified column names,
13775 : : * which must match between tables.
13776 : : * ON expr allows more general qualifications.
13777 : : *
13778 : : * We return USING as a two-element List (the first item being a sub-List
13779 : : * of the common column names, and the second either an Alias item or NULL).
13780 : : * An ON-expr will not be a List, so it can be told apart that way.
13781 : : */
13782 : :
13783 : : join_qual: USING '(' name_list ')' opt_alias_clause_for_join_using
13784 : : {
1110 peter@eisentraut.org 13785 : 597 : $$ = (Node *) list_make2($3, $5);
13786 : : }
13787 : : | ON a_expr
13788 : : {
13789 : 35991 : $$ = $2;
13790 : : }
13791 : : ;
13792 : :
13793 : :
13794 : : relation_expr:
13795 : : qualified_name
13796 : : {
13797 : : /* inheritance query, implicitly */
8060 tgl@sss.pgh.pa.us 13798 : 203105 : $$ = $1;
2669 13799 : 203105 : $$->inh = true;
8060 13800 : 203105 : $$->alias = NULL;
13801 : : }
13802 : : | extended_relation_expr
13803 : : {
900 akapila@postgresql.o 13804 : 3520 : $$ = $1;
13805 : : }
13806 : : ;
13807 : :
13808 : : extended_relation_expr:
13809 : : qualified_name '*'
13810 : : {
13811 : : /* inheritance query, explicitly */
8060 tgl@sss.pgh.pa.us 13812 : 102 : $$ = $1;
2669 13813 : 102 : $$->inh = true;
8060 13814 : 102 : $$->alias = NULL;
13815 : : }
13816 : : | ONLY qualified_name
13817 : : {
13818 : : /* no inheritance */
13819 : 3421 : $$ = $2;
2669 13820 : 3421 : $$->inh = false;
8060 13821 : 3421 : $$->alias = NULL;
13822 : : }
13823 : : | ONLY '(' qualified_name ')'
13824 : : {
13825 : : /* no inheritance, SQL99-style syntax */
7924 lockhart@fourpalms.o 13826 :UBC 0 : $$ = $3;
2669 tgl@sss.pgh.pa.us 13827 : 0 : $$->inh = false;
7924 lockhart@fourpalms.o 13828 : 0 : $$->alias = NULL;
13829 : : }
13830 : : ;
13831 : :
13832 : :
13833 : : relation_expr_list:
5571 peter_e@gmx.net 13834 :CBC 1309 : relation_expr { $$ = list_make1($1); }
13835 : 4852 : | relation_expr_list ',' relation_expr { $$ = lappend($1, $3); }
13836 : : ;
13837 : :
13838 : :
13839 : : /*
13840 : : * Given "UPDATE foo set set ...", we have to decide without looking any
13841 : : * further ahead whether the first "set" is an alias or the UPDATE's SET
13842 : : * keyword. Since "set" is allowed as a column name both interpretations
13843 : : * are feasible. We resolve the shift/reduce conflict by giving the first
13844 : : * relation_expr_opt_alias production a higher precedence than the SET token
13845 : : * has, causing the parser to prefer to reduce, in effect assuming that the
13846 : : * SET is not an alias.
13847 : : */
13848 : : relation_expr_opt_alias: relation_expr %prec UMINUS
13849 : : {
6657 neilc@samurai.com 13850 : 8877 : $$ = $1;
13851 : : }
13852 : : | relation_expr ColId
13853 : : {
702 peter@eisentraut.org 13854 : 1048 : Alias *alias = makeNode(Alias);
13855 : :
6657 tgl@sss.pgh.pa.us 13856 : 1048 : alias->aliasname = $2;
13857 : 1048 : $1->alias = alias;
13858 : 1048 : $$ = $1;
13859 : : }
13860 : : | relation_expr AS ColId
13861 : : {
702 peter@eisentraut.org 13862 : 39 : Alias *alias = makeNode(Alias);
13863 : :
6657 neilc@samurai.com 13864 : 39 : alias->aliasname = $3;
13865 : 39 : $1->alias = alias;
13866 : 39 : $$ = $1;
13867 : : }
13868 : : ;
13869 : :
13870 : : /*
13871 : : * TABLESAMPLE decoration in a FROM item
13872 : : */
13873 : : tablesample_clause:
13874 : : TABLESAMPLE func_name '(' expr_list ')' opt_repeatable_clause
13875 : : {
3257 simon@2ndQuadrant.co 13876 : 127 : RangeTableSample *n = makeNode(RangeTableSample);
13877 : :
13878 : : /* n->relation will be filled in later */
13879 : 127 : n->method = $2;
13880 : 127 : n->args = $4;
13881 : 127 : n->repeatable = $6;
3186 tgl@sss.pgh.pa.us 13882 : 127 : n->location = @2;
3257 simon@2ndQuadrant.co 13883 : 127 : $$ = (Node *) n;
13884 : : }
13885 : : ;
13886 : :
13887 : : opt_repeatable_clause:
13888 : 54 : REPEATABLE '(' a_expr ')' { $$ = (Node *) $3; }
13889 : 73 : | /*EMPTY*/ { $$ = NULL; }
13890 : : ;
13891 : :
13892 : : /*
13893 : : * func_table represents a function invocation in a FROM list. It can be
13894 : : * a plain function call, like "foo(...)", or a ROWS FROM expression with
13895 : : * one or more function calls, "ROWS FROM (foo(...), bar(...))",
13896 : : * optionally with WITH ORDINALITY attached.
13897 : : * In the ROWS FROM syntax, a column definition list can be given for each
13898 : : * function, for example:
13899 : : * ROWS FROM (foo() AS (foo_res_a text, foo_res_b text),
13900 : : * bar() AS (bar_res_a text, bar_res_b text))
13901 : : * It's also possible to attach a column definition list to the RangeFunction
13902 : : * as a whole, but that's handled by the table_ref production.
13903 : : */
13904 : : func_table: func_expr_windowless opt_ordinality
13905 : : {
3797 tgl@sss.pgh.pa.us 13906 : 20799 : RangeFunction *n = makeNode(RangeFunction);
13907 : :
13908 : 20799 : n->lateral = false;
13909 : 20799 : n->ordinality = $2;
3778 noah@leadboat.com 13910 : 20799 : n->is_rowsfrom = false;
3797 tgl@sss.pgh.pa.us 13911 : 20799 : n->functions = list_make1(list_make2($1, NIL));
13912 : : /* alias and coldeflist are set by table_ref production */
13913 : 20799 : $$ = (Node *) n;
13914 : : }
13915 : : | ROWS FROM '(' rowsfrom_list ')' opt_ordinality
13916 : : {
13917 : 66 : RangeFunction *n = makeNode(RangeFunction);
13918 : :
13919 : 66 : n->lateral = false;
3778 noah@leadboat.com 13920 : 66 : n->ordinality = $6;
13921 : 66 : n->is_rowsfrom = true;
13922 : 66 : n->functions = $4;
13923 : : /* alias and coldeflist are set by table_ref production */
3797 tgl@sss.pgh.pa.us 13924 : 66 : $$ = (Node *) n;
13925 : : }
13926 : : ;
13927 : :
13928 : : rowsfrom_item: func_expr_windowless opt_col_def_list
13929 : 159 : { $$ = list_make2($1, $2); }
13930 : : ;
13931 : :
13932 : : rowsfrom_list:
3778 noah@leadboat.com 13933 : 66 : rowsfrom_item { $$ = list_make1($1); }
13934 : 93 : | rowsfrom_list ',' rowsfrom_item { $$ = lappend($1, $3); }
13935 : : ;
13936 : :
3797 tgl@sss.pgh.pa.us 13937 : 27 : opt_col_def_list: AS '(' TableFuncElementList ')' { $$ = $3; }
13938 : 132 : | /*EMPTY*/ { $$ = NIL; }
13939 : : ;
13940 : :
3337 13941 : 379 : opt_ordinality: WITH_LA ORDINALITY { $$ = true; }
3797 13942 : 20486 : | /*EMPTY*/ { $$ = false; }
13943 : : ;
13944 : :
13945 : :
13946 : : where_clause:
7972 bruce@momjian.us 13947 : 90921 : WHERE a_expr { $$ = $2; }
7971 13948 : 152301 : | /*EMPTY*/ { $$ = NULL; }
13949 : : ;
13950 : :
13951 : : /* variant for UPDATE and DELETE */
13952 : : where_or_current_clause:
6152 tgl@sss.pgh.pa.us 13953 : 6454 : WHERE a_expr { $$ = $2; }
13954 : : | WHERE CURRENT_P OF cursor_name
13955 : : {
13956 : 127 : CurrentOfExpr *n = makeNode(CurrentOfExpr);
13957 : :
13958 : : /* cvarno is filled in by parse analysis */
13959 : 127 : n->cursor_name = $4;
13960 : 127 : n->cursor_param = 0;
13961 : 127 : $$ = (Node *) n;
13962 : : }
13963 : 2393 : | /*EMPTY*/ { $$ = NULL; }
13964 : : ;
13965 : :
13966 : :
13967 : : OptTableFuncElementList:
4949 peter_e@gmx.net 13968 : 343 : TableFuncElementList { $$ = $1; }
13969 : 3 : | /*EMPTY*/ { $$ = NIL; }
13970 : : ;
13971 : :
13972 : : TableFuncElementList:
13973 : : TableFuncElement
13974 : : {
7259 neilc@samurai.com 13975 : 745 : $$ = list_make1($1);
13976 : : }
13977 : : | TableFuncElementList ',' TableFuncElement
13978 : : {
7899 tgl@sss.pgh.pa.us 13979 : 987 : $$ = lappend($1, $3);
13980 : : }
13981 : : ;
13982 : :
13983 : : TableFuncElement: ColId Typename opt_collate_clause
13984 : : {
7924 bruce@momjian.us 13985 : 1764 : ColumnDef *n = makeNode(ColumnDef);
13986 : :
13987 : 1764 : n->colname = $1;
5386 peter_e@gmx.net 13988 : 1764 : n->typeName = $2;
4785 tgl@sss.pgh.pa.us 13989 : 1764 : n->inhcount = 0;
7875 13990 : 1764 : n->is_local = true;
4785 13991 : 1764 : n->is_not_null = false;
13992 : 1764 : n->is_from_type = false;
54 peter@eisentraut.org 13993 : 1764 : n->storage = 0;
4785 tgl@sss.pgh.pa.us 13994 : 1764 : n->raw_default = NULL;
13995 : 1764 : n->cooked_default = NULL;
13996 : 1764 : n->collClause = (CollateClause *) $3;
13997 : 1764 : n->collOid = InvalidOid;
13998 : 1764 : n->constraints = NIL;
3797 13999 : 1764 : n->location = @1;
702 peter@eisentraut.org 14000 : 1764 : $$ = (Node *) n;
14001 : : }
14002 : : ;
14003 : :
14004 : : /*
14005 : : * XMLTABLE
14006 : : */
14007 : : xmltable:
14008 : : XMLTABLE '(' c_expr xmlexists_argument COLUMNS xmltable_column_list ')'
14009 : : {
2594 alvherre@alvh.no-ip. 14010 : 100 : RangeTableFunc *n = makeNode(RangeTableFunc);
14011 : :
14012 : 100 : n->rowexpr = $3;
14013 : 100 : n->docexpr = $4;
14014 : 100 : n->columns = $6;
14015 : 100 : n->namespaces = NIL;
14016 : 100 : n->location = @1;
702 peter@eisentraut.org 14017 : 100 : $$ = (Node *) n;
14018 : : }
14019 : : | XMLTABLE '(' XMLNAMESPACES '(' xml_namespace_list ')' ','
14020 : : c_expr xmlexists_argument COLUMNS xmltable_column_list ')'
14021 : : {
2594 alvherre@alvh.no-ip. 14022 : 10 : RangeTableFunc *n = makeNode(RangeTableFunc);
14023 : :
14024 : 10 : n->rowexpr = $8;
14025 : 10 : n->docexpr = $9;
14026 : 10 : n->columns = $11;
14027 : 10 : n->namespaces = $5;
14028 : 10 : n->location = @1;
702 peter@eisentraut.org 14029 : 10 : $$ = (Node *) n;
14030 : : }
14031 : : ;
14032 : :
2594 alvherre@alvh.no-ip. 14033 : 110 : xmltable_column_list: xmltable_column_el { $$ = list_make1($1); }
14034 : 265 : | xmltable_column_list ',' xmltable_column_el { $$ = lappend($1, $3); }
14035 : : ;
14036 : :
14037 : : xmltable_column_el:
14038 : : ColId Typename
14039 : : {
702 peter@eisentraut.org 14040 : 99 : RangeTableFuncCol *fc = makeNode(RangeTableFuncCol);
14041 : :
2594 alvherre@alvh.no-ip. 14042 : 99 : fc->colname = $1;
14043 : 99 : fc->for_ordinality = false;
14044 : 99 : fc->typeName = $2;
14045 : 99 : fc->is_not_null = false;
14046 : 99 : fc->colexpr = NULL;
14047 : 99 : fc->coldefexpr = NULL;
14048 : 99 : fc->location = @1;
14049 : :
14050 : 99 : $$ = (Node *) fc;
14051 : : }
14052 : : | ColId Typename xmltable_column_option_list
14053 : : {
702 peter@eisentraut.org 14054 : 245 : RangeTableFuncCol *fc = makeNode(RangeTableFuncCol);
14055 : : ListCell *option;
14056 : 245 : bool nullability_seen = false;
14057 : :
2594 alvherre@alvh.no-ip. 14058 : 245 : fc->colname = $1;
14059 : 245 : fc->typeName = $2;
14060 : 245 : fc->for_ordinality = false;
14061 : 245 : fc->is_not_null = false;
14062 : 245 : fc->colexpr = NULL;
14063 : 245 : fc->coldefexpr = NULL;
14064 : 245 : fc->location = @1;
14065 : :
14066 [ + - + + : 546 : foreach(option, $3)
+ + ]
14067 : : {
14068 : 301 : DefElem *defel = (DefElem *) lfirst(option);
14069 : :
14070 [ + + ]: 301 : if (strcmp(defel->defname, "default") == 0)
14071 : : {
14072 [ - + ]: 28 : if (fc->coldefexpr != NULL)
2594 alvherre@alvh.no-ip. 14073 [ # # ]:UBC 0 : ereport(ERROR,
14074 : : (errcode(ERRCODE_SYNTAX_ERROR),
14075 : : errmsg("only one DEFAULT value is allowed"),
14076 : : parser_errposition(defel->location)));
2594 alvherre@alvh.no-ip. 14077 :CBC 28 : fc->coldefexpr = defel->arg;
14078 : : }
14079 [ + + ]: 273 : else if (strcmp(defel->defname, "path") == 0)
14080 : : {
14081 [ - + ]: 245 : if (fc->colexpr != NULL)
2594 alvherre@alvh.no-ip. 14082 [ # # ]:UBC 0 : ereport(ERROR,
14083 : : (errcode(ERRCODE_SYNTAX_ERROR),
14084 : : errmsg("only one PATH value per column is allowed"),
14085 : : parser_errposition(defel->location)));
2594 alvherre@alvh.no-ip. 14086 :CBC 245 : fc->colexpr = defel->arg;
14087 : : }
14088 [ + - ]: 28 : else if (strcmp(defel->defname, "is_not_null") == 0)
14089 : : {
14090 [ - + ]: 28 : if (nullability_seen)
2594 alvherre@alvh.no-ip. 14091 [ # # ]:UBC 0 : ereport(ERROR,
14092 : : (errcode(ERRCODE_SYNTAX_ERROR),
14093 : : errmsg("conflicting or redundant NULL / NOT NULL declarations for column \"%s\"", fc->colname),
14094 : : parser_errposition(defel->location)));
821 peter@eisentraut.org 14095 :CBC 28 : fc->is_not_null = boolVal(defel->arg);
2594 alvherre@alvh.no-ip. 14096 : 28 : nullability_seen = true;
14097 : : }
14098 : : else
14099 : : {
2594 alvherre@alvh.no-ip. 14100 [ # # ]:UBC 0 : ereport(ERROR,
14101 : : (errcode(ERRCODE_SYNTAX_ERROR),
14102 : : errmsg("unrecognized column option \"%s\"",
14103 : : defel->defname),
14104 : : parser_errposition(defel->location)));
14105 : : }
14106 : : }
2594 alvherre@alvh.no-ip. 14107 :CBC 245 : $$ = (Node *) fc;
14108 : : }
14109 : : | ColId FOR ORDINALITY
14110 : : {
702 peter@eisentraut.org 14111 : 31 : RangeTableFuncCol *fc = makeNode(RangeTableFuncCol);
14112 : :
2594 alvherre@alvh.no-ip. 14113 : 31 : fc->colname = $1;
14114 : 31 : fc->for_ordinality = true;
14115 : : /* other fields are ignored, initialized by makeNode */
14116 : 31 : fc->location = @1;
14117 : :
14118 : 31 : $$ = (Node *) fc;
14119 : : }
14120 : : ;
14121 : :
14122 : : xmltable_column_option_list:
14123 : : xmltable_column_option_el
14124 : 245 : { $$ = list_make1($1); }
14125 : : | xmltable_column_option_list xmltable_column_option_el
14126 : 56 : { $$ = lappend($1, $2); }
14127 : : ;
14128 : :
14129 : : xmltable_column_option_el:
14130 : : IDENT b_expr
2594 alvherre@alvh.no-ip. 14131 :LBC (245) : { $$ = makeDefElem($1, $2, @1); }
14132 : : | DEFAULT b_expr
2594 alvherre@alvh.no-ip. 14133 :CBC 28 : { $$ = makeDefElem("default", $2, @1); }
14134 : : | NOT NULL_P
821 peter@eisentraut.org 14135 : 28 : { $$ = makeDefElem("is_not_null", (Node *) makeBoolean(true), @1); }
14136 : : | NULL_P
821 peter@eisentraut.org 14137 :UBC 0 : { $$ = makeDefElem("is_not_null", (Node *) makeBoolean(false), @1); }
14138 : : | PATH b_expr
10 amitlan@postgresql.o 14139 :GNC 245 : { $$ = makeDefElem("path", $2, @1); }
14140 : : ;
14141 : :
14142 : : xml_namespace_list:
14143 : : xml_namespace_el
2594 alvherre@alvh.no-ip. 14144 :CBC 10 : { $$ = list_make1($1); }
14145 : : | xml_namespace_list ',' xml_namespace_el
2594 alvherre@alvh.no-ip. 14146 :UBC 0 : { $$ = lappend($1, $3); }
14147 : : ;
14148 : :
14149 : : xml_namespace_el:
14150 : : b_expr AS ColLabel
14151 : : {
2594 alvherre@alvh.no-ip. 14152 :CBC 7 : $$ = makeNode(ResTarget);
14153 : 7 : $$->name = $3;
14154 : 7 : $$->indirection = NIL;
14155 : 7 : $$->val = $1;
14156 : 7 : $$->location = @1;
14157 : : }
14158 : : | DEFAULT b_expr
14159 : : {
14160 : 3 : $$ = makeNode(ResTarget);
14161 : 3 : $$->name = NULL;
14162 : 3 : $$->indirection = NIL;
14163 : 3 : $$->val = $2;
14164 : 3 : $$->location = @1;
14165 : : }
14166 : : ;
14167 : :
14168 : : json_table:
14169 : : JSON_TABLE '('
14170 : : json_value_expr ',' a_expr json_table_path_name_opt
14171 : : json_passing_clause_opt
14172 : : COLUMNS '(' json_table_column_definition_list ')'
14173 : : json_on_error_clause_opt
14174 : : ')'
14175 : : {
10 amitlan@postgresql.o 14176 :GNC 197 : JsonTable *n = makeNode(JsonTable);
14177 : : char *pathstring;
14178 : :
14179 : 197 : n->context_item = (JsonValueExpr *) $3;
14180 [ + + ]: 197 : if (!IsA($5, A_Const) ||
14181 [ - + ]: 194 : castNode(A_Const, $5)->val.node.type != T_String)
14182 [ + - ]: 3 : ereport(ERROR,
14183 : : errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
14184 : : errmsg("only string constants are supported in JSON_TABLE path specification"),
14185 : : parser_errposition(@5));
14186 : 194 : pathstring = castNode(A_Const, $5)->val.sval.sval;
14187 : 194 : n->pathspec = makeJsonTablePathSpec(pathstring, $6, @5, @6);
14188 : 194 : n->passing = $7;
14189 : 194 : n->columns = $10;
14190 : 194 : n->on_error = (JsonBehavior *) $12;
14191 : 194 : n->location = @1;
14192 : 194 : $$ = (Node *) n;
14193 : : }
14194 : : ;
14195 : :
14196 : : json_table_path_name_opt:
14197 : 29 : AS name { $$ = $2; }
14198 : 171 : | /* empty */ { $$ = NULL; }
14199 : : ;
14200 : :
14201 : : json_table_column_definition_list:
14202 : : json_table_column_definition
14203 : 340 : { $$ = list_make1($1); }
14204 : : | json_table_column_definition_list ',' json_table_column_definition
14205 : 264 : { $$ = lappend($1, $3); }
14206 : : ;
14207 : :
14208 : : json_table_column_definition:
14209 : : ColId FOR ORDINALITY
14210 : : {
14211 : 42 : JsonTableColumn *n = makeNode(JsonTableColumn);
14212 : :
14213 : 42 : n->coltype = JTC_FOR_ORDINALITY;
14214 : 42 : n->name = $1;
14215 : 42 : n->location = @1;
14216 : 42 : $$ = (Node *) n;
14217 : : }
14218 : : | ColId Typename
14219 : : json_table_column_path_clause_opt
14220 : : json_wrapper_behavior
14221 : : json_quotes_clause_opt
14222 : : json_behavior_clause_opt
14223 : : {
14224 : 323 : JsonTableColumn *n = makeNode(JsonTableColumn);
14225 : :
14226 : 323 : n->coltype = JTC_REGULAR;
14227 : 323 : n->name = $1;
14228 : 323 : n->typeName = $2;
14229 : 323 : n->format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1);
14230 : 323 : n->pathspec = (JsonTablePathSpec *) $3;
14231 : 323 : n->wrapper = $4;
14232 : 323 : n->quotes = $5;
14233 : 323 : n->on_empty = (JsonBehavior *) linitial($6);
14234 : 323 : n->on_error = (JsonBehavior *) lsecond($6);
14235 : 323 : n->location = @1;
14236 : 323 : $$ = (Node *) n;
14237 : : }
14238 : : | ColId Typename json_format_clause
14239 : : json_table_column_path_clause_opt
14240 : : json_wrapper_behavior
14241 : : json_quotes_clause_opt
14242 : : json_behavior_clause_opt
14243 : : {
14244 : 54 : JsonTableColumn *n = makeNode(JsonTableColumn);
14245 : :
14246 : 54 : n->coltype = JTC_FORMATTED;
14247 : 54 : n->name = $1;
14248 : 54 : n->typeName = $2;
14249 : 54 : n->format = (JsonFormat *) $3;
14250 : 54 : n->pathspec = (JsonTablePathSpec *) $4;
14251 : 54 : n->wrapper = $5;
14252 : 54 : n->quotes = $6;
14253 : 54 : n->on_empty = (JsonBehavior *) linitial($7);
14254 : 54 : n->on_error = (JsonBehavior *) lsecond($7);
14255 : 54 : n->location = @1;
14256 : 54 : $$ = (Node *) n;
14257 : : }
14258 : : | ColId Typename
14259 : : EXISTS json_table_column_path_clause_opt
14260 : : json_behavior_clause_opt
14261 : : {
14262 : 42 : JsonTableColumn *n = makeNode(JsonTableColumn);
14263 : :
14264 : 42 : n->coltype = JTC_EXISTS;
14265 : 42 : n->name = $1;
14266 : 42 : n->typeName = $2;
14267 : 42 : n->format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1);
14268 : 42 : n->wrapper = JSW_NONE;
14269 : 42 : n->quotes = JS_QUOTES_UNSPEC;
14270 : 42 : n->pathspec = (JsonTablePathSpec *) $4;
14271 : 42 : n->on_empty = (JsonBehavior *) linitial($5);
14272 : 42 : n->on_error = (JsonBehavior *) lsecond($5);
14273 : 42 : n->location = @1;
14274 : 42 : $$ = (Node *) n;
14275 : : }
14276 : : | NESTED path_opt Sconst
14277 : : COLUMNS '(' json_table_column_definition_list ')'
14278 : : {
6 14279 : 72 : JsonTableColumn *n = makeNode(JsonTableColumn);
14280 : :
14281 : 72 : n->coltype = JTC_NESTED;
14282 : 144 : n->pathspec = (JsonTablePathSpec *)
14283 : 72 : makeJsonTablePathSpec($3, NULL, @3, -1);
14284 : 72 : n->columns = $6;
14285 : 72 : n->location = @1;
14286 : 72 : $$ = (Node *) n;
14287 : : }
14288 : : | NESTED path_opt Sconst AS name
14289 : : COLUMNS '(' json_table_column_definition_list ')'
14290 : : {
14291 : 71 : JsonTableColumn *n = makeNode(JsonTableColumn);
14292 : :
14293 : 71 : n->coltype = JTC_NESTED;
14294 : 142 : n->pathspec = (JsonTablePathSpec *)
14295 : 71 : makeJsonTablePathSpec($3, $5, @3, @5);
14296 : 71 : n->columns = $8;
14297 : 71 : n->location = @1;
14298 : 71 : $$ = (Node *) n;
14299 : : }
14300 : : ;
14301 : :
14302 : : path_opt:
14303 : : PATH
14304 : : | /* EMPTY */
14305 : : ;
14306 : :
14307 : : json_table_column_path_clause_opt:
14308 : : PATH Sconst
10 14309 : 360 : { $$ = (Node *) makeJsonTablePathSpec($2, NULL, @2, -1); }
14310 : : | /* EMPTY */
14311 : 59 : { $$ = NULL; }
14312 : : ;
14313 : :
14314 : : /*****************************************************************************
14315 : : *
14316 : : * Type syntax
14317 : : * SQL introduces a large amount of type-specific syntax.
14318 : : * Define individual clauses to handle these cases, and use
14319 : : * the generic case to handle regular type-extensible Postgres syntax.
14320 : : * - thomas 1997-10-10
14321 : : *
14322 : : *****************************************************************************/
14323 : :
14324 : : Typename: SimpleTypename opt_array_bounds
14325 : : {
9668 lockhart@fourpalms.o 14326 :CBC 205565 : $$ = $1;
14327 : 205565 : $$->arrayBounds = $2;
14328 : : }
14329 : : | SETOF SimpleTypename opt_array_bounds
14330 : : {
14331 : 949 : $$ = $2;
7739 tgl@sss.pgh.pa.us 14332 : 949 : $$->arrayBounds = $3;
2433 peter_e@gmx.net 14333 : 949 : $$->setof = true;
14334 : : }
14335 : : /* SQL standard syntax, currently only one-dimensional */
14336 : : | SimpleTypename ARRAY '[' Iconst ']'
14337 : : {
7677 tgl@sss.pgh.pa.us 14338 : 3 : $$ = $1;
7259 neilc@samurai.com 14339 : 3 : $$->arrayBounds = list_make1(makeInteger($4));
14340 : : }
14341 : : | SETOF SimpleTypename ARRAY '[' Iconst ']'
14342 : : {
7677 tgl@sss.pgh.pa.us 14343 :UBC 0 : $$ = $2;
7259 neilc@samurai.com 14344 : 0 : $$->arrayBounds = list_make1(makeInteger($5));
2433 peter_e@gmx.net 14345 : 0 : $$->setof = true;
14346 : : }
14347 : : | SimpleTypename ARRAY
14348 : : {
5646 14349 : 0 : $$ = $1;
14350 : 0 : $$->arrayBounds = list_make1(makeInteger(-1));
14351 : : }
14352 : : | SETOF SimpleTypename ARRAY
14353 : : {
14354 : 0 : $$ = $2;
14355 : 0 : $$->arrayBounds = list_make1(makeInteger(-1));
2433 14356 : 0 : $$->setof = true;
14357 : : }
14358 : : ;
14359 : :
14360 : : opt_array_bounds:
14361 : : opt_array_bounds '[' ']'
7972 bruce@momjian.us 14362 :CBC 5721 : { $$ = lappend($1, makeInteger(-1)); }
14363 : : | opt_array_bounds '[' Iconst ']'
14364 : 26 : { $$ = lappend($1, makeInteger($3)); }
14365 : : | /*EMPTY*/
14366 : 206514 : { $$ = NIL; }
14367 : : ;
14368 : :
14369 : : SimpleTypename:
7924 lockhart@fourpalms.o 14370 : 165054 : GenericType { $$ = $1; }
14371 : 34645 : | Numeric { $$ = $1; }
14372 : 949 : | Bit { $$ = $1; }
14373 : 1506 : | Character { $$ = $1; }
14374 : 2107 : | ConstDatetime { $$ = $1; }
14375 : : | ConstInterval opt_interval
14376 : : {
8214 14377 : 1632 : $$ = $1;
5694 tgl@sss.pgh.pa.us 14378 : 1632 : $$->typmods = $2;
14379 : : }
14380 : : | ConstInterval '(' Iconst ')'
14381 : : {
8214 lockhart@fourpalms.o 14382 :UBC 0 : $$ = $1;
3466 bruce@momjian.us 14383 : 0 : $$->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1),
14384 : : makeIntConst($3, @3));
14385 : : }
269 amitlan@postgresql.o 14386 :GNC 814 : | JsonType { $$ = $1; }
14387 : : ;
14388 : :
14389 : : /* We have a separate ConstTypename to allow defaulting fixed-length
14390 : : * types such as CHAR() and BIT() to an unspecified length.
14391 : : * SQL9x requires that these default to a length of one, but this
14392 : : * makes no sense for constructs like CHAR 'hi' and BIT '0101',
14393 : : * where there is an obvious better choice to make.
14394 : : * Note that ConstInterval is not included here since it must
14395 : : * be pushed up higher in the rules to accommodate the postfix
14396 : : * options (e.g. INTERVAL '1' YEAR). Likewise, we have to handle
14397 : : * the generic-type-name case in AexprConst to avoid premature
14398 : : * reduce/reduce conflicts against function names.
14399 : : */
14400 : : ConstTypename:
6315 tgl@sss.pgh.pa.us 14401 :CBC 39 : Numeric { $$ = $1; }
7924 lockhart@fourpalms.o 14402 :UBC 0 : | ConstBit { $$ = $1; }
7924 lockhart@fourpalms.o 14403 :CBC 16 : | ConstCharacter { $$ = $1; }
14404 : 1267 : | ConstDatetime { $$ = $1; }
269 amitlan@postgresql.o 14405 :GNC 132 : | JsonType { $$ = $1; }
14406 : : ;
14407 : :
14408 : : /*
14409 : : * GenericType covers all type names that don't have special syntax mandated
14410 : : * by the standard, including qualified names. We also allow type modifiers.
14411 : : * To avoid parsing conflicts against function invocations, the modifiers
14412 : : * have to be shown as expr_list here, but parse analysis will only accept
14413 : : * constants for them.
14414 : : */
14415 : : GenericType:
14416 : : type_function_name opt_type_modifiers
14417 : : {
8017 tgl@sss.pgh.pa.us 14418 :CBC 122065 : $$ = makeTypeName($1);
6315 14419 : 122065 : $$->typmods = $2;
14420 : 122065 : $$->location = @1;
14421 : : }
14422 : : | type_function_name attrs opt_type_modifiers
14423 : : {
14424 : 42989 : $$ = makeTypeNameFromNameList(lcons(makeString($1), $2));
14425 : 42989 : $$->typmods = $3;
6606 14426 : 42989 : $$->location = @1;
14427 : : }
14428 : : ;
14429 : :
6315 14430 : 666 : opt_type_modifiers: '(' expr_list ')' { $$ = $2; }
14431 : 167251 : | /* EMPTY */ { $$ = NIL; }
14432 : : ;
14433 : :
14434 : : /*
14435 : : * SQL numeric data types
14436 : : */
14437 : : Numeric: INT_P
14438 : : {
8017 14439 : 17283 : $$ = SystemTypeName("int4");
6315 14440 : 17283 : $$->location = @1;
14441 : : }
14442 : : | INTEGER
14443 : : {
8017 14444 : 6459 : $$ = SystemTypeName("int4");
6315 14445 : 6459 : $$->location = @1;
14446 : : }
14447 : : | SMALLINT
14448 : : {
8017 14449 : 561 : $$ = SystemTypeName("int2");
6315 14450 : 561 : $$->location = @1;
14451 : : }
14452 : : | BIGINT
14453 : : {
8017 14454 : 2062 : $$ = SystemTypeName("int8");
6315 14455 : 2062 : $$->location = @1;
14456 : : }
14457 : : | REAL
14458 : : {
8017 14459 : 184 : $$ = SystemTypeName("float4");
6315 14460 : 184 : $$->location = @1;
14461 : : }
14462 : : | FLOAT_P opt_float
14463 : : {
8017 14464 : 239 : $$ = $2;
6315 14465 : 239 : $$->location = @1;
14466 : : }
14467 : : | DOUBLE_P PRECISION
14468 : : {
8017 14469 : 239 : $$ = SystemTypeName("float8");
6315 14470 : 239 : $$->location = @1;
14471 : : }
14472 : : | DECIMAL_P opt_type_modifiers
14473 : : {
8017 14474 : 16 : $$ = SystemTypeName("numeric");
6315 14475 : 16 : $$->typmods = $2;
14476 : 16 : $$->location = @1;
14477 : : }
14478 : : | DEC opt_type_modifiers
14479 : : {
8017 tgl@sss.pgh.pa.us 14480 :UBC 0 : $$ = SystemTypeName("numeric");
6315 14481 : 0 : $$->typmods = $2;
14482 : 0 : $$->location = @1;
14483 : : }
14484 : : | NUMERIC opt_type_modifiers
14485 : : {
8017 tgl@sss.pgh.pa.us 14486 :CBC 2847 : $$ = SystemTypeName("numeric");
6315 14487 : 2847 : $$->typmods = $2;
14488 : 2847 : $$->location = @1;
14489 : : }
14490 : : | BOOLEAN_P
14491 : : {
8017 14492 : 4794 : $$ = SystemTypeName("bool");
6315 14493 : 4794 : $$->location = @1;
14494 : : }
14495 : : ;
14496 : :
14497 : : opt_float: '(' Iconst ')'
14498 : : {
14499 : : /*
14500 : : * Check FLOAT() precision limits assuming IEEE floating
14501 : : * types - thomas 1997-09-18
14502 : : */
9668 lockhart@fourpalms.o 14503 [ - + ]: 1 : if ($2 < 1)
7575 tgl@sss.pgh.pa.us 14504 [ # # ]:UBC 0 : ereport(ERROR,
14505 : : (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
14506 : : errmsg("precision for type float must be at least 1 bit"),
14507 : : parser_errposition(@2)));
7607 tgl@sss.pgh.pa.us 14508 [ + - ]:CBC 1 : else if ($2 <= 24)
8017 14509 : 1 : $$ = SystemTypeName("float4");
7607 tgl@sss.pgh.pa.us 14510 [ # # ]:UBC 0 : else if ($2 <= 53)
8017 14511 : 0 : $$ = SystemTypeName("float8");
14512 : : else
7575 14513 [ # # ]: 0 : ereport(ERROR,
14514 : : (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
14515 : : errmsg("precision for type float must be less than 54 bits"),
14516 : : parser_errposition(@2)));
14517 : : }
14518 : : | /*EMPTY*/
14519 : : {
8017 tgl@sss.pgh.pa.us 14520 :CBC 238 : $$ = SystemTypeName("float8");
14521 : : }
14522 : : ;
14523 : :
14524 : : /*
14525 : : * SQL bit-field data types
14526 : : * The following implements BIT() and BIT VARYING().
14527 : : */
14528 : : Bit: BitWithLength
14529 : : {
7924 lockhart@fourpalms.o 14530 : 856 : $$ = $1;
14531 : : }
14532 : : | BitWithoutLength
14533 : : {
14534 : 93 : $$ = $1;
14535 : : }
14536 : : ;
14537 : :
14538 : : /* ConstBit is like Bit except "BIT" defaults to unspecified length */
14539 : : /* See notes for ConstCharacter, which addresses same issue for "CHAR" */
14540 : : ConstBit: BitWithLength
14541 : : {
7924 lockhart@fourpalms.o 14542 :UBC 0 : $$ = $1;
14543 : : }
14544 : : | BitWithoutLength
14545 : : {
14546 : 0 : $$ = $1;
6315 tgl@sss.pgh.pa.us 14547 : 0 : $$->typmods = NIL;
14548 : : }
14549 : : ;
14550 : :
14551 : : BitWithLength:
14552 : : BIT opt_varying '(' expr_list ')'
14553 : : {
14554 : : char *typname;
14555 : :
8017 tgl@sss.pgh.pa.us 14556 [ + + ]:CBC 856 : typname = $2 ? "varbit" : "bit";
14557 : 856 : $$ = SystemTypeName(typname);
6315 14558 : 856 : $$->typmods = $4;
14559 : 856 : $$->location = @1;
14560 : : }
14561 : : ;
14562 : :
14563 : : BitWithoutLength:
14564 : : BIT opt_varying
14565 : : {
14566 : : /* bit defaults to bit(1), varbit to no limit */
8017 14567 [ + + ]: 93 : if ($2)
14568 : : {
14569 : 10 : $$ = SystemTypeName("varbit");
14570 : : }
14571 : : else
14572 : : {
14573 : 83 : $$ = SystemTypeName("bit");
5708 14574 : 83 : $$->typmods = list_make1(makeIntConst(1, -1));
14575 : : }
6315 14576 : 93 : $$->location = @1;
14577 : : }
14578 : : ;
14579 : :
14580 : :
14581 : : /*
14582 : : * SQL character data types
14583 : : * The following implements CHAR() and VARCHAR().
14584 : : */
14585 : : Character: CharacterWithLength
14586 : : {
7924 lockhart@fourpalms.o 14587 : 913 : $$ = $1;
14588 : : }
14589 : : | CharacterWithoutLength
14590 : : {
14591 : 593 : $$ = $1;
14592 : : }
14593 : : ;
14594 : :
14595 : : ConstCharacter: CharacterWithLength
14596 : : {
14597 : 6 : $$ = $1;
14598 : : }
14599 : : | CharacterWithoutLength
14600 : : {
14601 : : /* Length was not specified so allow to be unrestricted.
14602 : : * This handles problems with fixed-length (bpchar) strings
14603 : : * which in column definitions must default to a length
14604 : : * of one, but should not be constrained if the length
14605 : : * was not specified.
14606 : : */
14607 : 10 : $$ = $1;
6315 tgl@sss.pgh.pa.us 14608 : 10 : $$->typmods = NIL;
14609 : : }
14610 : : ;
14611 : :
14612 : : CharacterWithLength: character '(' Iconst ')'
14613 : : {
8017 14614 : 919 : $$ = SystemTypeName($1);
5708 14615 : 919 : $$->typmods = list_make1(makeIntConst($3, @3));
6315 14616 : 919 : $$->location = @1;
14617 : : }
14618 : : ;
14619 : :
14620 : : CharacterWithoutLength: character
14621 : : {
8017 14622 : 603 : $$ = SystemTypeName($1);
14623 : : /* char defaults to char(1), varchar to no limit */
8189 14624 [ + + ]: 603 : if (strcmp($1, "bpchar") == 0)
5708 14625 : 125 : $$->typmods = list_make1(makeIntConst(1, -1));
6315 14626 : 603 : $$->location = @1;
14627 : : }
14628 : : ;
14629 : :
14630 : : character: CHARACTER opt_varying
7972 bruce@momjian.us 14631 [ + + ]: 247 : { $$ = $2 ? "varchar": "bpchar"; }
14632 : : | CHAR_P opt_varying
14633 [ - + ]: 534 : { $$ = $2 ? "varchar": "bpchar"; }
14634 : : | VARCHAR
14635 : 740 : { $$ = "varchar"; }
14636 : : | NATIONAL CHARACTER opt_varying
7972 bruce@momjian.us 14637 [ # # ]:UBC 0 : { $$ = $3 ? "varchar": "bpchar"; }
14638 : : | NATIONAL CHAR_P opt_varying
14639 [ # # ]: 0 : { $$ = $3 ? "varchar": "bpchar"; }
14640 : : | NCHAR opt_varying
7972 bruce@momjian.us 14641 [ - + ]:CBC 1 : { $$ = $2 ? "varchar": "bpchar"; }
14642 : : ;
14643 : :
14644 : : opt_varying:
2433 peter_e@gmx.net 14645 : 197 : VARYING { $$ = true; }
14646 : 1534 : | /*EMPTY*/ { $$ = false; }
14647 : : ;
14648 : :
14649 : : /*
14650 : : * SQL date/time types
14651 : : */
14652 : : ConstDatetime:
14653 : : TIMESTAMP '(' Iconst ')' opt_timezone
14654 : : {
8229 lockhart@fourpalms.o 14655 [ + + ]: 56 : if ($5)
8017 tgl@sss.pgh.pa.us 14656 : 44 : $$ = SystemTypeName("timestamptz");
14657 : : else
14658 : 12 : $$ = SystemTypeName("timestamp");
5708 14659 : 56 : $$->typmods = list_make1(makeIntConst($3, @3));
6315 14660 : 56 : $$->location = @1;
14661 : : }
14662 : : | TIMESTAMP opt_timezone
14663 : : {
8234 lockhart@fourpalms.o 14664 [ + + ]: 2281 : if ($2)
8017 tgl@sss.pgh.pa.us 14665 : 651 : $$ = SystemTypeName("timestamptz");
14666 : : else
14667 : 1630 : $$ = SystemTypeName("timestamp");
6315 14668 : 2281 : $$->location = @1;
14669 : : }
14670 : : | TIME '(' Iconst ')' opt_timezone
14671 : : {
8229 lockhart@fourpalms.o 14672 [ + + ]: 11 : if ($5)
8017 tgl@sss.pgh.pa.us 14673 : 4 : $$ = SystemTypeName("timetz");
14674 : : else
14675 : 7 : $$ = SystemTypeName("time");
5708 14676 : 11 : $$->typmods = list_make1(makeIntConst($3, @3));
6315 14677 : 11 : $$->location = @1;
14678 : : }
14679 : : | TIME opt_timezone
14680 : : {
8797 lockhart@fourpalms.o 14681 [ + + ]: 1026 : if ($2)
8017 tgl@sss.pgh.pa.us 14682 : 133 : $$ = SystemTypeName("timetz");
14683 : : else
14684 : 893 : $$ = SystemTypeName("time");
6315 14685 : 1026 : $$->location = @1;
14686 : : }
14687 : : ;
14688 : :
14689 : : ConstInterval:
14690 : : INTERVAL
14691 : : {
14692 : 3254 : $$ = SystemTypeName("interval");
14693 : 3254 : $$->location = @1;
14694 : : }
14695 : : ;
14696 : :
14697 : : opt_timezone:
2433 peter_e@gmx.net 14698 : 832 : WITH_LA TIME ZONE { $$ = true; }
376 alvherre@alvh.no-ip. 14699 : 253 : | WITHOUT_LA TIME ZONE { $$ = false; }
2433 peter_e@gmx.net 14700 : 2289 : | /*EMPTY*/ { $$ = false; }
14701 : : ;
14702 : :
14703 : : opt_interval:
14704 : : YEAR_P
5694 tgl@sss.pgh.pa.us 14705 : 6 : { $$ = list_make1(makeIntConst(INTERVAL_MASK(YEAR), @1)); }
14706 : : | MONTH_P
14707 : 9 : { $$ = list_make1(makeIntConst(INTERVAL_MASK(MONTH), @1)); }
14708 : : | DAY_P
14709 : 9 : { $$ = list_make1(makeIntConst(INTERVAL_MASK(DAY), @1)); }
14710 : : | HOUR_P
14711 : 6 : { $$ = list_make1(makeIntConst(INTERVAL_MASK(HOUR), @1)); }
14712 : : | MINUTE_P
14713 : 6 : { $$ = list_make1(makeIntConst(INTERVAL_MASK(MINUTE), @1)); }
14714 : : | interval_second
14715 : 18 : { $$ = $1; }
14716 : : | YEAR_P TO MONTH_P
14717 : : {
14718 : 9 : $$ = list_make1(makeIntConst(INTERVAL_MASK(YEAR) |
14719 : : INTERVAL_MASK(MONTH), @1));
14720 : : }
14721 : : | DAY_P TO HOUR_P
14722 : : {
14723 : 12 : $$ = list_make1(makeIntConst(INTERVAL_MASK(DAY) |
14724 : : INTERVAL_MASK(HOUR), @1));
14725 : : }
14726 : : | DAY_P TO MINUTE_P
14727 : : {
14728 : 12 : $$ = list_make1(makeIntConst(INTERVAL_MASK(DAY) |
14729 : : INTERVAL_MASK(HOUR) |
14730 : : INTERVAL_MASK(MINUTE), @1));
14731 : : }
14732 : : | DAY_P TO interval_second
14733 : : {
14734 : 24 : $$ = $3;
14735 : 24 : linitial($$) = makeIntConst(INTERVAL_MASK(DAY) |
14736 : : INTERVAL_MASK(HOUR) |
14737 : : INTERVAL_MASK(MINUTE) |
14738 : 24 : INTERVAL_MASK(SECOND), @1);
14739 : : }
14740 : : | HOUR_P TO MINUTE_P
14741 : : {
14742 : 9 : $$ = list_make1(makeIntConst(INTERVAL_MASK(HOUR) |
14743 : : INTERVAL_MASK(MINUTE), @1));
14744 : : }
14745 : : | HOUR_P TO interval_second
14746 : : {
14747 : 18 : $$ = $3;
14748 : 18 : linitial($$) = makeIntConst(INTERVAL_MASK(HOUR) |
14749 : : INTERVAL_MASK(MINUTE) |
14750 : 18 : INTERVAL_MASK(SECOND), @1);
14751 : : }
14752 : : | MINUTE_P TO interval_second
14753 : : {
14754 : 33 : $$ = $3;
14755 : 33 : linitial($$) = makeIntConst(INTERVAL_MASK(MINUTE) |
14756 : 33 : INTERVAL_MASK(SECOND), @1);
14757 : : }
14758 : : | /*EMPTY*/
14759 : 3077 : { $$ = NIL; }
14760 : : ;
14761 : :
14762 : : interval_second:
14763 : : SECOND_P
14764 : : {
14765 : 51 : $$ = list_make1(makeIntConst(INTERVAL_MASK(SECOND), @1));
14766 : : }
14767 : : | SECOND_P '(' Iconst ')'
14768 : : {
14769 : 42 : $$ = list_make2(makeIntConst(INTERVAL_MASK(SECOND), @1),
14770 : : makeIntConst($3, @3));
14771 : : }
14772 : : ;
14773 : :
14774 : : JsonType:
14775 : : JSON
14776 : : {
269 amitlan@postgresql.o 14777 :GNC 946 : $$ = SystemTypeName("json");
14778 : 946 : $$->location = @1;
14779 : : }
14780 : : ;
14781 : :
14782 : : /*****************************************************************************
14783 : : *
14784 : : * expression grammar
14785 : : *
14786 : : *****************************************************************************/
14787 : :
14788 : : /*
14789 : : * General expressions
14790 : : * This is the heart of the expression syntax.
14791 : : *
14792 : : * We have two expression types: a_expr is the unrestricted kind, and
14793 : : * b_expr is a subset that must be used in some places to avoid shift/reduce
14794 : : * conflicts. For example, we can't do BETWEEN as "BETWEEN a_expr AND a_expr"
14795 : : * because that use of AND conflicts with AND as a boolean operator. So,
14796 : : * b_expr is used in BETWEEN and we remove boolean keywords from b_expr.
14797 : : *
14798 : : * Note that '(' a_expr ')' is a b_expr, so an unrestricted expression can
14799 : : * always be used by surrounding it with parens.
14800 : : *
14801 : : * c_expr is all the productions that are common to a_expr and b_expr;
14802 : : * it's factored out just to eliminate redundant coding.
14803 : : *
14804 : : * Be careful of productions involving more than one terminal token.
14805 : : * By default, bison will assign such productions the precedence of their
14806 : : * last terminal, but in nearly all cases you want it to be the precedence
14807 : : * of the first terminal instead; otherwise you will not get the behavior
14808 : : * you expect! So we use %prec annotations freely to set precedences.
14809 : : */
7972 bruce@momjian.us 14810 :CBC 1683613 : a_expr: c_expr { $$ = $1; }
14811 : : | a_expr TYPECAST Typename
5708 tgl@sss.pgh.pa.us 14812 : 88029 : { $$ = makeTypeCast($1, $3, @2); }
14813 : : | a_expr COLLATE any_name
14814 : : {
4785 14815 : 3841 : CollateClause *n = makeNode(CollateClause);
14816 : :
4783 14817 : 3841 : n->arg = $1;
14818 : 3841 : n->collname = $3;
4785 14819 : 3841 : n->location = @2;
14820 : 3841 : $$ = (Node *) n;
14821 : : }
14822 : : | a_expr AT TIME ZONE a_expr %prec AT
14823 : : {
3940 rhaas@postgresql.org 14824 : 198 : $$ = (Node *) makeFuncCall(SystemFuncName("timezone"),
14825 : 198 : list_make2($5, $1),
14826 : : COERCE_SQL_SYNTAX,
14827 : 198 : @2);
14828 : : }
14829 : : | a_expr AT LOCAL %prec AT
14830 : : {
184 michael@paquier.xyz 14831 :GNC 21 : $$ = (Node *) makeFuncCall(SystemFuncName("timezone"),
14832 : 21 : list_make1($1),
14833 : : COERCE_SQL_SYNTAX,
14834 : : -1);
14835 : : }
14836 : : /*
14837 : : * These operators must be called out explicitly in order to make use
14838 : : * of bison's automatic operator-precedence handling. All other
14839 : : * operator names are handled by the generic productions using "Op",
14840 : : * below; and all those operators will have the same precedence.
14841 : : *
14842 : : * If you add more explicitly-known operators, be sure to add them
14843 : : * also to b_expr and to the MathOp list below.
14844 : : */
14845 : : | '+' a_expr %prec UMINUS
6606 tgl@sss.pgh.pa.us 14846 :CBC 6 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2, @1); }
14847 : : | '-' a_expr %prec UMINUS
14848 : 15289 : { $$ = doNegate($2, @1); }
14849 : : | a_expr '+' a_expr
14850 : 6461 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", $1, $3, @2); }
14851 : : | a_expr '-' a_expr
14852 : 2989 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "-", $1, $3, @2); }
14853 : : | a_expr '*' a_expr
14854 : 4259 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "*", $1, $3, @2); }
14855 : : | a_expr '/' a_expr
14856 : 1905 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "/", $1, $3, @2); }
14857 : : | a_expr '%' a_expr
14858 : 1301 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, $3, @2); }
14859 : : | a_expr '^' a_expr
14860 : 227 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, $3, @2); }
14861 : : | a_expr '<' a_expr
14862 : 12238 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $3, @2); }
14863 : : | a_expr '>' a_expr
14864 : 17935 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $3, @2); }
14865 : : | a_expr '=' a_expr
14866 : 173722 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "=", $1, $3, @2); }
14867 : : | a_expr LESS_EQUALS a_expr
3322 14868 : 2492 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $3, @2); }
14869 : : | a_expr GREATER_EQUALS a_expr
14870 : 2443 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $3, @2); }
14871 : : | a_expr NOT_EQUALS a_expr
14872 : 18877 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<>", $1, $3, @2); }
14873 : :
14874 : : | a_expr qual_Op a_expr %prec Op
6606 14875 : 27051 : { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, $3, @2); }
14876 : : | qual_Op a_expr %prec Op
14877 : 96 : { $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2, @1); }
14878 : :
14879 : : | a_expr AND a_expr
3590 14880 : 102865 : { $$ = makeAndExpr($1, $3, @2); }
14881 : : | a_expr OR a_expr
14882 : 8024 : { $$ = makeOrExpr($1, $3, @2); }
14883 : : | NOT a_expr
14884 : 6887 : { $$ = makeNotExpr($2, @1); }
14885 : : | NOT_LA a_expr %prec NOT
3322 tgl@sss.pgh.pa.us 14886 :UBC 0 : { $$ = makeNotExpr($2, @1); }
14887 : :
14888 : : | a_expr LIKE a_expr
14889 : : {
3338 tgl@sss.pgh.pa.us 14890 :CBC 896 : $$ = (Node *) makeSimpleA_Expr(AEXPR_LIKE, "~~",
14891 : 896 : $1, $3, @2);
14892 : : }
14893 : : | a_expr LIKE a_expr ESCAPE a_expr %prec LIKE
14894 : : {
702 peter@eisentraut.org 14895 : 48 : FuncCall *n = makeFuncCall(SystemFuncName("like_escape"),
14896 : 48 : list_make2($3, $5),
14897 : : COERCE_EXPLICIT_CALL,
14898 : 48 : @2);
3338 tgl@sss.pgh.pa.us 14899 : 48 : $$ = (Node *) makeSimpleA_Expr(AEXPR_LIKE, "~~",
14900 : 48 : $1, (Node *) n, @2);
14901 : : }
14902 : : | a_expr NOT_LA LIKE a_expr %prec NOT_LA
14903 : : {
14904 : 107 : $$ = (Node *) makeSimpleA_Expr(AEXPR_LIKE, "!~~",
14905 : 107 : $1, $4, @2);
14906 : : }
14907 : : | a_expr NOT_LA LIKE a_expr ESCAPE a_expr %prec NOT_LA
14908 : : {
702 peter@eisentraut.org 14909 : 48 : FuncCall *n = makeFuncCall(SystemFuncName("like_escape"),
14910 : 48 : list_make2($4, $6),
14911 : : COERCE_EXPLICIT_CALL,
14912 : 48 : @2);
3338 tgl@sss.pgh.pa.us 14913 : 48 : $$ = (Node *) makeSimpleA_Expr(AEXPR_LIKE, "!~~",
14914 : 48 : $1, (Node *) n, @2);
14915 : : }
14916 : : | a_expr ILIKE a_expr
14917 : : {
14918 : 86 : $$ = (Node *) makeSimpleA_Expr(AEXPR_ILIKE, "~~*",
14919 : 86 : $1, $3, @2);
14920 : : }
14921 : : | a_expr ILIKE a_expr ESCAPE a_expr %prec ILIKE
14922 : : {
702 peter@eisentraut.org 14923 :UBC 0 : FuncCall *n = makeFuncCall(SystemFuncName("like_escape"),
14924 : 0 : list_make2($3, $5),
14925 : : COERCE_EXPLICIT_CALL,
14926 : 0 : @2);
3338 tgl@sss.pgh.pa.us 14927 : 0 : $$ = (Node *) makeSimpleA_Expr(AEXPR_ILIKE, "~~*",
14928 : 0 : $1, (Node *) n, @2);
14929 : : }
14930 : : | a_expr NOT_LA ILIKE a_expr %prec NOT_LA
14931 : : {
3338 tgl@sss.pgh.pa.us 14932 :CBC 15 : $$ = (Node *) makeSimpleA_Expr(AEXPR_ILIKE, "!~~*",
14933 : 15 : $1, $4, @2);
14934 : : }
14935 : : | a_expr NOT_LA ILIKE a_expr ESCAPE a_expr %prec NOT_LA
14936 : : {
702 peter@eisentraut.org 14937 :UBC 0 : FuncCall *n = makeFuncCall(SystemFuncName("like_escape"),
14938 : 0 : list_make2($4, $6),
14939 : : COERCE_EXPLICIT_CALL,
14940 : 0 : @2);
3338 tgl@sss.pgh.pa.us 14941 : 0 : $$ = (Node *) makeSimpleA_Expr(AEXPR_ILIKE, "!~~*",
14942 : 0 : $1, (Node *) n, @2);
14943 : : }
14944 : :
14945 : : | a_expr SIMILAR TO a_expr %prec SIMILAR
14946 : : {
702 peter@eisentraut.org 14947 :CBC 20 : FuncCall *n = makeFuncCall(SystemFuncName("similar_to_escape"),
14948 : 20 : list_make1($4),
14949 : : COERCE_EXPLICIT_CALL,
14950 : 20 : @2);
3338 tgl@sss.pgh.pa.us 14951 : 20 : $$ = (Node *) makeSimpleA_Expr(AEXPR_SIMILAR, "~",
14952 : 20 : $1, (Node *) n, @2);
14953 : : }
14954 : : | a_expr SIMILAR TO a_expr ESCAPE a_expr %prec SIMILAR
14955 : : {
702 peter@eisentraut.org 14956 : 15 : FuncCall *n = makeFuncCall(SystemFuncName("similar_to_escape"),
14957 : 15 : list_make2($4, $6),
14958 : : COERCE_EXPLICIT_CALL,
14959 : 15 : @2);
3338 tgl@sss.pgh.pa.us 14960 : 15 : $$ = (Node *) makeSimpleA_Expr(AEXPR_SIMILAR, "~",
14961 : 15 : $1, (Node *) n, @2);
14962 : : }
14963 : : | a_expr NOT_LA SIMILAR TO a_expr %prec NOT_LA
14964 : : {
702 peter@eisentraut.org 14965 :UBC 0 : FuncCall *n = makeFuncCall(SystemFuncName("similar_to_escape"),
14966 : 0 : list_make1($5),
14967 : : COERCE_EXPLICIT_CALL,
14968 : 0 : @2);
3338 tgl@sss.pgh.pa.us 14969 : 0 : $$ = (Node *) makeSimpleA_Expr(AEXPR_SIMILAR, "!~",
14970 : 0 : $1, (Node *) n, @2);
14971 : : }
14972 : : | a_expr NOT_LA SIMILAR TO a_expr ESCAPE a_expr %prec NOT_LA
14973 : : {
702 peter@eisentraut.org 14974 : 0 : FuncCall *n = makeFuncCall(SystemFuncName("similar_to_escape"),
14975 : 0 : list_make2($5, $7),
14976 : : COERCE_EXPLICIT_CALL,
14977 : 0 : @2);
3338 tgl@sss.pgh.pa.us 14978 : 0 : $$ = (Node *) makeSimpleA_Expr(AEXPR_SIMILAR, "!~",
14979 : 0 : $1, (Node *) n, @2);
14980 : : }
14981 : :
14982 : : /* NullTest clause
14983 : : * Define SQL-style Null test clause.
14984 : : * Allow two forms described in the standard:
14985 : : * a IS NULL
14986 : : * a IS NOT NULL
14987 : : * Allow two SQL extensions
14988 : : * a ISNULL
14989 : : * a NOTNULL
14990 : : */
14991 : : | a_expr IS NULL_P %prec IS
14992 : : {
702 peter@eisentraut.org 14993 :CBC 2408 : NullTest *n = makeNode(NullTest);
14994 : :
6408 tgl@sss.pgh.pa.us 14995 : 2408 : n->arg = (Expr *) $1;
14996 : 2408 : n->nulltesttype = IS_NULL;
3339 14997 : 2408 : n->location = @2;
702 peter@eisentraut.org 14998 : 2408 : $$ = (Node *) n;
14999 : : }
15000 : : | a_expr ISNULL
15001 : : {
15002 : 48 : NullTest *n = makeNode(NullTest);
15003 : :
6408 tgl@sss.pgh.pa.us 15004 : 48 : n->arg = (Expr *) $1;
15005 : 48 : n->nulltesttype = IS_NULL;
3339 15006 : 48 : n->location = @2;
702 peter@eisentraut.org 15007 : 48 : $$ = (Node *) n;
15008 : : }
15009 : : | a_expr IS NOT NULL_P %prec IS
15010 : : {
15011 : 5366 : NullTest *n = makeNode(NullTest);
15012 : :
6408 tgl@sss.pgh.pa.us 15013 : 5366 : n->arg = (Expr *) $1;
15014 : 5366 : n->nulltesttype = IS_NOT_NULL;
3339 15015 : 5366 : n->location = @2;
702 peter@eisentraut.org 15016 : 5366 : $$ = (Node *) n;
15017 : : }
15018 : : | a_expr NOTNULL
15019 : : {
15020 : 3 : NullTest *n = makeNode(NullTest);
15021 : :
6408 tgl@sss.pgh.pa.us 15022 : 3 : n->arg = (Expr *) $1;
15023 : 3 : n->nulltesttype = IS_NOT_NULL;
3339 15024 : 3 : n->location = @2;
702 peter@eisentraut.org 15025 : 3 : $$ = (Node *) n;
15026 : : }
15027 : : | row OVERLAPS row
15028 : : {
3708 tgl@sss.pgh.pa.us 15029 [ - + ]: 384 : if (list_length($1) != 2)
3708 tgl@sss.pgh.pa.us 15030 [ # # ]:UBC 0 : ereport(ERROR,
15031 : : (errcode(ERRCODE_SYNTAX_ERROR),
15032 : : errmsg("wrong number of parameters on left side of OVERLAPS expression"),
15033 : : parser_errposition(@1)));
3708 tgl@sss.pgh.pa.us 15034 [ - + ]:CBC 384 : if (list_length($3) != 2)
3708 tgl@sss.pgh.pa.us 15035 [ # # ]:UBC 0 : ereport(ERROR,
15036 : : (errcode(ERRCODE_SYNTAX_ERROR),
15037 : : errmsg("wrong number of parameters on right side of OVERLAPS expression"),
15038 : : parser_errposition(@3)));
3708 tgl@sss.pgh.pa.us 15039 :CBC 384 : $$ = (Node *) makeFuncCall(SystemFuncName("overlaps"),
15040 : 384 : list_concat($1, $3),
15041 : : COERCE_SQL_SYNTAX,
15042 : 384 : @2);
15043 : : }
15044 : : | a_expr IS TRUE_P %prec IS
15045 : : {
8335 15046 : 188 : BooleanTest *b = makeNode(BooleanTest);
15047 : :
7794 15048 : 188 : b->arg = (Expr *) $1;
8335 15049 : 188 : b->booltesttype = IS_TRUE;
3339 15050 : 188 : b->location = @2;
702 peter@eisentraut.org 15051 : 188 : $$ = (Node *) b;
15052 : : }
15053 : : | a_expr IS NOT TRUE_P %prec IS
15054 : : {
8335 tgl@sss.pgh.pa.us 15055 : 69 : BooleanTest *b = makeNode(BooleanTest);
15056 : :
7794 15057 : 69 : b->arg = (Expr *) $1;
8335 15058 : 69 : b->booltesttype = IS_NOT_TRUE;
3339 15059 : 69 : b->location = @2;
702 peter@eisentraut.org 15060 : 69 : $$ = (Node *) b;
15061 : : }
15062 : : | a_expr IS FALSE_P %prec IS
15063 : : {
8335 tgl@sss.pgh.pa.us 15064 : 57 : BooleanTest *b = makeNode(BooleanTest);
15065 : :
7794 15066 : 57 : b->arg = (Expr *) $1;
8335 15067 : 57 : b->booltesttype = IS_FALSE;
3339 15068 : 57 : b->location = @2;
702 peter@eisentraut.org 15069 : 57 : $$ = (Node *) b;
15070 : : }
15071 : : | a_expr IS NOT FALSE_P %prec IS
15072 : : {
8335 tgl@sss.pgh.pa.us 15073 : 45 : BooleanTest *b = makeNode(BooleanTest);
15074 : :
7794 15075 : 45 : b->arg = (Expr *) $1;
8335 15076 : 45 : b->booltesttype = IS_NOT_FALSE;
3339 15077 : 45 : b->location = @2;
702 peter@eisentraut.org 15078 : 45 : $$ = (Node *) b;
15079 : : }
15080 : : | a_expr IS UNKNOWN %prec IS
15081 : : {
8335 tgl@sss.pgh.pa.us 15082 : 26 : BooleanTest *b = makeNode(BooleanTest);
15083 : :
7794 15084 : 26 : b->arg = (Expr *) $1;
8335 15085 : 26 : b->booltesttype = IS_UNKNOWN;
3339 15086 : 26 : b->location = @2;
702 peter@eisentraut.org 15087 : 26 : $$ = (Node *) b;
15088 : : }
15089 : : | a_expr IS NOT UNKNOWN %prec IS
15090 : : {
8335 tgl@sss.pgh.pa.us 15091 : 24 : BooleanTest *b = makeNode(BooleanTest);
15092 : :
7794 15093 : 24 : b->arg = (Expr *) $1;
8335 15094 : 24 : b->booltesttype = IS_NOT_UNKNOWN;
3339 15095 : 24 : b->location = @2;
702 peter@eisentraut.org 15096 : 24 : $$ = (Node *) b;
15097 : : }
15098 : : | a_expr IS DISTINCT FROM a_expr %prec IS
15099 : : {
6606 tgl@sss.pgh.pa.us 15100 : 443 : $$ = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $5, @2);
15101 : : }
15102 : : | a_expr IS NOT DISTINCT FROM a_expr %prec IS
15103 : : {
2817 15104 : 31 : $$ = (Node *) makeSimpleA_Expr(AEXPR_NOT_DISTINCT, "=", $1, $6, @2);
15105 : : }
15106 : : | a_expr BETWEEN opt_asymmetric b_expr AND a_expr %prec BETWEEN
15107 : : {
3339 15108 : 231 : $$ = (Node *) makeSimpleA_Expr(AEXPR_BETWEEN,
15109 : : "BETWEEN",
15110 : 231 : $1,
15111 : 231 : (Node *) list_make2($4, $6),
15112 : 231 : @2);
15113 : : }
15114 : : | a_expr NOT_LA BETWEEN opt_asymmetric b_expr AND a_expr %prec NOT_LA
15115 : : {
15116 : 6 : $$ = (Node *) makeSimpleA_Expr(AEXPR_NOT_BETWEEN,
15117 : : "NOT BETWEEN",
15118 : 6 : $1,
15119 : 6 : (Node *) list_make2($5, $7),
15120 : 6 : @2);
15121 : : }
15122 : : | a_expr BETWEEN SYMMETRIC b_expr AND a_expr %prec BETWEEN
15123 : : {
15124 : 6 : $$ = (Node *) makeSimpleA_Expr(AEXPR_BETWEEN_SYM,
15125 : : "BETWEEN SYMMETRIC",
15126 : 6 : $1,
15127 : 6 : (Node *) list_make2($4, $6),
15128 : 6 : @2);
15129 : : }
15130 : : | a_expr NOT_LA BETWEEN SYMMETRIC b_expr AND a_expr %prec NOT_LA
15131 : : {
15132 : 6 : $$ = (Node *) makeSimpleA_Expr(AEXPR_NOT_BETWEEN_SYM,
15133 : : "NOT BETWEEN SYMMETRIC",
15134 : 6 : $1,
15135 : 6 : (Node *) list_make2($5, $7),
15136 : 6 : @2);
15137 : : }
15138 : : | a_expr IN_P in_expr
15139 : : {
15140 : : /* in_expr returns a SubLink or a list of a_exprs */
8490 15141 [ + + ]: 8500 : if (IsA($3, SubLink))
15142 : : {
15143 : : /* generate foo = ANY (subquery) */
702 peter@eisentraut.org 15144 : 1136 : SubLink *n = (SubLink *) $3;
15145 : :
6712 tgl@sss.pgh.pa.us 15146 : 1136 : n->subLinkType = ANY_SUBLINK;
3588 15147 : 1136 : n->subLinkId = 0;
6682 15148 : 1136 : n->testexpr = $1;
3338 15149 : 1136 : n->operName = NIL; /* show it's IN not = ANY */
5708 15150 : 1136 : n->location = @2;
702 peter@eisentraut.org 15151 : 1136 : $$ = (Node *) n;
15152 : : }
15153 : : else
15154 : : {
15155 : : /* generate scalar IN expression */
6606 tgl@sss.pgh.pa.us 15156 : 7364 : $$ = (Node *) makeSimpleA_Expr(AEXPR_IN, "=", $1, $3, @2);
15157 : : }
15158 : : }
15159 : : | a_expr NOT_LA IN_P in_expr %prec NOT_LA
15160 : : {
15161 : : /* in_expr returns a SubLink or a list of a_exprs */
8490 15162 [ + + ]: 1114 : if (IsA($4, SubLink))
15163 : : {
15164 : : /* generate NOT (foo = ANY (subquery)) */
15165 : : /* Make an = ANY node */
702 peter@eisentraut.org 15166 : 60 : SubLink *n = (SubLink *) $4;
15167 : :
7766 tgl@sss.pgh.pa.us 15168 : 60 : n->subLinkType = ANY_SUBLINK;
3588 15169 : 60 : n->subLinkId = 0;
6682 15170 : 60 : n->testexpr = $1;
3338 15171 : 60 : n->operName = NIL; /* show it's IN not = ANY */
15172 : 60 : n->location = @2;
15173 : : /* Stick a NOT on top; must have same parse location */
3590 15174 : 60 : $$ = makeNotExpr((Node *) n, @2);
15175 : : }
15176 : : else
15177 : : {
15178 : : /* generate scalar NOT IN expression */
6606 15179 : 1054 : $$ = (Node *) makeSimpleA_Expr(AEXPR_IN, "<>", $1, $4, @2);
15180 : : }
15181 : : }
15182 : : | a_expr subquery_Op sub_type select_with_parens %prec Op
15183 : : {
702 peter@eisentraut.org 15184 : 83 : SubLink *n = makeNode(SubLink);
15185 : :
8917 tgl@sss.pgh.pa.us 15186 : 83 : n->subLinkType = $3;
3588 15187 : 83 : n->subLinkId = 0;
6682 15188 : 83 : n->testexpr = $1;
7765 15189 : 83 : n->operName = $2;
8490 15190 : 83 : n->subselect = $4;
5708 15191 : 83 : n->location = @2;
702 peter@eisentraut.org 15192 : 83 : $$ = (Node *) n;
15193 : : }
15194 : : | a_expr subquery_Op sub_type '(' a_expr ')' %prec Op
15195 : : {
7595 tgl@sss.pgh.pa.us 15196 [ + + ]: 7261 : if ($3 == ANY_SUBLINK)
6606 15197 : 7111 : $$ = (Node *) makeA_Expr(AEXPR_OP_ANY, $2, $1, $5, @2);
15198 : : else
15199 : 150 : $$ = (Node *) makeA_Expr(AEXPR_OP_ALL, $2, $1, $5, @2);
15200 : : }
15201 : : | UNIQUE opt_unique_null_treatment select_with_parens
15202 : : {
15203 : : /* Not sure how to get rid of the parentheses
15204 : : * but there are lots of shift/reduce errors without them.
15205 : : *
15206 : : * Should be able to implement this by plopping the entire
15207 : : * select into a node, then transforming the target expressions
15208 : : * from whatever they are into count(*), and testing the
15209 : : * entire result equal to one.
15210 : : * But, will probably implement a separate node in the executor.
15211 : : */
7575 tgl@sss.pgh.pa.us 15212 [ # # ]:UBC 0 : ereport(ERROR,
15213 : : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15214 : : errmsg("UNIQUE predicate is not yet implemented"),
15215 : : parser_errposition(@1)));
15216 : : }
15217 : : | a_expr IS DOCUMENT_P %prec IS
15218 : : {
5708 tgl@sss.pgh.pa.us 15219 :CBC 9 : $$ = makeXmlExpr(IS_DOCUMENT, NULL, NIL,
15220 : 9 : list_make1($1), @2);
15221 : : }
15222 : : | a_expr IS NOT DOCUMENT_P %prec IS
15223 : : {
3590 15224 : 9 : $$ = makeNotExpr(makeXmlExpr(IS_DOCUMENT, NULL, NIL,
15225 : 9 : list_make1($1), @2),
15226 : 9 : @2);
15227 : : }
15228 : : | a_expr IS NORMALIZED %prec IS
15229 : : {
1257 15230 : 6 : $$ = (Node *) makeFuncCall(SystemFuncName("is_normalized"),
15231 : 6 : list_make1($1),
15232 : : COERCE_SQL_SYNTAX,
15233 : 6 : @2);
15234 : : }
15235 : : | a_expr IS unicode_normal_form NORMALIZED %prec IS
15236 : : {
15237 : 18 : $$ = (Node *) makeFuncCall(SystemFuncName("is_normalized"),
15238 : 18 : list_make2($1, makeStringConst($3, @3)),
15239 : : COERCE_SQL_SYNTAX,
15240 : 18 : @2);
15241 : : }
15242 : : | a_expr IS NOT NORMALIZED %prec IS
15243 : : {
1257 tgl@sss.pgh.pa.us 15244 :UBC 0 : $$ = makeNotExpr((Node *) makeFuncCall(SystemFuncName("is_normalized"),
15245 : 0 : list_make1($1),
15246 : : COERCE_SQL_SYNTAX,
15247 : 0 : @2),
15248 : 0 : @2);
15249 : : }
15250 : : | a_expr IS NOT unicode_normal_form NORMALIZED %prec IS
15251 : : {
15252 : 0 : $$ = makeNotExpr((Node *) makeFuncCall(SystemFuncName("is_normalized"),
15253 : 0 : list_make2($1, makeStringConst($4, @4)),
15254 : : COERCE_SQL_SYNTAX,
15255 : 0 : @2),
15256 : 0 : @2);
15257 : : }
15258 : : | a_expr IS json_predicate_type_constraint
15259 : : json_key_uniqueness_constraint_opt %prec IS
15260 : : {
380 alvherre@alvh.no-ip. 15261 :CBC 145 : JsonFormat *format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1);
15262 : :
15263 : 145 : $$ = makeJsonIsPredicate($1, format, $3, $4, @1);
15264 : : }
15265 : : /*
15266 : : * Required by SQL/JSON, but there are conflicts
15267 : : | a_expr
15268 : : json_format_clause
15269 : : IS json_predicate_type_constraint
15270 : : json_key_uniqueness_constraint_opt %prec IS
15271 : : {
15272 : : $$ = makeJsonIsPredicate($1, $2, $4, $5, @1);
15273 : : }
15274 : : */
15275 : : | a_expr IS NOT
15276 : : json_predicate_type_constraint
15277 : : json_key_uniqueness_constraint_opt %prec IS
15278 : : {
15279 : 22 : JsonFormat *format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1);
15280 : :
15281 : 22 : $$ = makeNotExpr(makeJsonIsPredicate($1, format, $4, $5, @1), @1);
15282 : : }
15283 : : /*
15284 : : * Required by SQL/JSON, but there are conflicts
15285 : : | a_expr
15286 : : json_format_clause
15287 : : IS NOT
15288 : : json_predicate_type_constraint
15289 : : json_key_uniqueness_constraint_opt %prec IS
15290 : : {
15291 : : $$ = makeNotExpr(makeJsonIsPredicate($1, $2, $5, $6, @1), @1);
15292 : : }
15293 : : */
15294 : : | DEFAULT
15295 : : {
15296 : : /*
15297 : : * The SQL spec only allows DEFAULT in "contextually typed
15298 : : * expressions", but for us, it's easier to allow it in
15299 : : * any a_expr and then throw error during parse analysis
15300 : : * if it's in an inappropriate context. This way also
15301 : : * lets us say something smarter than "syntax error".
15302 : : */
2700 tgl@sss.pgh.pa.us 15303 : 731 : SetToDefault *n = makeNode(SetToDefault);
15304 : :
15305 : : /* parse analysis will fill in the rest */
15306 : 731 : n->location = @1;
702 peter@eisentraut.org 15307 : 731 : $$ = (Node *) n;
15308 : : }
15309 : : ;
15310 : :
15311 : : /*
15312 : : * Restricted expressions
15313 : : *
15314 : : * b_expr is a subset of the complete expression syntax defined by a_expr.
15315 : : *
15316 : : * Presently, AND, NOT, IS, and IN are the a_expr keywords that would
15317 : : * cause trouble in the places where b_expr is used. For simplicity, we
15318 : : * just eliminate all the boolean-keyword-operator productions from b_expr.
15319 : : */
15320 : : b_expr: c_expr
7972 bruce@momjian.us 15321 : 1734 : { $$ = $1; }
15322 : : | b_expr TYPECAST Typename
5708 tgl@sss.pgh.pa.us 15323 : 67 : { $$ = makeTypeCast($1, $3, @2); }
15324 : : | '+' b_expr %prec UMINUS
6606 tgl@sss.pgh.pa.us 15325 :UBC 0 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2, @1); }
15326 : : | '-' b_expr %prec UMINUS
6606 tgl@sss.pgh.pa.us 15327 :CBC 33 : { $$ = doNegate($2, @1); }
15328 : : | b_expr '+' b_expr
15329 : 15 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", $1, $3, @2); }
15330 : : | b_expr '-' b_expr
15331 : 6 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "-", $1, $3, @2); }
15332 : : | b_expr '*' b_expr
15333 : 6 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "*", $1, $3, @2); }
15334 : : | b_expr '/' b_expr
6606 tgl@sss.pgh.pa.us 15335 :UBC 0 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "/", $1, $3, @2); }
15336 : : | b_expr '%' b_expr
15337 : 0 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, $3, @2); }
15338 : : | b_expr '^' b_expr
6606 tgl@sss.pgh.pa.us 15339 :CBC 3 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, $3, @2); }
15340 : : | b_expr '<' b_expr
6606 tgl@sss.pgh.pa.us 15341 :UBC 0 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $3, @2); }
15342 : : | b_expr '>' b_expr
15343 : 0 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $3, @2); }
15344 : : | b_expr '=' b_expr
15345 : 0 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "=", $1, $3, @2); }
15346 : : | b_expr LESS_EQUALS b_expr
3322 15347 : 0 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $3, @2); }
15348 : : | b_expr GREATER_EQUALS b_expr
15349 : 0 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $3, @2); }
15350 : : | b_expr NOT_EQUALS b_expr
15351 : 0 : { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<>", $1, $3, @2); }
15352 : : | b_expr qual_Op b_expr %prec Op
6606 tgl@sss.pgh.pa.us 15353 :CBC 6 : { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, $3, @2); }
15354 : : | qual_Op b_expr %prec Op
6606 tgl@sss.pgh.pa.us 15355 :UBC 0 : { $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2, @1); }
15356 : : | b_expr IS DISTINCT FROM b_expr %prec IS
15357 : : {
15358 : 0 : $$ = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $5, @2);
15359 : : }
15360 : : | b_expr IS NOT DISTINCT FROM b_expr %prec IS
15361 : : {
2817 15362 : 0 : $$ = (Node *) makeSimpleA_Expr(AEXPR_NOT_DISTINCT, "=", $1, $6, @2);
15363 : : }
15364 : : | b_expr IS DOCUMENT_P %prec IS
15365 : : {
5708 15366 : 0 : $$ = makeXmlExpr(IS_DOCUMENT, NULL, NIL,
15367 : 0 : list_make1($1), @2);
15368 : : }
15369 : : | b_expr IS NOT DOCUMENT_P %prec IS
15370 : : {
3590 15371 : 0 : $$ = makeNotExpr(makeXmlExpr(IS_DOCUMENT, NULL, NIL,
15372 : 0 : list_make1($1), @2),
15373 : 0 : @2);
15374 : : }
15375 : : ;
15376 : :
15377 : : /*
15378 : : * Productions that can be used in both a_expr and b_expr.
15379 : : *
15380 : : * Note: productions that refer recursively to a_expr or b_expr mostly
15381 : : * cannot appear here. However, it's OK to refer to a_exprs that occur
15382 : : * inside parentheses, such as function arguments; that cannot introduce
15383 : : * ambiguity to the b_expr syntax.
15384 : : */
7249 tgl@sss.pgh.pa.us 15385 :CBC 763330 : c_expr: columnref { $$ = $1; }
7972 bruce@momjian.us 15386 : 561473 : | AexprConst { $$ = $1; }
15387 : : | PARAM opt_indirection
15388 : : {
702 peter@eisentraut.org 15389 : 81485 : ParamRef *p = makeNode(ParamRef);
15390 : :
7249 tgl@sss.pgh.pa.us 15391 : 81485 : p->number = $1;
5708 15392 : 81485 : p->location = @1;
7249 15393 [ + + ]: 81485 : if ($2)
15394 : : {
15395 : 563 : A_Indirection *n = makeNode(A_Indirection);
15396 : :
15397 : 563 : n->arg = (Node *) p;
5389 15398 : 563 : n->indirection = check_indirection($2, yyscanner);
7249 15399 : 563 : $$ = (Node *) n;
15400 : : }
15401 : : else
15402 : 80922 : $$ = (Node *) p;
15403 : : }
15404 : : | '(' a_expr ')' opt_indirection
15405 : : {
7677 15406 [ + + ]: 44401 : if ($4)
15407 : : {
7249 15408 : 4871 : A_Indirection *n = makeNode(A_Indirection);
15409 : :
7677 15410 : 4871 : n->arg = $2;
5389 15411 : 4871 : n->indirection = check_indirection($4, yyscanner);
702 peter@eisentraut.org 15412 : 4871 : $$ = (Node *) n;
15413 : : }
15414 : : else
7677 tgl@sss.pgh.pa.us 15415 : 39530 : $$ = $2;
15416 : : }
15417 : : | case_expr
7972 bruce@momjian.us 15418 : 27946 : { $$ = $1; }
15419 : : | func_expr
7137 tgl@sss.pgh.pa.us 15420 : 182381 : { $$ = $1; }
15421 : : | select_with_parens %prec UMINUS
15422 : : {
702 peter@eisentraut.org 15423 : 11605 : SubLink *n = makeNode(SubLink);
15424 : :
7137 tgl@sss.pgh.pa.us 15425 : 11605 : n->subLinkType = EXPR_SUBLINK;
3588 15426 : 11605 : n->subLinkId = 0;
6682 15427 : 11605 : n->testexpr = NULL;
7137 15428 : 11605 : n->operName = NIL;
15429 : 11605 : n->subselect = $1;
5708 15430 : 11605 : n->location = @1;
702 peter@eisentraut.org 15431 : 11605 : $$ = (Node *) n;
15432 : : }
15433 : : | select_with_parens indirection
15434 : : {
15435 : : /*
15436 : : * Because the select_with_parens nonterminal is designed
15437 : : * to "eat" as many levels of parens as possible, the
15438 : : * '(' a_expr ')' opt_indirection production above will
15439 : : * fail to match a sub-SELECT with indirection decoration;
15440 : : * the sub-SELECT won't be regarded as an a_expr as long
15441 : : * as there are parens around it. To support applying
15442 : : * subscripting or field selection to a sub-SELECT result,
15443 : : * we need this redundant-looking production.
15444 : : */
15445 : 9 : SubLink *n = makeNode(SubLink);
4092 tgl@sss.pgh.pa.us 15446 : 9 : A_Indirection *a = makeNode(A_Indirection);
15447 : :
15448 : 9 : n->subLinkType = EXPR_SUBLINK;
3588 15449 : 9 : n->subLinkId = 0;
4092 15450 : 9 : n->testexpr = NULL;
15451 : 9 : n->operName = NIL;
15452 : 9 : n->subselect = $1;
15453 : 9 : n->location = @1;
702 peter@eisentraut.org 15454 : 9 : a->arg = (Node *) n;
4092 tgl@sss.pgh.pa.us 15455 : 9 : a->indirection = check_indirection($2, yyscanner);
702 peter@eisentraut.org 15456 : 9 : $$ = (Node *) a;
15457 : : }
15458 : : | EXISTS select_with_parens
15459 : : {
15460 : 2617 : SubLink *n = makeNode(SubLink);
15461 : :
7137 tgl@sss.pgh.pa.us 15462 : 2617 : n->subLinkType = EXISTS_SUBLINK;
3588 15463 : 2617 : n->subLinkId = 0;
6682 15464 : 2617 : n->testexpr = NULL;
7137 15465 : 2617 : n->operName = NIL;
15466 : 2617 : n->subselect = $2;
5708 15467 : 2617 : n->location = @1;
702 peter@eisentraut.org 15468 : 2617 : $$ = (Node *) n;
15469 : : }
15470 : : | ARRAY select_with_parens
15471 : : {
15472 : 3638 : SubLink *n = makeNode(SubLink);
15473 : :
7137 tgl@sss.pgh.pa.us 15474 : 3638 : n->subLinkType = ARRAY_SUBLINK;
3588 15475 : 3638 : n->subLinkId = 0;
6682 15476 : 3638 : n->testexpr = NULL;
7137 15477 : 3638 : n->operName = NIL;
15478 : 3638 : n->subselect = $2;
5708 15479 : 3638 : n->location = @1;
702 peter@eisentraut.org 15480 : 3638 : $$ = (Node *) n;
15481 : : }
15482 : : | ARRAY array_expr
15483 : : {
2609 peter_e@gmx.net 15484 : 3689 : A_ArrayExpr *n = castNode(A_ArrayExpr, $2);
15485 : :
15486 : : /* point outermost A_ArrayExpr to the ARRAY keyword */
5708 tgl@sss.pgh.pa.us 15487 : 3689 : n->location = @1;
702 peter@eisentraut.org 15488 : 3689 : $$ = (Node *) n;
15489 : : }
15490 : : | explicit_row
15491 : : {
15492 : 1889 : RowExpr *r = makeNode(RowExpr);
15493 : :
3256 andres@anarazel.de 15494 : 1889 : r->args = $1;
15495 : 1889 : r->row_typeid = InvalidOid; /* not analyzed yet */
15496 : 1889 : r->colnames = NIL; /* to be filled in during analysis */
15497 : 1889 : r->row_format = COERCE_EXPLICIT_CALL; /* abuse */
15498 : 1889 : r->location = @1;
702 peter@eisentraut.org 15499 : 1889 : $$ = (Node *) r;
15500 : : }
15501 : : | implicit_row
15502 : : {
15503 : 1050 : RowExpr *r = makeNode(RowExpr);
15504 : :
7137 tgl@sss.pgh.pa.us 15505 : 1050 : r->args = $1;
15506 : 1050 : r->row_typeid = InvalidOid; /* not analyzed yet */
4443 15507 : 1050 : r->colnames = NIL; /* to be filled in during analysis */
3256 andres@anarazel.de 15508 : 1050 : r->row_format = COERCE_IMPLICIT_CAST; /* abuse */
5708 tgl@sss.pgh.pa.us 15509 : 1050 : r->location = @1;
702 peter@eisentraut.org 15510 : 1050 : $$ = (Node *) r;
15511 : : }
15512 : : | GROUPING '(' expr_list ')'
15513 : : {
3256 andres@anarazel.de 15514 : 157 : GroupingFunc *g = makeNode(GroupingFunc);
15515 : :
15516 : 157 : g->args = $3;
15517 : 157 : g->location = @1;
702 peter@eisentraut.org 15518 : 157 : $$ = (Node *) g;
15519 : : }
15520 : : ;
15521 : :
15522 : : func_application: func_name '(' ')'
15523 : : {
1257 tgl@sss.pgh.pa.us 15524 : 24040 : $$ = (Node *) makeFuncCall($1, NIL,
15525 : : COERCE_EXPLICIT_CALL,
15526 : 24040 : @1);
15527 : : }
15528 : : | func_name '(' func_arg_list opt_sort_clause ')'
15529 : : {
702 peter@eisentraut.org 15530 : 142669 : FuncCall *n = makeFuncCall($1, $3,
15531 : : COERCE_EXPLICIT_CALL,
15532 : 142669 : @1);
15533 : :
3765 tgl@sss.pgh.pa.us 15534 : 142669 : n->agg_order = $4;
702 peter@eisentraut.org 15535 : 142669 : $$ = (Node *) n;
15536 : : }
15537 : : | func_name '(' VARIADIC func_arg_expr opt_sort_clause ')'
15538 : : {
15539 : 288 : FuncCall *n = makeFuncCall($1, list_make1($4),
15540 : : COERCE_EXPLICIT_CALL,
15541 : 288 : @1);
15542 : :
2433 peter_e@gmx.net 15543 : 288 : n->func_variadic = true;
3765 tgl@sss.pgh.pa.us 15544 : 288 : n->agg_order = $5;
702 peter@eisentraut.org 15545 : 288 : $$ = (Node *) n;
15546 : : }
15547 : : | func_name '(' func_arg_list ',' VARIADIC func_arg_expr opt_sort_clause ')'
15548 : : {
15549 : 60 : FuncCall *n = makeFuncCall($1, lappend($3, $6),
15550 : : COERCE_EXPLICIT_CALL,
15551 : 60 : @1);
15552 : :
2433 peter_e@gmx.net 15553 : 60 : n->func_variadic = true;
3765 tgl@sss.pgh.pa.us 15554 : 60 : n->agg_order = $7;
702 peter@eisentraut.org 15555 : 60 : $$ = (Node *) n;
15556 : : }
15557 : : | func_name '(' ALL func_arg_list opt_sort_clause ')'
15558 : : {
702 peter@eisentraut.org 15559 :UBC 0 : FuncCall *n = makeFuncCall($1, $4,
15560 : : COERCE_EXPLICIT_CALL,
15561 : 0 : @1);
15562 : :
5234 tgl@sss.pgh.pa.us 15563 : 0 : n->agg_order = $5;
15564 : : /* Ideally we'd mark the FuncCall node to indicate
15565 : : * "must be an aggregate", but there's no provision
15566 : : * for that in FuncCall at the moment.
15567 : : */
702 peter@eisentraut.org 15568 : 0 : $$ = (Node *) n;
15569 : : }
15570 : : | func_name '(' DISTINCT func_arg_list opt_sort_clause ')'
15571 : : {
702 peter@eisentraut.org 15572 :CBC 263 : FuncCall *n = makeFuncCall($1, $4,
15573 : : COERCE_EXPLICIT_CALL,
15574 : 263 : @1);
15575 : :
5234 tgl@sss.pgh.pa.us 15576 : 263 : n->agg_order = $5;
2433 peter_e@gmx.net 15577 : 263 : n->agg_distinct = true;
702 peter@eisentraut.org 15578 : 263 : $$ = (Node *) n;
15579 : : }
15580 : : | func_name '(' '*' ')'
15581 : : {
15582 : : /*
15583 : : * We consider AGGREGATE(*) to invoke a parameterless
15584 : : * aggregate. This does the right thing for COUNT(*),
15585 : : * and there are no other aggregates in SQL that accept
15586 : : * '*' as parameter.
15587 : : *
15588 : : * The FuncCall node is also marked agg_star = true,
15589 : : * so that later processing can detect what the argument
15590 : : * really was.
15591 : : */
15592 : 6016 : FuncCall *n = makeFuncCall($1, NIL,
15593 : : COERCE_EXPLICIT_CALL,
15594 : 6016 : @1);
15595 : :
2433 peter_e@gmx.net 15596 : 6016 : n->agg_star = true;
702 peter@eisentraut.org 15597 : 6016 : $$ = (Node *) n;
15598 : : }
15599 : : ;
15600 : :
15601 : :
15602 : : /*
15603 : : * func_expr and its cousin func_expr_windowless are split out from c_expr just
15604 : : * so that we have classifications for "everything that is a function call or
15605 : : * looks like one". This isn't very important, but it saves us having to
15606 : : * document which variants are legal in places like "FROM function()" or the
15607 : : * backwards-compatible functional-index syntax for CREATE INDEX.
15608 : : * (Note that many of the special SQL functions wouldn't actually make any
15609 : : * sense as functional index entries, but we ignore that consideration here.)
15610 : : */
15611 : : func_expr: func_application within_group_clause filter_clause over_clause
15612 : : {
15613 : 151950 : FuncCall *n = (FuncCall *) $1;
15614 : :
15615 : : /*
15616 : : * The order clause for WITHIN GROUP and the one for
15617 : : * plain-aggregate ORDER BY share a field, so we have to
15618 : : * check here that at most one is present. We also check
15619 : : * for DISTINCT and VARIADIC here to give a better error
15620 : : * location. Other consistency checks are deferred to
15621 : : * parse analysis.
15622 : : */
3765 tgl@sss.pgh.pa.us 15623 [ + + ]: 151950 : if ($2 != NIL)
15624 : : {
15625 [ + + ]: 174 : if (n->agg_order != NIL)
15626 [ + - ]: 3 : ereport(ERROR,
15627 : : (errcode(ERRCODE_SYNTAX_ERROR),
15628 : : errmsg("cannot use multiple ORDER BY clauses with WITHIN GROUP"),
15629 : : parser_errposition(@2)));
15630 [ - + ]: 171 : if (n->agg_distinct)
3765 tgl@sss.pgh.pa.us 15631 [ # # ]:UBC 0 : ereport(ERROR,
15632 : : (errcode(ERRCODE_SYNTAX_ERROR),
15633 : : errmsg("cannot use DISTINCT with WITHIN GROUP"),
15634 : : parser_errposition(@2)));
3765 tgl@sss.pgh.pa.us 15635 [ - + ]:CBC 171 : if (n->func_variadic)
3765 tgl@sss.pgh.pa.us 15636 [ # # ]:UBC 0 : ereport(ERROR,
15637 : : (errcode(ERRCODE_SYNTAX_ERROR),
15638 : : errmsg("cannot use VARIADIC with WITHIN GROUP"),
15639 : : parser_errposition(@2)));
3765 tgl@sss.pgh.pa.us 15640 :CBC 171 : n->agg_order = $2;
2433 peter_e@gmx.net 15641 : 171 : n->agg_within_group = true;
15642 : : }
3765 tgl@sss.pgh.pa.us 15643 : 151947 : n->agg_filter = $3;
15644 : 151947 : n->over = $4;
15645 : 151947 : $$ = (Node *) n;
15646 : : }
15647 : : | json_aggregate_func filter_clause over_clause
15648 : : {
382 alvherre@alvh.no-ip. 15649 : 306 : JsonAggConstructor *n = IsA($1, JsonObjectAgg) ?
15650 [ + + ]: 153 : ((JsonObjectAgg *) $1)->constructor :
15651 : 75 : ((JsonArrayAgg *) $1)->constructor;
15652 : :
15653 : 153 : n->agg_filter = $2;
15654 : 153 : n->over = $3;
15655 : 153 : $$ = (Node *) $1;
15656 : : }
15657 : : | func_expr_common_subexpr
3943 rhaas@postgresql.org 15658 : 30281 : { $$ = $1; }
15659 : : ;
15660 : :
15661 : : /*
15662 : : * As func_expr but does not accept WINDOW functions directly
15663 : : * (but they can still be contained in arguments for functions etc).
15664 : : * Use this when window expressions are not allowed, where needed to
15665 : : * disambiguate the grammar (e.g. in CREATE INDEX).
15666 : : */
15667 : : func_expr_windowless:
15668 : 21119 : func_application { $$ = $1; }
3808 peter_e@gmx.net 15669 : 198 : | func_expr_common_subexpr { $$ = $1; }
382 alvherre@alvh.no-ip. 15670 :UBC 0 : | json_aggregate_func { $$ = $1; }
15671 : : ;
15672 : :
15673 : : /*
15674 : : * Special expressions that are considered to be functions.
15675 : : */
15676 : : func_expr_common_subexpr:
15677 : : COLLATION FOR '(' a_expr ')'
15678 : : {
3940 rhaas@postgresql.org 15679 :CBC 15 : $$ = (Node *) makeFuncCall(SystemFuncName("pg_collation_for"),
15680 : 15 : list_make1($4),
15681 : : COERCE_SQL_SYNTAX,
15682 : 15 : @1);
15683 : : }
15684 : : | CURRENT_DATE
15685 : : {
333 michael@paquier.xyz 15686 : 132 : $$ = makeSQLValueFunction(SVFOP_CURRENT_DATE, -1, @1);
15687 : : }
15688 : : | CURRENT_TIME
15689 : : {
15690 : 12 : $$ = makeSQLValueFunction(SVFOP_CURRENT_TIME, -1, @1);
15691 : : }
15692 : : | CURRENT_TIME '(' Iconst ')'
15693 : : {
15694 : 12 : $$ = makeSQLValueFunction(SVFOP_CURRENT_TIME_N, $3, @1);
15695 : : }
15696 : : | CURRENT_TIMESTAMP
15697 : : {
15698 : 144 : $$ = makeSQLValueFunction(SVFOP_CURRENT_TIMESTAMP, -1, @1);
15699 : : }
15700 : : | CURRENT_TIMESTAMP '(' Iconst ')'
15701 : : {
15702 : 76 : $$ = makeSQLValueFunction(SVFOP_CURRENT_TIMESTAMP_N, $3, @1);
15703 : : }
15704 : : | LOCALTIME
15705 : : {
15706 : 12 : $$ = makeSQLValueFunction(SVFOP_LOCALTIME, -1, @1);
15707 : : }
15708 : : | LOCALTIME '(' Iconst ')'
15709 : : {
15710 : 12 : $$ = makeSQLValueFunction(SVFOP_LOCALTIME_N, $3, @1);
15711 : : }
15712 : : | LOCALTIMESTAMP
15713 : : {
15714 : 18 : $$ = makeSQLValueFunction(SVFOP_LOCALTIMESTAMP, -1, @1);
15715 : : }
15716 : : | LOCALTIMESTAMP '(' Iconst ')'
15717 : : {
15718 : 12 : $$ = makeSQLValueFunction(SVFOP_LOCALTIMESTAMP_N, $3, @1);
15719 : : }
15720 : : | CURRENT_ROLE
15721 : : {
15722 : 34 : $$ = makeSQLValueFunction(SVFOP_CURRENT_ROLE, -1, @1);
15723 : : }
15724 : : | CURRENT_USER
15725 : : {
15726 : 417 : $$ = makeSQLValueFunction(SVFOP_CURRENT_USER, -1, @1);
15727 : : }
15728 : : | SESSION_USER
15729 : : {
15730 : 283 : $$ = makeSQLValueFunction(SVFOP_SESSION_USER, -1, @1);
15731 : : }
15732 : : | SYSTEM_USER
15733 : : {
563 15734 : 12 : $$ = (Node *) makeFuncCall(SystemFuncName("system_user"),
15735 : : NIL,
15736 : : COERCE_SQL_SYNTAX,
15737 : : @1);
15738 : : }
15739 : : | USER
15740 : : {
333 15741 : 12 : $$ = makeSQLValueFunction(SVFOP_USER, -1, @1);
15742 : : }
15743 : : | CURRENT_CATALOG
15744 : : {
15745 : 15 : $$ = makeSQLValueFunction(SVFOP_CURRENT_CATALOG, -1, @1);
15746 : : }
15747 : : | CURRENT_SCHEMA
15748 : : {
15749 : 15 : $$ = makeSQLValueFunction(SVFOP_CURRENT_SCHEMA, -1, @1);
15750 : : }
15751 : : | CAST '(' a_expr AS Typename ')'
5708 tgl@sss.pgh.pa.us 15752 : 24161 : { $$ = makeTypeCast($3, $5, @1); }
15753 : : | EXTRACT '(' extract_list ')'
15754 : : {
1104 peter@eisentraut.org 15755 : 596 : $$ = (Node *) makeFuncCall(SystemFuncName("extract"),
1257 tgl@sss.pgh.pa.us 15756 : 596 : $3,
15757 : : COERCE_SQL_SYNTAX,
15758 : 596 : @1);
15759 : : }
15760 : : | NORMALIZE '(' a_expr ')'
15761 : : {
15762 : 9 : $$ = (Node *) makeFuncCall(SystemFuncName("normalize"),
15763 : 9 : list_make1($3),
15764 : : COERCE_SQL_SYNTAX,
15765 : 9 : @1);
15766 : : }
15767 : : | NORMALIZE '(' a_expr ',' unicode_normal_form ')'
15768 : : {
15769 : 18 : $$ = (Node *) makeFuncCall(SystemFuncName("normalize"),
15770 : 18 : list_make2($3, makeStringConst($5, @5)),
15771 : : COERCE_SQL_SYNTAX,
15772 : 18 : @1);
15773 : : }
15774 : : | OVERLAY '(' overlay_list ')'
15775 : : {
15776 : 41 : $$ = (Node *) makeFuncCall(SystemFuncName("overlay"),
15777 : 41 : $3,
15778 : : COERCE_SQL_SYNTAX,
15779 : 41 : @1);
15780 : : }
15781 : : | OVERLAY '(' func_arg_list_opt ')'
15782 : : {
15783 : : /*
15784 : : * allow functions named overlay() to be called without
15785 : : * special syntax
15786 : : */
1257 tgl@sss.pgh.pa.us 15787 :UBC 0 : $$ = (Node *) makeFuncCall(list_make1(makeString("overlay")),
15788 : 0 : $3,
15789 : : COERCE_EXPLICIT_CALL,
15790 : 0 : @1);
15791 : : }
15792 : : | POSITION '(' position_list ')'
15793 : : {
15794 : : /*
15795 : : * position(A in B) is converted to position(B, A)
15796 : : *
15797 : : * We deliberately don't offer a "plain syntax" option
15798 : : * for position(), because the reversal of the arguments
15799 : : * creates too much risk of confusion.
15800 : : */
1257 tgl@sss.pgh.pa.us 15801 :CBC 174 : $$ = (Node *) makeFuncCall(SystemFuncName("position"),
15802 : 174 : $3,
15803 : : COERCE_SQL_SYNTAX,
15804 : 174 : @1);
15805 : : }
15806 : : | SUBSTRING '(' substr_list ')'
15807 : : {
15808 : : /* substring(A from B for C) is converted to
15809 : : * substring(A, B, C) - thomas 2000-11-28
15810 : : */
15811 : 311 : $$ = (Node *) makeFuncCall(SystemFuncName("substring"),
15812 : 311 : $3,
15813 : : COERCE_SQL_SYNTAX,
15814 : 311 : @1);
15815 : : }
15816 : : | SUBSTRING '(' func_arg_list_opt ')'
15817 : : {
15818 : : /*
15819 : : * allow functions named substring() to be called without
15820 : : * special syntax
15821 : : */
15822 : 93 : $$ = (Node *) makeFuncCall(list_make1(makeString("substring")),
15823 : 93 : $3,
15824 : : COERCE_EXPLICIT_CALL,
15825 : 93 : @1);
15826 : : }
15827 : : | TREAT '(' a_expr AS Typename ')'
15828 : : {
15829 : : /* TREAT(expr AS target) converts expr of a particular type to target,
15830 : : * which is defined to be a subtype of the original expression.
15831 : : * In SQL99, this is intended for use with structured UDTs,
15832 : : * but let's make this a generally useful form allowing stronger
15833 : : * coercions than are handled by implicit casting.
15834 : : *
15835 : : * Convert SystemTypeName() to SystemFuncName() even though
15836 : : * at the moment they result in the same thing.
15837 : : */
1228 peter@eisentraut.org 15838 :UBC 0 : $$ = (Node *) makeFuncCall(SystemFuncName(strVal(llast($5->names))),
1257 tgl@sss.pgh.pa.us 15839 : 0 : list_make1($3),
15840 : : COERCE_EXPLICIT_CALL,
15841 : 0 : @1);
15842 : : }
15843 : : | TRIM '(' BOTH trim_list ')'
15844 : : {
15845 : : /* various trim expressions are defined in SQL
15846 : : * - thomas 1997-07-19
15847 : : */
1257 tgl@sss.pgh.pa.us 15848 :CBC 6 : $$ = (Node *) makeFuncCall(SystemFuncName("btrim"),
15849 : 6 : $4,
15850 : : COERCE_SQL_SYNTAX,
15851 : 6 : @1);
15852 : : }
15853 : : | TRIM '(' LEADING trim_list ')'
15854 : : {
15855 : 12 : $$ = (Node *) makeFuncCall(SystemFuncName("ltrim"),
15856 : 12 : $4,
15857 : : COERCE_SQL_SYNTAX,
15858 : 12 : @1);
15859 : : }
15860 : : | TRIM '(' TRAILING trim_list ')'
15861 : : {
15862 : 267 : $$ = (Node *) makeFuncCall(SystemFuncName("rtrim"),
15863 : 267 : $4,
15864 : : COERCE_SQL_SYNTAX,
15865 : 267 : @1);
15866 : : }
15867 : : | TRIM '(' trim_list ')'
15868 : : {
15869 : 49 : $$ = (Node *) makeFuncCall(SystemFuncName("btrim"),
15870 : 49 : $3,
15871 : : COERCE_SQL_SYNTAX,
15872 : 49 : @1);
15873 : : }
15874 : : | NULLIF '(' a_expr ',' a_expr ')'
15875 : : {
6606 15876 : 119 : $$ = (Node *) makeSimpleA_Expr(AEXPR_NULLIF, "=", $3, $5, @1);
15877 : : }
15878 : : | COALESCE '(' expr_list ')'
15879 : : {
7136 15880 : 1505 : CoalesceExpr *c = makeNode(CoalesceExpr);
15881 : :
15882 : 1505 : c->args = $3;
5708 15883 : 1505 : c->location = @1;
702 peter@eisentraut.org 15884 : 1505 : $$ = (Node *) c;
15885 : : }
15886 : : | GREATEST '(' expr_list ')'
15887 : : {
6867 tgl@sss.pgh.pa.us 15888 : 70 : MinMaxExpr *v = makeNode(MinMaxExpr);
15889 : :
15890 : 70 : v->args = $3;
15891 : 70 : v->op = IS_GREATEST;
5708 15892 : 70 : v->location = @1;
702 peter@eisentraut.org 15893 : 70 : $$ = (Node *) v;
15894 : : }
15895 : : | LEAST '(' expr_list ')'
15896 : : {
6867 tgl@sss.pgh.pa.us 15897 : 71 : MinMaxExpr *v = makeNode(MinMaxExpr);
15898 : :
15899 : 71 : v->args = $3;
15900 : 71 : v->op = IS_LEAST;
5708 15901 : 71 : v->location = @1;
702 peter@eisentraut.org 15902 : 71 : $$ = (Node *) v;
15903 : : }
15904 : : | XMLCONCAT '(' expr_list ')'
15905 : : {
5708 tgl@sss.pgh.pa.us 15906 : 31 : $$ = makeXmlExpr(IS_XMLCONCAT, NULL, NIL, $3, @1);
15907 : : }
15908 : : | XMLELEMENT '(' NAME_P ColLabel ')'
15909 : : {
15910 : 3 : $$ = makeXmlExpr(IS_XMLELEMENT, $4, NIL, NIL, @1);
15911 : : }
15912 : : | XMLELEMENT '(' NAME_P ColLabel ',' xml_attributes ')'
15913 : : {
15914 : 18 : $$ = makeXmlExpr(IS_XMLELEMENT, $4, $6, NIL, @1);
15915 : : }
15916 : : | XMLELEMENT '(' NAME_P ColLabel ',' expr_list ')'
15917 : : {
15918 : 58 : $$ = makeXmlExpr(IS_XMLELEMENT, $4, NIL, $6, @1);
15919 : : }
15920 : : | XMLELEMENT '(' NAME_P ColLabel ',' xml_attributes ',' expr_list ')'
15921 : : {
15922 : 10 : $$ = makeXmlExpr(IS_XMLELEMENT, $4, $6, $8, @1);
15923 : : }
15924 : : | XMLEXISTS '(' c_expr xmlexists_argument ')'
15925 : : {
15926 : : /* xmlexists(A PASSING [BY REF] B [BY REF]) is
15927 : : * converted to xmlexists(A, B)*/
1257 15928 : 27 : $$ = (Node *) makeFuncCall(SystemFuncName("xmlexists"),
15929 : 27 : list_make2($3, $4),
15930 : : COERCE_SQL_SYNTAX,
15931 : 27 : @1);
15932 : : }
15933 : : | XMLFOREST '(' xml_attribute_list ')'
15934 : : {
5708 15935 : 16 : $$ = makeXmlExpr(IS_XMLFOREST, NULL, $3, NIL, @1);
15936 : : }
15937 : : | XMLPARSE '(' document_or_content a_expr xml_whitespace_option ')'
15938 : : {
15939 : : XmlExpr *x = (XmlExpr *)
15940 : 70 : makeXmlExpr(IS_XMLPARSE, NULL, NIL,
15941 : 70 : list_make2($4, makeBoolAConst($5, -1)),
15942 : 70 : @1);
15943 : :
6280 peter_e@gmx.net 15944 : 70 : x->xmloption = $3;
702 peter@eisentraut.org 15945 : 70 : $$ = (Node *) x;
15946 : : }
15947 : : | XMLPI '(' NAME_P ColLabel ')'
15948 : : {
5708 tgl@sss.pgh.pa.us 15949 : 15 : $$ = makeXmlExpr(IS_XMLPI, $4, NULL, NIL, @1);
15950 : : }
15951 : : | XMLPI '(' NAME_P ColLabel ',' a_expr ')'
15952 : : {
15953 : 25 : $$ = makeXmlExpr(IS_XMLPI, $4, NULL, list_make1($6), @1);
15954 : : }
15955 : : | XMLROOT '(' a_expr ',' xml_root_version opt_xml_root_standalone ')'
15956 : : {
6321 15957 : 34 : $$ = makeXmlExpr(IS_XMLROOT, NULL, NIL,
5708 15958 : 34 : list_make3($3, $5, $6), @1);
15959 : : }
15960 : : | XMLSERIALIZE '(' document_or_content a_expr AS SimpleTypename xml_indent_option ')'
15961 : : {
6280 peter_e@gmx.net 15962 : 95 : XmlSerialize *n = makeNode(XmlSerialize);
15963 : :
15964 : 95 : n->xmloption = $3;
15965 : 95 : n->expr = $4;
5386 15966 : 95 : n->typeName = $6;
396 tgl@sss.pgh.pa.us 15967 : 95 : n->indent = $7;
5708 15968 : 95 : n->location = @1;
702 peter@eisentraut.org 15969 : 95 : $$ = (Node *) n;
15970 : : }
15971 : : | JSON_OBJECT '(' func_arg_list ')'
15972 : : {
15973 : : /* Support for legacy (non-standard) json_object() */
382 alvherre@alvh.no-ip. 15974 : 45 : $$ = (Node *) makeFuncCall(SystemFuncName("json_object"),
15975 : 45 : $3, COERCE_EXPLICIT_CALL, @1);
15976 : : }
15977 : : | JSON_OBJECT '(' json_name_and_value_list
15978 : : json_object_constructor_null_clause_opt
15979 : : json_key_uniqueness_constraint_opt
15980 : : json_returning_clause_opt ')'
15981 : : {
15982 : 141 : JsonObjectConstructor *n = makeNode(JsonObjectConstructor);
15983 : :
15984 : 141 : n->exprs = $3;
15985 : 141 : n->absent_on_null = $4;
15986 : 141 : n->unique = $5;
15987 : 141 : n->output = (JsonOutput *) $6;
15988 : 141 : n->location = @1;
15989 : 141 : $$ = (Node *) n;
15990 : : }
15991 : : | JSON_OBJECT '(' json_returning_clause_opt ')'
15992 : : {
15993 : 44 : JsonObjectConstructor *n = makeNode(JsonObjectConstructor);
15994 : :
15995 : 44 : n->exprs = NULL;
15996 : 44 : n->absent_on_null = false;
15997 : 44 : n->unique = false;
15998 : 44 : n->output = (JsonOutput *) $3;
15999 : 44 : n->location = @1;
16000 : 44 : $$ = (Node *) n;
16001 : : }
16002 : : | JSON_ARRAY '('
16003 : : json_value_expr_list
16004 : : json_array_constructor_null_clause_opt
16005 : : json_returning_clause_opt
16006 : : ')'
16007 : : {
16008 : 48 : JsonArrayConstructor *n = makeNode(JsonArrayConstructor);
16009 : :
16010 : 48 : n->exprs = $3;
16011 : 48 : n->absent_on_null = $4;
16012 : 48 : n->output = (JsonOutput *) $5;
16013 : 48 : n->location = @1;
16014 : 48 : $$ = (Node *) n;
16015 : : }
16016 : : | JSON_ARRAY '('
16017 : : select_no_parens
16018 : : json_format_clause_opt
16019 : : /* json_array_constructor_null_clause_opt */
16020 : : json_returning_clause_opt
16021 : : ')'
16022 : : {
16023 : 27 : JsonArrayQueryConstructor *n = makeNode(JsonArrayQueryConstructor);
16024 : :
16025 : 27 : n->query = $3;
16026 : 27 : n->format = (JsonFormat *) $4;
16027 : 27 : n->absent_on_null = true; /* XXX */
16028 : 27 : n->output = (JsonOutput *) $5;
16029 : 27 : n->location = @1;
16030 : 27 : $$ = (Node *) n;
16031 : : }
16032 : : | JSON_ARRAY '('
16033 : : json_returning_clause_opt
16034 : : ')'
16035 : : {
16036 : 41 : JsonArrayConstructor *n = makeNode(JsonArrayConstructor);
16037 : :
16038 : 41 : n->exprs = NIL;
16039 : 41 : n->absent_on_null = true;
16040 : 41 : n->output = (JsonOutput *) $3;
16041 : 41 : n->location = @1;
16042 : 41 : $$ = (Node *) n;
16043 : : }
16044 : : | JSON '(' json_value_expr json_key_uniqueness_constraint_opt ')'
16045 : : {
269 amitlan@postgresql.o 16046 :GNC 74 : JsonParseExpr *n = makeNode(JsonParseExpr);
16047 : :
16048 : 74 : n->expr = (JsonValueExpr *) $3;
16049 : 74 : n->unique_keys = $4;
16050 : 74 : n->output = NULL;
16051 : 74 : n->location = @1;
16052 : 74 : $$ = (Node *) n;
16053 : : }
16054 : : | JSON_SCALAR '(' a_expr ')'
16055 : : {
16056 : 49 : JsonScalarExpr *n = makeNode(JsonScalarExpr);
16057 : :
16058 : 49 : n->expr = (Expr *) $3;
16059 : 49 : n->output = NULL;
16060 : 49 : n->location = @1;
16061 : 49 : $$ = (Node *) n;
16062 : : }
16063 : : | JSON_SERIALIZE '(' json_value_expr json_returning_clause_opt ')'
16064 : : {
16065 : 39 : JsonSerializeExpr *n = makeNode(JsonSerializeExpr);
16066 : :
16067 : 39 : n->expr = (JsonValueExpr *) $3;
16068 : 39 : n->output = (JsonOutput *) $4;
16069 : 39 : n->location = @1;
16070 : 39 : $$ = (Node *) n;
16071 : : }
16072 : : | MERGE_ACTION '(' ')'
16073 : : {
28 dean.a.rasheed@gmail 16074 : 84 : MergeSupportFunc *m = makeNode(MergeSupportFunc);
16075 : :
16076 : 84 : m->msftype = TEXTOID;
16077 : 84 : m->location = @1;
16078 : 84 : $$ = (Node *) m;
16079 : : }
16080 : : | JSON_QUERY '('
16081 : : json_value_expr ',' a_expr json_passing_clause_opt
16082 : : json_returning_clause_opt
16083 : : json_wrapper_behavior
16084 : : json_quotes_clause_opt
16085 : : json_behavior_clause_opt
16086 : : ')'
16087 : : {
24 amitlan@postgresql.o 16088 : 435 : JsonFuncExpr *n = makeNode(JsonFuncExpr);
16089 : :
16090 : 435 : n->op = JSON_QUERY_OP;
16091 : 435 : n->context_item = (JsonValueExpr *) $3;
16092 : 435 : n->pathspec = $5;
16093 : 435 : n->passing = $6;
16094 : 435 : n->output = (JsonOutput *) $7;
16095 : 435 : n->wrapper = $8;
16096 : 435 : n->quotes = $9;
16097 : 435 : n->on_empty = (JsonBehavior *) linitial($10);
16098 : 435 : n->on_error = (JsonBehavior *) lsecond($10);
16099 : 435 : n->location = @1;
16100 : 435 : $$ = (Node *) n;
16101 : : }
16102 : : | JSON_EXISTS '('
16103 : : json_value_expr ',' a_expr json_passing_clause_opt
16104 : : json_on_error_clause_opt
16105 : : ')'
16106 : : {
16107 : 81 : JsonFuncExpr *n = makeNode(JsonFuncExpr);
16108 : :
16109 : 81 : n->op = JSON_EXISTS_OP;
16110 : 81 : n->context_item = (JsonValueExpr *) $3;
16111 : 81 : n->pathspec = $5;
16112 : 81 : n->passing = $6;
16113 : 81 : n->output = NULL;
16114 : 81 : n->on_error = (JsonBehavior *) $7;
16115 : 81 : n->location = @1;
16116 : 81 : $$ = (Node *) n;
16117 : : }
16118 : : | JSON_VALUE '('
16119 : : json_value_expr ',' a_expr json_passing_clause_opt
16120 : : json_returning_clause_opt
16121 : : json_behavior_clause_opt
16122 : : ')'
16123 : : {
16124 : 234 : JsonFuncExpr *n = makeNode(JsonFuncExpr);
16125 : :
16126 : 234 : n->op = JSON_VALUE_OP;
16127 : 234 : n->context_item = (JsonValueExpr *) $3;
16128 : 234 : n->pathspec = $5;
16129 : 234 : n->passing = $6;
16130 : 234 : n->output = (JsonOutput *) $7;
16131 : 234 : n->on_empty = (JsonBehavior *) linitial($8);
16132 : 234 : n->on_error = (JsonBehavior *) lsecond($8);
16133 : 234 : n->location = @1;
16134 : 234 : $$ = (Node *) n;
16135 : : }
16136 : : ;
16137 : :
16138 : :
16139 : : /*
16140 : : * SQL/XML support
16141 : : */
16142 : : xml_root_version: VERSION_P a_expr
6321 tgl@sss.pgh.pa.us 16143 :CBC 12 : { $$ = $2; }
16144 : : | VERSION_P NO VALUE_P
5708 16145 : 22 : { $$ = makeNullAConst(-1); }
16146 : : ;
16147 : :
16148 : : opt_xml_root_standalone: ',' STANDALONE_P YES_P
16149 : 13 : { $$ = makeIntConst(XML_STANDALONE_YES, -1); }
16150 : : | ',' STANDALONE_P NO
16151 : 6 : { $$ = makeIntConst(XML_STANDALONE_NO, -1); }
16152 : : | ',' STANDALONE_P NO VALUE_P
16153 : 6 : { $$ = makeIntConst(XML_STANDALONE_NO_VALUE, -1); }
16154 : : | /*EMPTY*/
16155 : 9 : { $$ = makeIntConst(XML_STANDALONE_OMITTED, -1); }
16156 : : ;
16157 : :
6321 16158 : 28 : xml_attributes: XMLATTRIBUTES '(' xml_attribute_list ')' { $$ = $3; }
16159 : : ;
16160 : :
6324 peter_e@gmx.net 16161 : 44 : xml_attribute_list: xml_attribute_el { $$ = list_make1($1); }
16162 : 72 : | xml_attribute_list ',' xml_attribute_el { $$ = lappend($1, $3); }
16163 : : ;
16164 : :
16165 : : xml_attribute_el: a_expr AS ColLabel
16166 : : {
16167 : 53 : $$ = makeNode(ResTarget);
16168 : 53 : $$->name = $3;
5706 tgl@sss.pgh.pa.us 16169 : 53 : $$->indirection = NIL;
6324 peter_e@gmx.net 16170 : 53 : $$->val = (Node *) $1;
6321 tgl@sss.pgh.pa.us 16171 : 53 : $$->location = @1;
16172 : : }
16173 : : | a_expr
16174 : : {
6324 peter_e@gmx.net 16175 : 63 : $$ = makeNode(ResTarget);
16176 : 63 : $$->name = NULL;
5706 tgl@sss.pgh.pa.us 16177 : 63 : $$->indirection = NIL;
6315 16178 : 63 : $$->val = (Node *) $1;
6321 16179 : 63 : $$->location = @1;
16180 : : }
16181 : : ;
16182 : :
6280 peter_e@gmx.net 16183 : 81 : document_or_content: DOCUMENT_P { $$ = XMLOPTION_DOCUMENT; }
16184 : 90 : | CONTENT_P { $$ = XMLOPTION_CONTENT; }
16185 : : ;
16186 : :
396 tgl@sss.pgh.pa.us 16187 : 60 : xml_indent_option: INDENT { $$ = true; }
16188 : 12 : | NO INDENT { $$ = false; }
16189 : 23 : | /*EMPTY*/ { $$ = false; }
16190 : : ;
16191 : :
2433 peter_e@gmx.net 16192 :UBC 0 : xml_whitespace_option: PRESERVE WHITESPACE_P { $$ = true; }
2433 peter_e@gmx.net 16193 :CBC 1 : | STRIP_P WHITESPACE_P { $$ = false; }
16194 : 69 : | /*EMPTY*/ { $$ = false; }
16195 : : ;
16196 : :
16197 : : /* We allow several variants for SQL and other compatibility. */
16198 : : xmlexists_argument:
16199 : : PASSING c_expr
16200 : : {
5001 16201 : 113 : $$ = $2;
16202 : : }
16203 : : | PASSING c_expr xml_passing_mech
16204 : : {
5001 peter_e@gmx.net 16205 :UBC 0 : $$ = $2;
16206 : : }
16207 : : | PASSING xml_passing_mech c_expr
16208 : : {
1865 alvherre@alvh.no-ip. 16209 :CBC 21 : $$ = $3;
16210 : : }
16211 : : | PASSING xml_passing_mech c_expr xml_passing_mech
16212 : : {
16213 : 3 : $$ = $3;
16214 : : }
16215 : : ;
16216 : :
16217 : : xml_passing_mech:
16218 : : BY REF_P
16219 : : | BY VALUE_P
16220 : : ;
16221 : :
16222 : :
16223 : : /*
16224 : : * Aggregate decoration clauses
16225 : : */
16226 : : within_group_clause:
3765 tgl@sss.pgh.pa.us 16227 : 174 : WITHIN GROUP_P '(' sort_clause ')' { $$ = $4; }
16228 : 151779 : | /*EMPTY*/ { $$ = NIL; }
16229 : : ;
16230 : :
16231 : : filter_clause:
16232 : 418 : FILTER '(' WHERE a_expr ')' { $$ = $4; }
16233 : 151688 : | /*EMPTY*/ { $$ = NULL; }
16234 : : ;
16235 : :
16236 : :
16237 : : /*
16238 : : * Window Definitions
16239 : : */
16240 : : window_clause:
5586 16241 : 264 : WINDOW window_definition_list { $$ = $2; }
16242 : 233400 : | /*EMPTY*/ { $$ = NIL; }
16243 : : ;
16244 : :
16245 : : window_definition_list:
16246 : 264 : window_definition { $$ = list_make1($1); }
16247 : : | window_definition_list ',' window_definition
16248 : 6 : { $$ = lappend($1, $3); }
16249 : : ;
16250 : :
16251 : : window_definition:
16252 : : ColId AS window_specification
16253 : : {
702 peter@eisentraut.org 16254 : 270 : WindowDef *n = $3;
16255 : :
5586 tgl@sss.pgh.pa.us 16256 : 270 : n->name = $1;
16257 : 270 : $$ = n;
16258 : : }
16259 : : ;
16260 : :
16261 : : over_clause: OVER window_specification
16262 : 1229 : { $$ = $2; }
16263 : : | OVER ColId
16264 : : {
702 peter@eisentraut.org 16265 : 471 : WindowDef *n = makeNode(WindowDef);
16266 : :
5583 tgl@sss.pgh.pa.us 16267 : 471 : n->name = $2;
16268 : 471 : n->refname = NULL;
5586 16269 : 471 : n->partitionClause = NIL;
16270 : 471 : n->orderClause = NIL;
5583 16271 : 471 : n->frameOptions = FRAMEOPTION_DEFAULTS;
5175 16272 : 471 : n->startOffset = NULL;
16273 : 471 : n->endOffset = NULL;
5586 16274 : 471 : n->location = @2;
16275 : 471 : $$ = n;
16276 : : }
16277 : : | /*EMPTY*/
16278 : 150403 : { $$ = NULL; }
16279 : : ;
16280 : :
16281 : : window_specification: '(' opt_existing_window_name opt_partition_clause
16282 : : opt_sort_clause opt_frame_clause ')'
16283 : : {
702 peter@eisentraut.org 16284 : 1499 : WindowDef *n = makeNode(WindowDef);
16285 : :
5586 tgl@sss.pgh.pa.us 16286 : 1499 : n->name = NULL;
16287 : 1499 : n->refname = $2;
16288 : 1499 : n->partitionClause = $3;
16289 : 1499 : n->orderClause = $4;
16290 : : /* copy relevant fields of opt_frame_clause */
5175 16291 : 1499 : n->frameOptions = $5->frameOptions;
16292 : 1499 : n->startOffset = $5->startOffset;
16293 : 1499 : n->endOffset = $5->endOffset;
5586 16294 : 1499 : n->location = @1;
16295 : 1499 : $$ = n;
16296 : : }
16297 : : ;
16298 : :
16299 : : /*
16300 : : * If we see PARTITION, RANGE, ROWS or GROUPS as the first token after the '('
16301 : : * of a window_specification, we want the assumption to be that there is
16302 : : * no existing_window_name; but those keywords are unreserved and so could
16303 : : * be ColIds. We fix this by making them have the same precedence as IDENT
16304 : : * and giving the empty production here a slightly higher precedence, so
16305 : : * that the shift/reduce conflict is resolved in favor of reducing the rule.
16306 : : * These keywords are thus precluded from being an existing_window_name but
16307 : : * are not reserved for any other purpose.
16308 : : */
16309 : 15 : opt_existing_window_name: ColId { $$ = $1; }
16310 : 1487 : | /*EMPTY*/ %prec Op { $$ = NULL; }
16311 : : ;
16312 : :
16313 : 410 : opt_partition_clause: PARTITION BY expr_list { $$ = $3; }
16314 : 1089 : | /*EMPTY*/ { $$ = NIL; }
16315 : : ;
16316 : :
16317 : : /*
16318 : : * For frame clauses, we return a WindowDef, but only some fields are used:
16319 : : * frameOptions, startOffset, and endOffset.
16320 : : */
16321 : : opt_frame_clause:
16322 : : RANGE frame_extent opt_window_exclusion_clause
16323 : : {
702 peter@eisentraut.org 16324 : 398 : WindowDef *n = $2;
16325 : :
5175 tgl@sss.pgh.pa.us 16326 : 398 : n->frameOptions |= FRAMEOPTION_NONDEFAULT | FRAMEOPTION_RANGE;
2258 16327 : 398 : n->frameOptions |= $3;
5175 16328 : 398 : $$ = n;
16329 : : }
16330 : : | ROWS frame_extent opt_window_exclusion_clause
16331 : : {
702 peter@eisentraut.org 16332 : 309 : WindowDef *n = $2;
16333 : :
5175 tgl@sss.pgh.pa.us 16334 : 309 : n->frameOptions |= FRAMEOPTION_NONDEFAULT | FRAMEOPTION_ROWS;
2258 16335 : 309 : n->frameOptions |= $3;
16336 : 309 : $$ = n;
16337 : : }
16338 : : | GROUPS frame_extent opt_window_exclusion_clause
16339 : : {
702 peter@eisentraut.org 16340 : 102 : WindowDef *n = $2;
16341 : :
2258 tgl@sss.pgh.pa.us 16342 : 102 : n->frameOptions |= FRAMEOPTION_NONDEFAULT | FRAMEOPTION_GROUPS;
16343 : 102 : n->frameOptions |= $3;
5175 16344 : 102 : $$ = n;
16345 : : }
16346 : : | /*EMPTY*/
16347 : : {
702 peter@eisentraut.org 16348 : 690 : WindowDef *n = makeNode(WindowDef);
16349 : :
5175 tgl@sss.pgh.pa.us 16350 : 690 : n->frameOptions = FRAMEOPTION_DEFAULTS;
16351 : 690 : n->startOffset = NULL;
16352 : 690 : n->endOffset = NULL;
16353 : 690 : $$ = n;
16354 : : }
16355 : : ;
16356 : :
16357 : : frame_extent: frame_bound
16358 : : {
702 peter@eisentraut.org 16359 : 3 : WindowDef *n = $1;
16360 : :
16361 : : /* reject invalid cases */
5175 tgl@sss.pgh.pa.us 16362 [ - + ]: 3 : if (n->frameOptions & FRAMEOPTION_START_UNBOUNDED_FOLLOWING)
5583 tgl@sss.pgh.pa.us 16363 [ # # ]:UBC 0 : ereport(ERROR,
16364 : : (errcode(ERRCODE_WINDOWING_ERROR),
16365 : : errmsg("frame start cannot be UNBOUNDED FOLLOWING"),
16366 : : parser_errposition(@1)));
2258 tgl@sss.pgh.pa.us 16367 [ - + ]:CBC 3 : if (n->frameOptions & FRAMEOPTION_START_OFFSET_FOLLOWING)
5583 tgl@sss.pgh.pa.us 16368 [ # # ]:UBC 0 : ereport(ERROR,
16369 : : (errcode(ERRCODE_WINDOWING_ERROR),
16370 : : errmsg("frame starting from following row cannot end with current row"),
16371 : : parser_errposition(@1)));
5175 tgl@sss.pgh.pa.us 16372 :CBC 3 : n->frameOptions |= FRAMEOPTION_END_CURRENT_ROW;
16373 : 3 : $$ = n;
16374 : : }
16375 : : | BETWEEN frame_bound AND frame_bound
16376 : : {
702 peter@eisentraut.org 16377 : 806 : WindowDef *n1 = $2;
16378 : 806 : WindowDef *n2 = $4;
16379 : :
16380 : : /* form merged options */
5175 tgl@sss.pgh.pa.us 16381 : 806 : int frameOptions = n1->frameOptions;
16382 : : /* shift converts START_ options to END_ options */
16383 : 806 : frameOptions |= n2->frameOptions << 1;
16384 : 806 : frameOptions |= FRAMEOPTION_BETWEEN;
16385 : : /* reject invalid cases */
16386 [ - + ]: 806 : if (frameOptions & FRAMEOPTION_START_UNBOUNDED_FOLLOWING)
5583 tgl@sss.pgh.pa.us 16387 [ # # ]:UBC 0 : ereport(ERROR,
16388 : : (errcode(ERRCODE_WINDOWING_ERROR),
16389 : : errmsg("frame start cannot be UNBOUNDED FOLLOWING"),
16390 : : parser_errposition(@2)));
5175 tgl@sss.pgh.pa.us 16391 [ - + ]:CBC 806 : if (frameOptions & FRAMEOPTION_END_UNBOUNDED_PRECEDING)
5583 tgl@sss.pgh.pa.us 16392 [ # # ]:UBC 0 : ereport(ERROR,
16393 : : (errcode(ERRCODE_WINDOWING_ERROR),
16394 : : errmsg("frame end cannot be UNBOUNDED PRECEDING"),
16395 : : parser_errposition(@4)));
5175 tgl@sss.pgh.pa.us 16396 [ + + ]:CBC 806 : if ((frameOptions & FRAMEOPTION_START_CURRENT_ROW) &&
2258 16397 [ - + ]: 230 : (frameOptions & FRAMEOPTION_END_OFFSET_PRECEDING))
5175 tgl@sss.pgh.pa.us 16398 [ # # ]:UBC 0 : ereport(ERROR,
16399 : : (errcode(ERRCODE_WINDOWING_ERROR),
16400 : : errmsg("frame starting from current row cannot have preceding rows"),
16401 : : parser_errposition(@4)));
2258 tgl@sss.pgh.pa.us 16402 [ + + ]:CBC 806 : if ((frameOptions & FRAMEOPTION_START_OFFSET_FOLLOWING) &&
16403 [ - + ]: 84 : (frameOptions & (FRAMEOPTION_END_OFFSET_PRECEDING |
16404 : : FRAMEOPTION_END_CURRENT_ROW)))
5175 tgl@sss.pgh.pa.us 16405 [ # # ]:UBC 0 : ereport(ERROR,
16406 : : (errcode(ERRCODE_WINDOWING_ERROR),
16407 : : errmsg("frame starting from following row cannot have preceding rows"),
16408 : : parser_errposition(@4)));
5175 tgl@sss.pgh.pa.us 16409 :CBC 806 : n1->frameOptions = frameOptions;
16410 : 806 : n1->endOffset = n2->startOffset;
16411 : 806 : $$ = n1;
16412 : : }
16413 : : ;
16414 : :
16415 : : /*
16416 : : * This is used for both frame start and frame end, with output set up on
16417 : : * the assumption it's frame start; the frame_extent productions must reject
16418 : : * invalid cases.
16419 : : */
16420 : : frame_bound:
16421 : : UNBOUNDED PRECEDING
16422 : : {
702 peter@eisentraut.org 16423 : 99 : WindowDef *n = makeNode(WindowDef);
16424 : :
5175 tgl@sss.pgh.pa.us 16425 : 99 : n->frameOptions = FRAMEOPTION_START_UNBOUNDED_PRECEDING;
16426 : 99 : n->startOffset = NULL;
16427 : 99 : n->endOffset = NULL;
16428 : 99 : $$ = n;
16429 : : }
16430 : : | UNBOUNDED FOLLOWING
16431 : : {
702 peter@eisentraut.org 16432 : 188 : WindowDef *n = makeNode(WindowDef);
16433 : :
5175 tgl@sss.pgh.pa.us 16434 : 188 : n->frameOptions = FRAMEOPTION_START_UNBOUNDED_FOLLOWING;
16435 : 188 : n->startOffset = NULL;
16436 : 188 : n->endOffset = NULL;
16437 : 188 : $$ = n;
16438 : : }
16439 : : | CURRENT_P ROW
16440 : : {
702 peter@eisentraut.org 16441 : 302 : WindowDef *n = makeNode(WindowDef);
16442 : :
5175 tgl@sss.pgh.pa.us 16443 : 302 : n->frameOptions = FRAMEOPTION_START_CURRENT_ROW;
16444 : 302 : n->startOffset = NULL;
16445 : 302 : n->endOffset = NULL;
16446 : 302 : $$ = n;
16447 : : }
16448 : : | a_expr PRECEDING
16449 : : {
702 peter@eisentraut.org 16450 : 450 : WindowDef *n = makeNode(WindowDef);
16451 : :
2258 tgl@sss.pgh.pa.us 16452 : 450 : n->frameOptions = FRAMEOPTION_START_OFFSET_PRECEDING;
5175 16453 : 450 : n->startOffset = $1;
16454 : 450 : n->endOffset = NULL;
16455 : 450 : $$ = n;
16456 : : }
16457 : : | a_expr FOLLOWING
16458 : : {
702 peter@eisentraut.org 16459 : 576 : WindowDef *n = makeNode(WindowDef);
16460 : :
2258 tgl@sss.pgh.pa.us 16461 : 576 : n->frameOptions = FRAMEOPTION_START_OFFSET_FOLLOWING;
5175 16462 : 576 : n->startOffset = $1;
16463 : 576 : n->endOffset = NULL;
16464 : 576 : $$ = n;
16465 : : }
16466 : : ;
16467 : :
16468 : : opt_window_exclusion_clause:
2258 16469 : 42 : EXCLUDE CURRENT_P ROW { $$ = FRAMEOPTION_EXCLUDE_CURRENT_ROW; }
16470 : 48 : | EXCLUDE GROUP_P { $$ = FRAMEOPTION_EXCLUDE_GROUP; }
16471 : 75 : | EXCLUDE TIES { $$ = FRAMEOPTION_EXCLUDE_TIES; }
16472 : 9 : | EXCLUDE NO OTHERS { $$ = 0; }
16473 : 635 : | /*EMPTY*/ { $$ = 0; }
16474 : : ;
16475 : :
16476 : :
16477 : : /*
16478 : : * Supporting nonterminals for expressions.
16479 : : */
16480 : :
16481 : : /* Explicit row production.
16482 : : *
16483 : : * SQL99 allows an optional ROW keyword, so we can now do single-element rows
16484 : : * without conflicting with the parenthesized a_expr production. Without the
16485 : : * ROW keyword, there must be more than one a_expr inside the parens.
16486 : : */
7279 tgl@sss.pgh.pa.us 16487 :UBC 0 : row: ROW '(' expr_list ')' { $$ = $3; }
16488 : 0 : | ROW '(' ')' { $$ = NIL; }
7279 tgl@sss.pgh.pa.us 16489 :CBC 768 : | '(' expr_list ',' a_expr ')' { $$ = lappend($2, $4); }
16490 : : ;
16491 : :
3256 andres@anarazel.de 16492 : 1874 : explicit_row: ROW '(' expr_list ')' { $$ = $3; }
16493 : 15 : | ROW '(' ')' { $$ = NIL; }
16494 : : ;
16495 : :
16496 : 1050 : implicit_row: '(' expr_list ',' a_expr ')' { $$ = lappend($2, $4); }
16497 : : ;
16498 : :
7279 tgl@sss.pgh.pa.us 16499 : 7182 : sub_type: ANY { $$ = ANY_SUBLINK; }
7279 tgl@sss.pgh.pa.us 16500 :UBC 0 : | SOME { $$ = ANY_SUBLINK; }
7279 tgl@sss.pgh.pa.us 16501 :CBC 162 : | ALL { $$ = ALL_SUBLINK; }
16502 : : ;
16503 : :
16504 : 5325 : all_Op: Op { $$ = $1; }
16505 : 12156 : | MathOp { $$ = $1; }
16506 : : ;
16507 : :
16508 : 19 : MathOp: '+' { $$ = "+"; }
16509 : 23 : | '-' { $$ = "-"; }
16510 : 6 : | '*' { $$ = "*"; }
7279 tgl@sss.pgh.pa.us 16511 :UBC 0 : | '/' { $$ = "/"; }
7279 tgl@sss.pgh.pa.us 16512 :CBC 4 : | '%' { $$ = "%"; }
7279 tgl@sss.pgh.pa.us 16513 :UBC 0 : | '^' { $$ = "^"; }
7279 tgl@sss.pgh.pa.us 16514 :CBC 373 : | '<' { $$ = "<"; }
16515 : 294 : | '>' { $$ = ">"; }
16516 : 10605 : | '=' { $$ = "="; }
3322 16517 : 306 : | LESS_EQUALS { $$ = "<="; }
16518 : 302 : | GREATER_EQUALS { $$ = ">="; }
16519 : 224 : | NOT_EQUALS { $$ = "<>"; }
16520 : : ;
16521 : :
16522 : : qual_Op: Op
7259 neilc@samurai.com 16523 : 20229 : { $$ = list_make1(makeString($1)); }
16524 : : | OPERATOR '(' any_operator ')'
7279 tgl@sss.pgh.pa.us 16525 : 6927 : { $$ = $3; }
16526 : : ;
16527 : :
16528 : : qual_all_Op:
16529 : : all_Op
7259 neilc@samurai.com 16530 : 707 : { $$ = list_make1(makeString($1)); }
16531 : : | OPERATOR '(' any_operator ')'
7279 tgl@sss.pgh.pa.us 16532 : 17 : { $$ = $3; }
16533 : : ;
16534 : :
16535 : : subquery_Op:
16536 : : all_Op
7259 neilc@samurai.com 16537 : 7209 : { $$ = list_make1(makeString($1)); }
16538 : : | OPERATOR '(' any_operator ')'
7279 tgl@sss.pgh.pa.us 16539 : 118 : { $$ = $3; }
16540 : : | LIKE
7259 neilc@samurai.com 16541 : 12 : { $$ = list_make1(makeString("~~")); }
16542 : : | NOT_LA LIKE
16543 : 6 : { $$ = list_make1(makeString("!~~")); }
16544 : : | ILIKE
16545 : 6 : { $$ = list_make1(makeString("~~*")); }
16546 : : | NOT_LA ILIKE
7259 neilc@samurai.com 16547 :UBC 0 : { $$ = list_make1(makeString("!~~*")); }
16548 : : /* cannot put SIMILAR TO here, because SIMILAR TO is a hack.
16549 : : * the regular expression is preprocessed by a function (similar_to_escape),
16550 : : * and the ~ operator for posix regular expressions is used.
16551 : : * x SIMILAR TO y -> x ~ similar_to_escape(y)
16552 : : * this transformation is made on the fly by the parser upwards.
16553 : : * however the SubLink structure which handles any/some/all stuff
16554 : : * is not ready for such a thing.
16555 : : */
16556 : : ;
16557 : :
16558 : : expr_list: a_expr
16559 : : {
7257 tgl@sss.pgh.pa.us 16560 :CBC 75099 : $$ = list_make1($1);
16561 : : }
16562 : : | expr_list ',' a_expr
16563 : : {
16564 : 69251 : $$ = lappend($1, $3);
16565 : : }
16566 : : ;
16567 : :
16568 : : /* function arguments can have names */
16569 : : func_arg_list: func_arg_expr
16570 : : {
5302 16571 : 143130 : $$ = list_make1($1);
16572 : : }
16573 : : | func_arg_list ',' func_arg_expr
16574 : : {
16575 : 105208 : $$ = lappend($1, $3);
16576 : : }
16577 : : ;
16578 : :
16579 : : func_arg_expr: a_expr
16580 : : {
16581 : 223212 : $$ = $1;
16582 : : }
16583 : : | param_name COLON_EQUALS a_expr
16584 : : {
16585 : 24968 : NamedArgExpr *na = makeNode(NamedArgExpr);
16586 : :
5068 16587 : 24968 : na->name = $1;
16588 : 24968 : na->arg = (Expr *) $3;
5302 16589 : 24968 : na->argnumber = -1; /* until determined */
5068 16590 : 24968 : na->location = @1;
5302 16591 : 24968 : $$ = (Node *) na;
16592 : : }
16593 : : | param_name EQUALS_GREATER a_expr
16594 : : {
3323 rhaas@postgresql.org 16595 : 506 : NamedArgExpr *na = makeNode(NamedArgExpr);
16596 : :
16597 : 506 : na->name = $1;
16598 : 506 : na->arg = (Expr *) $3;
16599 : 506 : na->argnumber = -1; /* until determined */
16600 : 506 : na->location = @1;
16601 : 506 : $$ = (Node *) na;
16602 : : }
16603 : : ;
16604 : :
1257 tgl@sss.pgh.pa.us 16605 : 93 : func_arg_list_opt: func_arg_list { $$ = $1; }
1257 tgl@sss.pgh.pa.us 16606 :UBC 0 : | /*EMPTY*/ { $$ = NIL; }
16607 : : ;
16608 : :
6291 tgl@sss.pgh.pa.us 16609 :CBC 868 : type_list: Typename { $$ = list_make1($1); }
16610 : 191 : | type_list ',' Typename { $$ = lappend($1, $3); }
16611 : : ;
16612 : :
16613 : : array_expr: '[' expr_list ']'
16614 : : {
5708 16615 : 3810 : $$ = makeAArrayExpr($2, @1);
16616 : : }
16617 : : | '[' array_expr_list ']'
16618 : : {
16619 : 203 : $$ = makeAArrayExpr($2, @1);
16620 : : }
16621 : : | '[' ']'
16622 : : {
16623 : 44 : $$ = makeAArrayExpr(NIL, @1);
16624 : : }
16625 : : ;
16626 : :
5869 16627 : 203 : array_expr_list: array_expr { $$ = list_make1($1); }
16628 : 165 : | array_expr_list ',' array_expr { $$ = lappend($1, $3); }
16629 : : ;
16630 : :
16631 : :
16632 : : extract_list:
16633 : : extract_arg FROM a_expr
16634 : : {
5708 16635 : 596 : $$ = list_make2(makeStringConst($1, @1), $3);
16636 : : }
16637 : : ;
16638 : :
16639 : : /* Allow delimited string Sconst in extract_arg as an SQL extension.
16640 : : * - thomas 2001-04-12
16641 : : */
16642 : : extract_arg:
7972 bruce@momjian.us 16643 : 491 : IDENT { $$ = $1; }
16644 : 27 : | YEAR_P { $$ = "year"; }
16645 : 18 : | MONTH_P { $$ = "month"; }
16646 : 24 : | DAY_P { $$ = "day"; }
16647 : 12 : | HOUR_P { $$ = "hour"; }
16648 : 12 : | MINUTE_P { $$ = "minute"; }
16649 : 12 : | SECOND_P { $$ = "second"; }
5632 meskes@postgresql.or 16650 :UBC 0 : | Sconst { $$ = $1; }
16651 : : ;
16652 : :
16653 : : unicode_normal_form:
1257 tgl@sss.pgh.pa.us 16654 :CBC 12 : NFC { $$ = "NFC"; }
16655 : 6 : | NFD { $$ = "NFD"; }
16656 : 9 : | NFKC { $$ = "NFKC"; }
16657 : 9 : | NFKD { $$ = "NFKD"; }
16658 : : ;
16659 : :
16660 : : /* OVERLAY() arguments */
16661 : : overlay_list:
16662 : : a_expr PLACING a_expr FROM a_expr FOR a_expr
16663 : : {
16664 : : /* overlay(A PLACING B FROM C FOR D) is converted to overlay(A, B, C, D) */
1385 peter@eisentraut.org 16665 : 17 : $$ = list_make4($1, $3, $5, $7);
16666 : : }
16667 : : | a_expr PLACING a_expr FROM a_expr
16668 : : {
16669 : : /* overlay(A PLACING B FROM C) is converted to overlay(A, B, C) */
16670 : 24 : $$ = list_make3($1, $3, $5);
16671 : : }
16672 : : ;
16673 : :
16674 : : /* position_list uses b_expr not a_expr to avoid conflict with general IN */
16675 : : position_list:
7259 neilc@samurai.com 16676 : 174 : b_expr IN_P b_expr { $$ = list_make2($3, $1); }
16677 : : ;
16678 : :
16679 : : /*
16680 : : * SUBSTRING() arguments
16681 : : *
16682 : : * Note that SQL:1999 has both
16683 : : * text FROM int FOR int
16684 : : * and
16685 : : * text FROM pattern FOR escape
16686 : : *
16687 : : * In the parser we map them both to a call to the substring() function and
16688 : : * rely on type resolution to pick the right one.
16689 : : *
16690 : : * In SQL:2003, the second variant was changed to
16691 : : * text SIMILAR pattern ESCAPE escape
16692 : : * We could in theory map that to a different function internally, but
16693 : : * since we still support the SQL:1999 version, we don't. However,
16694 : : * ruleutils.c will reverse-list the call in the newer style.
16695 : : */
16696 : : substr_list:
16697 : : a_expr FROM a_expr FOR a_expr
16698 : : {
1385 peter@eisentraut.org 16699 : 61 : $$ = list_make3($1, $3, $5);
16700 : : }
16701 : : | a_expr FOR a_expr FROM a_expr
16702 : : {
16703 : : /* not legal per SQL, but might as well allow it */
1385 peter@eisentraut.org 16704 :UBC 0 : $$ = list_make3($1, $5, $3);
16705 : : }
16706 : : | a_expr FROM a_expr
16707 : : {
16708 : : /*
16709 : : * Because we aren't restricting data types here, this
16710 : : * syntax can end up resolving to textregexsubstr().
16711 : : * We've historically allowed that to happen, so continue
16712 : : * to accept it. However, ruleutils.c will reverse-list
16713 : : * such a call in regular function call syntax.
16714 : : */
1385 peter@eisentraut.org 16715 :CBC 152 : $$ = list_make2($1, $3);
16716 : : }
16717 : : | a_expr FOR a_expr
16718 : : {
16719 : : /* not legal per SQL */
16720 : :
16721 : : /*
16722 : : * Since there are no cases where this syntax allows
16723 : : * a textual FOR value, we forcibly cast the argument
16724 : : * to int4. The possible matches in pg_proc are
16725 : : * substring(text,int4) and substring(text,text),
16726 : : * and we don't want the parser to choose the latter,
16727 : : * which it is likely to do if the second argument
16728 : : * is unknown or doesn't have an implicit cast to int4.
16729 : : */
5708 tgl@sss.pgh.pa.us 16730 : 18 : $$ = list_make3($1, makeIntConst(1, -1),
16731 : : makeTypeCast($3,
16732 : : SystemTypeName("int4"), -1));
16733 : : }
16734 : : | a_expr SIMILAR a_expr ESCAPE a_expr
16735 : : {
1385 peter@eisentraut.org 16736 : 80 : $$ = list_make3($1, $3, $5);
16737 : : }
16738 : : ;
16739 : :
7972 bruce@momjian.us 16740 : 279 : trim_list: a_expr FROM expr_list { $$ = lappend($3, $1); }
16741 : 12 : | FROM expr_list { $$ = $2; }
16742 : 43 : | expr_list { $$ = $1; }
16743 : : ;
16744 : :
16745 : : in_expr: select_with_parens
16746 : : {
702 peter@eisentraut.org 16747 : 1196 : SubLink *n = makeNode(SubLink);
16748 : :
9584 bruce@momjian.us 16749 : 1196 : n->subselect = $1;
16750 : : /* other fields will be filled later */
702 peter@eisentraut.org 16751 : 1196 : $$ = (Node *) n;
16752 : : }
16753 : 8418 : | '(' expr_list ')' { $$ = (Node *) $2; }
16754 : : ;
16755 : :
16756 : : /*
16757 : : * Define SQL-style CASE clause.
16758 : : * - Full specification
16759 : : * CASE WHEN a = b THEN c ... ELSE d END
16760 : : * - Implicit argument
16761 : : * CASE a WHEN b THEN c ... ELSE d END
16762 : : */
16763 : : case_expr: CASE case_arg when_clause_list case_default END_P
16764 : : {
16765 : 27946 : CaseExpr *c = makeNode(CaseExpr);
16766 : :
7333 tgl@sss.pgh.pa.us 16767 : 27946 : c->casetype = InvalidOid; /* not analyzed yet */
7794 16768 : 27946 : c->arg = (Expr *) $2;
9263 lockhart@fourpalms.o 16769 : 27946 : c->args = $3;
7794 tgl@sss.pgh.pa.us 16770 : 27946 : c->defresult = (Expr *) $4;
5708 16771 : 27946 : c->location = @1;
702 peter@eisentraut.org 16772 : 27946 : $$ = (Node *) c;
16773 : : }
16774 : : ;
16775 : :
16776 : : when_clause_list:
16777 : : /* There must be at least one */
7259 neilc@samurai.com 16778 : 27946 : when_clause { $$ = list_make1($1); }
7971 bruce@momjian.us 16779 : 22951 : | when_clause_list when_clause { $$ = lappend($1, $2); }
16780 : : ;
16781 : :
16782 : : when_clause:
16783 : : WHEN a_expr THEN a_expr
16784 : : {
702 peter@eisentraut.org 16785 : 50897 : CaseWhen *w = makeNode(CaseWhen);
16786 : :
7794 tgl@sss.pgh.pa.us 16787 : 50897 : w->expr = (Expr *) $2;
16788 : 50897 : w->result = (Expr *) $4;
5708 16789 : 50897 : w->location = @1;
702 peter@eisentraut.org 16790 : 50897 : $$ = (Node *) w;
16791 : : }
16792 : : ;
16793 : :
16794 : : case_default:
7972 bruce@momjian.us 16795 : 24106 : ELSE a_expr { $$ = $2; }
16796 : 3840 : | /*EMPTY*/ { $$ = NULL; }
16797 : : ;
16798 : :
16799 : 2668 : case_arg: a_expr { $$ = $1; }
16800 : 25278 : | /*EMPTY*/ { $$ = NULL; }
16801 : : ;
16802 : :
16803 : : columnref: ColId
16804 : : {
5389 tgl@sss.pgh.pa.us 16805 : 297929 : $$ = makeColumnRef($1, NIL, @1, yyscanner);
16806 : : }
16807 : : | ColId indirection
16808 : : {
16809 : 465401 : $$ = makeColumnRef($1, $2, @1, yyscanner);
16810 : : }
16811 : : ;
16812 : :
16813 : : indirection_el:
16814 : : '.' attr_name
16815 : : {
7249 16816 : 629537 : $$ = (Node *) makeString($2);
16817 : : }
16818 : : | '.' '*'
16819 : : {
5706 16820 : 2954 : $$ = (Node *) makeNode(A_Star);
16821 : : }
16822 : : | '[' a_expr ']'
16823 : : {
7249 16824 : 5798 : A_Indices *ai = makeNode(A_Indices);
16825 : :
3036 16826 : 5798 : ai->is_slice = false;
7249 16827 : 5798 : ai->lidx = NULL;
16828 : 5798 : ai->uidx = $2;
16829 : 5798 : $$ = (Node *) ai;
16830 : : }
16831 : : | '[' opt_slice_bound ':' opt_slice_bound ']'
16832 : : {
16833 : 279 : A_Indices *ai = makeNode(A_Indices);
16834 : :
3036 16835 : 279 : ai->is_slice = true;
7249 16836 : 279 : ai->lidx = $2;
16837 : 279 : ai->uidx = $4;
16838 : 279 : $$ = (Node *) ai;
16839 : : }
16840 : : ;
16841 : :
16842 : : opt_slice_bound:
3036 16843 : 468 : a_expr { $$ = $1; }
16844 : 90 : | /*EMPTY*/ { $$ = NULL; }
16845 : : ;
16846 : :
16847 : : indirection:
7249 16848 : 629865 : indirection_el { $$ = list_make1($1); }
16849 : 1371 : | indirection indirection_el { $$ = lappend($1, $2); }
16850 : : ;
16851 : :
16852 : : opt_indirection:
16853 : 152912 : /*EMPTY*/ { $$ = NIL; }
16854 : 7332 : | opt_indirection indirection_el { $$ = lappend($1, $2); }
16855 : : ;
16856 : :
16857 : : opt_asymmetric: ASYMMETRIC
16858 : : | /*EMPTY*/
16859 : : ;
16860 : :
16861 : : /* SQL/JSON support */
16862 : : json_passing_clause_opt:
24 amitlan@postgresql.o 16863 :GNC 150 : PASSING json_arguments { $$ = $2; }
16864 : 800 : | /*EMPTY*/ { $$ = NIL; }
16865 : : ;
16866 : :
16867 : : json_arguments:
16868 : 150 : json_argument { $$ = list_make1($1); }
16869 : 63 : | json_arguments ',' json_argument { $$ = lappend($1, $3); }
16870 : : ;
16871 : :
16872 : : json_argument:
16873 : : json_value_expr AS ColLabel
16874 : : {
16875 : 213 : JsonArgument *n = makeNode(JsonArgument);
16876 : :
16877 : 213 : n->val = (JsonValueExpr *) $1;
16878 : 213 : n->name = $3;
16879 : 213 : $$ = (Node *) n;
16880 : : }
16881 : : ;
16882 : :
16883 : : /* ARRAY is a noise word */
16884 : : json_wrapper_behavior:
16885 : 21 : WITHOUT WRAPPER { $$ = JSW_NONE; }
24 amitlan@postgresql.o 16886 :UNC 0 : | WITHOUT ARRAY WRAPPER { $$ = JSW_NONE; }
24 amitlan@postgresql.o 16887 :GNC 39 : | WITH WRAPPER { $$ = JSW_UNCONDITIONAL; }
16888 : 6 : | WITH ARRAY WRAPPER { $$ = JSW_UNCONDITIONAL; }
24 amitlan@postgresql.o 16889 :UNC 0 : | WITH CONDITIONAL ARRAY WRAPPER { $$ = JSW_CONDITIONAL; }
24 amitlan@postgresql.o 16890 :GNC 6 : | WITH UNCONDITIONAL ARRAY WRAPPER { $$ = JSW_UNCONDITIONAL; }
16891 : 18 : | WITH CONDITIONAL WRAPPER { $$ = JSW_CONDITIONAL; }
16892 : 3 : | WITH UNCONDITIONAL WRAPPER { $$ = JSW_UNCONDITIONAL; }
16893 : 719 : | /* empty */ { $$ = JSW_UNSPEC; }
16894 : : ;
16895 : :
16896 : : json_behavior:
16897 : : DEFAULT a_expr
16898 : 114 : { $$ = (Node *) makeJsonBehavior(JSON_BEHAVIOR_DEFAULT, $2, @1); }
16899 : : | json_behavior_type
16900 : 261 : { $$ = (Node *) makeJsonBehavior($1, NULL, @1); }
16901 : : ;
16902 : :
16903 : : json_behavior_type:
16904 : 189 : ERROR_P { $$ = JSON_BEHAVIOR_ERROR; }
16905 : 12 : | NULL_P { $$ = JSON_BEHAVIOR_NULL; }
16906 : 3 : | TRUE_P { $$ = JSON_BEHAVIOR_TRUE; }
16907 : 3 : | FALSE_P { $$ = JSON_BEHAVIOR_FALSE; }
16908 : 6 : | UNKNOWN { $$ = JSON_BEHAVIOR_UNKNOWN; }
16909 : 12 : | EMPTY_P ARRAY { $$ = JSON_BEHAVIOR_EMPTY_ARRAY; }
16910 : 30 : | EMPTY_P OBJECT_P { $$ = JSON_BEHAVIOR_EMPTY_OBJECT; }
16911 : : /* non-standard, for Oracle compatibility only */
16912 : 6 : | EMPTY_P { $$ = JSON_BEHAVIOR_EMPTY_ARRAY; }
16913 : : ;
16914 : :
16915 : : json_behavior_clause_opt:
16916 : : json_behavior ON EMPTY_P
16917 : 54 : { $$ = list_make2($1, NULL); }
16918 : : | json_behavior ON ERROR_P
16919 : 201 : { $$ = list_make2(NULL, $1); }
16920 : : | json_behavior ON EMPTY_P json_behavior ON ERROR_P
16921 : 48 : { $$ = list_make2($1, $4); }
16922 : : | /* EMPTY */
16923 : 785 : { $$ = list_make2(NULL, NULL); }
16924 : : ;
16925 : :
16926 : : json_on_error_clause_opt:
16927 : : json_behavior ON ERROR_P
16928 : 24 : { $$ = $1; }
16929 : : | /* EMPTY */
16930 : 254 : { $$ = NULL; }
16931 : : ;
16932 : :
16933 : : json_value_expr:
16934 : : a_expr json_format_clause_opt
16935 : : {
16936 : : /* formatted_expr will be set during parse-analysis. */
268 amitlan@postgresql.o 16937 :CBC 1793 : $$ = (Node *) makeJsonValueExpr((Expr *) $1, NULL,
16938 : 1793 : castNode(JsonFormat, $2));
16939 : : }
16940 : : ;
16941 : :
16942 : : json_format_clause:
16943 : : FORMAT_LA JSON ENCODING name
16944 : : {
16945 : : int encoding;
16946 : :
125 alvherre@alvh.no-ip. 16947 [ + + ]:GNC 49 : if (!pg_strcasecmp($4, "utf8"))
16948 : 31 : encoding = JS_ENC_UTF8;
16949 [ + + ]: 18 : else if (!pg_strcasecmp($4, "utf16"))
16950 : 6 : encoding = JS_ENC_UTF16;
16951 [ + + ]: 12 : else if (!pg_strcasecmp($4, "utf32"))
16952 : 6 : encoding = JS_ENC_UTF32;
16953 : : else
16954 [ + - ]: 6 : ereport(ERROR,
16955 : : errcode(ERRCODE_INVALID_PARAMETER_VALUE),
16956 : : errmsg("unrecognized JSON encoding: %s", $4));
16957 : :
16958 : 43 : $$ = (Node *) makeJsonFormat(JS_FORMAT_JSON, encoding, @1);
16959 : : }
16960 : : | FORMAT_LA JSON
16961 : : {
16962 : 175 : $$ = (Node *) makeJsonFormat(JS_FORMAT_JSON, JS_ENC_DEFAULT, @1);
16963 : : }
16964 : : ;
16965 : :
16966 : : json_format_clause_opt:
16967 : : json_format_clause
16968 : : {
16969 : 164 : $$ = $1;
16970 : : }
16971 : : | /* EMPTY */
16972 : : {
382 alvherre@alvh.no-ip. 16973 :CBC 2245 : $$ = (Node *) makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1);
16974 : : }
16975 : : ;
16976 : :
16977 : : json_quotes_clause_opt:
24 amitlan@postgresql.o 16978 :GNC 6 : KEEP QUOTES ON SCALAR STRING_P { $$ = JS_QUOTES_KEEP; }
16979 : 45 : | KEEP QUOTES { $$ = JS_QUOTES_KEEP; }
16980 : 6 : | OMIT QUOTES ON SCALAR STRING_P { $$ = JS_QUOTES_OMIT; }
16981 : 75 : | OMIT QUOTES { $$ = JS_QUOTES_OMIT; }
16982 : 680 : | /* EMPTY */ { $$ = JS_QUOTES_UNSPEC; }
16983 : : ;
16984 : :
16985 : : json_returning_clause_opt:
16986 : : RETURNING Typename json_format_clause_opt
16987 : : {
382 alvherre@alvh.no-ip. 16988 :CBC 589 : JsonOutput *n = makeNode(JsonOutput);
16989 : :
16990 : 589 : n->typeName = $2;
16991 : 589 : n->returning = makeNode(JsonReturning);
16992 : 589 : n->returning->format = (JsonFormat *) $3;
16993 : 589 : $$ = (Node *) n;
16994 : : }
16995 : 573 : | /* EMPTY */ { $$ = NULL; }
16996 : : ;
16997 : :
16998 : : /*
16999 : : * We must assign the only-JSON production a precedence less than IDENT in
17000 : : * order to favor shifting over reduction when JSON is followed by VALUE_P,
17001 : : * OBJECT_P, or SCALAR. (ARRAY doesn't need that treatment, because it's a
17002 : : * fully reserved word.) Because json_predicate_type_constraint is always
17003 : : * followed by json_key_uniqueness_constraint_opt, we also need the only-JSON
17004 : : * production to have precedence less than WITH and WITHOUT. UNBOUNDED isn't
17005 : : * really related to this syntax, but it's a convenient choice because it
17006 : : * already has a precedence less than IDENT for other reasons.
17007 : : */
17008 : : json_predicate_type_constraint:
138 tgl@sss.pgh.pa.us 17009 :GNC 97 : JSON %prec UNBOUNDED { $$ = JS_TYPE_ANY; }
380 alvherre@alvh.no-ip. 17010 :CBC 13 : | JSON VALUE_P { $$ = JS_TYPE_ANY; }
17011 : 19 : | JSON ARRAY { $$ = JS_TYPE_ARRAY; }
17012 : 19 : | JSON OBJECT_P { $$ = JS_TYPE_OBJECT; }
17013 : 19 : | JSON SCALAR { $$ = JS_TYPE_SCALAR; }
17014 : : ;
17015 : :
17016 : : /*
17017 : : * KEYS is a noise word here. To avoid shift/reduce conflicts, assign the
17018 : : * KEYS-less productions a precedence less than IDENT (i.e., less than KEYS).
17019 : : * This prevents reducing them when the next token is KEYS.
17020 : : */
17021 : : json_key_uniqueness_constraint_opt:
17022 : 51 : WITH UNIQUE KEYS { $$ = true; }
138 tgl@sss.pgh.pa.us 17023 :GNC 40 : | WITH UNIQUE %prec UNBOUNDED { $$ = true; }
376 alvherre@alvh.no-ip. 17024 :CBC 20 : | WITHOUT UNIQUE KEYS { $$ = false; }
138 tgl@sss.pgh.pa.us 17025 :GNC 7 : | WITHOUT UNIQUE %prec UNBOUNDED { $$ = false; }
17026 : 342 : | /* EMPTY */ %prec UNBOUNDED { $$ = false; }
17027 : : ;
17028 : :
17029 : : json_name_and_value_list:
17030 : : json_name_and_value
382 alvherre@alvh.no-ip. 17031 :CBC 141 : { $$ = list_make1($1); }
17032 : : | json_name_and_value_list ',' json_name_and_value
17033 : 112 : { $$ = lappend($1, $3); }
17034 : : ;
17035 : :
17036 : : json_name_and_value:
17037 : : /* Supporting this syntax seems to require major surgery
17038 : : KEY c_expr VALUE_P json_value_expr
17039 : : { $$ = makeJsonKeyValue($2, $4); }
17040 : : |
17041 : : */
17042 : : c_expr VALUE_P json_value_expr
17043 : 12 : { $$ = makeJsonKeyValue($1, $3); }
17044 : : |
17045 : : a_expr ':' json_value_expr
17046 : 319 : { $$ = makeJsonKeyValue($1, $3); }
17047 : : ;
17048 : :
17049 : : /* empty means false for objects, true for arrays */
17050 : : json_object_constructor_null_clause_opt:
17051 : 15 : NULL_P ON NULL_P { $$ = false; }
17052 : 53 : | ABSENT ON NULL_P { $$ = true; }
17053 : 151 : | /* EMPTY */ { $$ = false; }
17054 : : ;
17055 : :
17056 : : json_array_constructor_null_clause_opt:
17057 : 27 : NULL_P ON NULL_P { $$ = false; }
17058 : 18 : | ABSENT ON NULL_P { $$ = true; }
17059 : 78 : | /* EMPTY */ { $$ = true; }
17060 : : ;
17061 : :
17062 : : json_value_expr_list:
17063 : 48 : json_value_expr { $$ = list_make1($1); }
17064 : 63 : | json_value_expr_list ',' json_value_expr { $$ = lappend($1, $3);}
17065 : : ;
17066 : :
17067 : : json_aggregate_func:
17068 : : JSON_OBJECTAGG '('
17069 : : json_name_and_value
17070 : : json_object_constructor_null_clause_opt
17071 : : json_key_uniqueness_constraint_opt
17072 : : json_returning_clause_opt
17073 : : ')'
17074 : : {
17075 : 78 : JsonObjectAgg *n = makeNode(JsonObjectAgg);
17076 : :
17077 : 78 : n->arg = (JsonKeyValue *) $3;
17078 : 78 : n->absent_on_null = $4;
17079 : 78 : n->unique = $5;
17080 : 78 : n->constructor = makeNode(JsonAggConstructor);
17081 : 78 : n->constructor->output = (JsonOutput *) $6;
17082 : 78 : n->constructor->agg_order = NULL;
17083 : 78 : n->constructor->location = @1;
17084 : 78 : $$ = (Node *) n;
17085 : : }
17086 : : | JSON_ARRAYAGG '('
17087 : : json_value_expr
17088 : : json_array_aggregate_order_by_clause_opt
17089 : : json_array_constructor_null_clause_opt
17090 : : json_returning_clause_opt
17091 : : ')'
17092 : : {
17093 : 75 : JsonArrayAgg *n = makeNode(JsonArrayAgg);
17094 : :
17095 : 75 : n->arg = (JsonValueExpr *) $3;
17096 : 75 : n->absent_on_null = $5;
17097 : 75 : n->constructor = makeNode(JsonAggConstructor);
17098 : 75 : n->constructor->agg_order = $4;
17099 : 75 : n->constructor->output = (JsonOutput *) $6;
17100 : 75 : n->constructor->location = @1;
17101 : 75 : $$ = (Node *) n;
17102 : : }
17103 : : ;
17104 : :
17105 : : json_array_aggregate_order_by_clause_opt:
17106 : 9 : ORDER BY sortby_list { $$ = $3; }
17107 : 66 : | /* EMPTY */ { $$ = NIL; }
17108 : : ;
17109 : :
17110 : : /*****************************************************************************
17111 : : *
17112 : : * target list for SELECT
17113 : : *
17114 : : *****************************************************************************/
17115 : :
3774 tgl@sss.pgh.pa.us 17116 : 232012 : opt_target_list: target_list { $$ = $1; }
17117 : 155 : | /* EMPTY */ { $$ = NIL; }
17118 : : ;
17119 : :
17120 : : target_list:
7259 neilc@samurai.com 17121 : 234868 : target_el { $$ = list_make1($1); }
7971 bruce@momjian.us 17122 : 275732 : | target_list ',' target_el { $$ = lappend($1, $3); }
17123 : : ;
17124 : :
17125 : : target_el: a_expr AS ColLabel
17126 : : {
9715 17127 : 91422 : $$ = makeNode(ResTarget);
17128 : 91422 : $$->name = $3;
8060 tgl@sss.pgh.pa.us 17129 : 91422 : $$->indirection = NIL;
702 peter@eisentraut.org 17130 : 91422 : $$->val = (Node *) $1;
6597 tgl@sss.pgh.pa.us 17131 : 91422 : $$->location = @1;
17132 : : }
17133 : : | a_expr BareColLabel
17134 : : {
5903 17135 : 1562 : $$ = makeNode(ResTarget);
17136 : 1562 : $$->name = $2;
17137 : 1562 : $$->indirection = NIL;
702 peter@eisentraut.org 17138 : 1562 : $$->val = (Node *) $1;
5903 tgl@sss.pgh.pa.us 17139 : 1562 : $$->location = @1;
17140 : : }
17141 : : | a_expr
17142 : : {
9715 bruce@momjian.us 17143 : 392916 : $$ = makeNode(ResTarget);
17144 : 392916 : $$->name = NULL;
8060 tgl@sss.pgh.pa.us 17145 : 392916 : $$->indirection = NIL;
702 peter@eisentraut.org 17146 : 392916 : $$->val = (Node *) $1;
6597 tgl@sss.pgh.pa.us 17147 : 392916 : $$->location = @1;
17148 : : }
17149 : : | '*'
17150 : : {
702 peter@eisentraut.org 17151 : 24700 : ColumnRef *n = makeNode(ColumnRef);
17152 : :
5706 tgl@sss.pgh.pa.us 17153 : 24700 : n->fields = list_make1(makeNode(A_Star));
6606 17154 : 24700 : n->location = @1;
17155 : :
9715 bruce@momjian.us 17156 : 24700 : $$ = makeNode(ResTarget);
17157 : 24700 : $$->name = NULL;
8060 tgl@sss.pgh.pa.us 17158 : 24700 : $$->indirection = NIL;
702 peter@eisentraut.org 17159 : 24700 : $$->val = (Node *) n;
6597 tgl@sss.pgh.pa.us 17160 : 24700 : $$->location = @1;
17161 : : }
17162 : : ;
17163 : :
17164 : :
17165 : : /*****************************************************************************
17166 : : *
17167 : : * Names and constants
17168 : : *
17169 : : *****************************************************************************/
17170 : :
17171 : : qualified_name_list:
7259 neilc@samurai.com 17172 : 6504 : qualified_name { $$ = list_make1($1); }
7972 bruce@momjian.us 17173 : 280 : | qualified_name_list ',' qualified_name { $$ = lappend($1, $3); }
17174 : : ;
17175 : :
17176 : : /*
17177 : : * The production for a qualified relation name has to exactly match the
17178 : : * production for a qualified func_name, because in a FROM clause we cannot
17179 : : * tell which we are parsing until we see what comes after it ('(' for a
17180 : : * func_name, something else for a relation). Therefore we allow 'indirection'
17181 : : * which may contain subscripts, and reject that case in the C code.
17182 : : */
17183 : : qualified_name:
17184 : : ColId
17185 : : {
4871 rhaas@postgresql.org 17186 : 186682 : $$ = makeRangeVar(NULL, $1, @1);
17187 : : }
17188 : : | ColId indirection
17189 : : {
900 akapila@postgresql.o 17190 : 109408 : $$ = makeRangeVarFromQualifiedName($1, $2, @1, yyscanner);
17191 : : }
17192 : : ;
17193 : :
17194 : : name_list: name
7259 neilc@samurai.com 17195 : 11813 : { $$ = list_make1(makeString($1)); }
17196 : : | name_list ',' name
7971 bruce@momjian.us 17197 : 23658 : { $$ = lappend($1, makeString($3)); }
17198 : : ;
17199 : :
17200 : :
7972 17201 : 69816 : name: ColId { $$ = $1; };
17202 : :
7173 tgl@sss.pgh.pa.us 17203 : 676722 : attr_name: ColLabel { $$ = $1; };
17204 : :
7972 bruce@momjian.us 17205 : 29 : file_name: Sconst { $$ = $1; };
17206 : :
17207 : : /*
17208 : : * The production for a qualified func_name has to exactly match the
17209 : : * production for a qualified columnref, because we cannot tell which we
17210 : : * are parsing until we see what comes after it ('(' or Sconst for a func_name,
17211 : : * anything else for a columnref). Therefore we allow 'indirection' which
17212 : : * may contain subscripts, and reject that case in the C code. (If we
17213 : : * ever implement SQL99-like methods, such syntax may actually become legal!)
17214 : : */
17215 : : func_name: type_function_name
7259 neilc@samurai.com 17216 : 142142 : { $$ = list_make1(makeString($1)); }
17217 : : | ColId indirection
17218 : : {
5389 tgl@sss.pgh.pa.us 17219 : 55017 : $$ = check_func_name(lcons(makeString($1), $2),
17220 : : yyscanner);
17221 : : }
17222 : : ;
17223 : :
17224 : :
17225 : : /*
17226 : : * Constants
17227 : : */
17228 : : AexprConst: Iconst
17229 : : {
5708 17230 : 216003 : $$ = makeIntConst($1, @1);
17231 : : }
17232 : : | FCONST
17233 : : {
17234 : 5293 : $$ = makeFloatConst($1, @1);
17235 : : }
17236 : : | Sconst
17237 : : {
17238 : 274169 : $$ = makeStringConst($1, @1);
17239 : : }
17240 : : | BCONST
17241 : : {
17242 : 376 : $$ = makeBitStringConst($1, @1);
17243 : : }
17244 : : | XCONST
17245 : : {
17246 : : /* This is a bit constant per SQL99:
17247 : : * Without Feature F511, "BIT data type",
17248 : : * a <general literal> shall not be a
17249 : : * <bit string literal> or a <hex string literal>.
17250 : : */
17251 : 1659 : $$ = makeBitStringConst($1, @1);
17252 : : }
17253 : : | func_name Sconst
17254 : : {
17255 : : /* generic type 'literal' syntax */
702 peter@eisentraut.org 17256 : 4672 : TypeName *t = makeTypeNameFromNameList($1);
17257 : :
5829 alvherre@alvh.no-ip. 17258 : 4672 : t->location = @1;
5708 tgl@sss.pgh.pa.us 17259 : 4672 : $$ = makeStringConstCast($2, @2, t);
17260 : : }
17261 : : | func_name '(' func_arg_list opt_sort_clause ')' Sconst
17262 : : {
17263 : : /* generic syntax with a type modifier */
702 peter@eisentraut.org 17264 :UBC 0 : TypeName *t = makeTypeNameFromNameList($1);
17265 : : ListCell *lc;
17266 : :
17267 : : /*
17268 : : * We must use func_arg_list and opt_sort_clause in the
17269 : : * production to avoid reduce/reduce conflicts, but we
17270 : : * don't actually wish to allow NamedArgExpr in this
17271 : : * context, nor ORDER BY.
17272 : : */
5302 tgl@sss.pgh.pa.us 17273 [ # # # # : 0 : foreach(lc, $3)
# # ]
17274 : : {
17275 : 0 : NamedArgExpr *arg = (NamedArgExpr *) lfirst(lc);
17276 : :
17277 [ # # ]: 0 : if (IsA(arg, NamedArgExpr))
17278 [ # # ]: 0 : ereport(ERROR,
17279 : : (errcode(ERRCODE_SYNTAX_ERROR),
17280 : : errmsg("type modifier cannot have parameter name"),
17281 : : parser_errposition(arg->location)));
17282 : : }
3765 17283 [ # # ]: 0 : if ($4 != NIL)
17284 [ # # ]: 0 : ereport(ERROR,
17285 : : (errcode(ERRCODE_SYNTAX_ERROR),
17286 : : errmsg("type modifier cannot have ORDER BY"),
17287 : : parser_errposition(@4)));
17288 : :
5829 alvherre@alvh.no-ip. 17289 : 0 : t->typmods = $3;
17290 : 0 : t->location = @1;
3765 tgl@sss.pgh.pa.us 17291 : 0 : $$ = makeStringConstCast($6, @6, t);
17292 : : }
17293 : : | ConstTypename Sconst
17294 : : {
5708 tgl@sss.pgh.pa.us 17295 :CBC 1454 : $$ = makeStringConstCast($2, @2, $1);
17296 : : }
17297 : : | ConstInterval Sconst opt_interval
17298 : : {
702 peter@eisentraut.org 17299 : 1616 : TypeName *t = $1;
17300 : :
5694 tgl@sss.pgh.pa.us 17301 : 1616 : t->typmods = $3;
5708 17302 : 1616 : $$ = makeStringConstCast($2, @2, t);
17303 : : }
17304 : : | ConstInterval '(' Iconst ')' Sconst
17305 : : {
702 peter@eisentraut.org 17306 : 6 : TypeName *t = $1;
17307 : :
3466 bruce@momjian.us 17308 : 6 : t->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1),
17309 : : makeIntConst($3, @3));
5708 tgl@sss.pgh.pa.us 17310 : 6 : $$ = makeStringConstCast($5, @5, t);
17311 : : }
17312 : : | TRUE_P
17313 : : {
2433 peter_e@gmx.net 17314 : 11666 : $$ = makeBoolAConst(true, @1);
17315 : : }
17316 : : | FALSE_P
17317 : : {
17318 : 16463 : $$ = makeBoolAConst(false, @1);
17319 : : }
17320 : : | NULL_P
17321 : : {
5708 tgl@sss.pgh.pa.us 17322 : 28162 : $$ = makeNullAConst(@1);
17323 : : }
17324 : : ;
17325 : :
7972 bruce@momjian.us 17326 : 227351 : Iconst: ICONST { $$ = $1; };
17327 : 306788 : Sconst: SCONST { $$ = $1; };
17328 : :
5632 meskes@postgresql.or 17329 : 7365 : SignedIconst: Iconst { $$ = $1; }
5632 meskes@postgresql.or 17330 :UBC 0 : | '+' Iconst { $$ = + $2; }
5632 meskes@postgresql.or 17331 :CBC 133 : | '-' Iconst { $$ = - $2; }
17332 : : ;
17333 : :
17334 : : /* Role specifications */
17335 : : RoleId: RoleSpec
17336 : : {
702 peter@eisentraut.org 17337 : 884 : RoleSpec *spc = (RoleSpec *) $1;
17338 : :
3324 alvherre@alvh.no-ip. 17339 [ + + + + : 884 : switch (spc->roletype)
+ - ]
17340 : : {
17341 : 879 : case ROLESPEC_CSTRING:
17342 : 879 : $$ = spc->rolename;
17343 : 879 : break;
17344 : 2 : case ROLESPEC_PUBLIC:
17345 [ + - ]: 2 : ereport(ERROR,
17346 : : (errcode(ERRCODE_RESERVED_NAME),
17347 : : errmsg("role name \"%s\" is reserved",
17348 : : "public"),
17349 : : parser_errposition(@1)));
17350 : : break;
17351 : 1 : case ROLESPEC_SESSION_USER:
17352 [ + - ]: 1 : ereport(ERROR,
17353 : : (errcode(ERRCODE_RESERVED_NAME),
17354 : : errmsg("%s cannot be used as a role name here",
17355 : : "SESSION_USER"),
17356 : : parser_errposition(@1)));
17357 : : break;
17358 : 1 : case ROLESPEC_CURRENT_USER:
17359 [ + - ]: 1 : ereport(ERROR,
17360 : : (errcode(ERRCODE_RESERVED_NAME),
17361 : : errmsg("%s cannot be used as a role name here",
17362 : : "CURRENT_USER"),
17363 : : parser_errposition(@1)));
17364 : : break;
1305 peter@eisentraut.org 17365 : 1 : case ROLESPEC_CURRENT_ROLE:
17366 [ + - ]: 1 : ereport(ERROR,
17367 : : (errcode(ERRCODE_RESERVED_NAME),
17368 : : errmsg("%s cannot be used as a role name here",
17369 : : "CURRENT_ROLE"),
17370 : : parser_errposition(@1)));
17371 : : break;
17372 : : }
17373 : : }
17374 : : ;
17375 : :
17376 : : RoleSpec: NonReservedWord
17377 : : {
17378 : : /*
17379 : : * "public" and "none" are not keywords, but they must
17380 : : * be treated specially here.
17381 : : */
17382 : : RoleSpec *n;
17383 : :
702 17384 [ + + ]: 12363 : if (strcmp($1, "public") == 0)
17385 : : {
17386 : 5921 : n = (RoleSpec *) makeRoleSpec(ROLESPEC_PUBLIC, @1);
17387 : 5921 : n->roletype = ROLESPEC_PUBLIC;
17388 : : }
17389 [ + + ]: 6442 : else if (strcmp($1, "none") == 0)
17390 : : {
17391 [ + - ]: 13 : ereport(ERROR,
17392 : : (errcode(ERRCODE_RESERVED_NAME),
17393 : : errmsg("role name \"%s\" is reserved",
17394 : : "none"),
17395 : : parser_errposition(@1)));
17396 : : }
17397 : : else
17398 : : {
17399 : 6429 : n = makeRoleSpec(ROLESPEC_CSTRING, @1);
17400 : 6429 : n->rolename = pstrdup($1);
17401 : : }
17402 : 12350 : $$ = n;
17403 : : }
17404 : : | CURRENT_ROLE
17405 : : {
17406 : 64 : $$ = makeRoleSpec(ROLESPEC_CURRENT_ROLE, @1);
17407 : : }
17408 : : | CURRENT_USER
17409 : : {
17410 : 114 : $$ = makeRoleSpec(ROLESPEC_CURRENT_USER, @1);
17411 : : }
17412 : : | SESSION_USER
17413 : : {
17414 : 18 : $$ = makeRoleSpec(ROLESPEC_SESSION_USER, @1);
17415 : : }
17416 : : ;
17417 : :
17418 : : role_list: RoleSpec
17419 : 1549 : { $$ = list_make1($1); }
17420 : : | role_list ',' RoleSpec
17421 : 129 : { $$ = lappend($1, $3); }
17422 : : ;
17423 : :
17424 : :
17425 : : /*****************************************************************************
17426 : : *
17427 : : * PL/pgSQL extensions
17428 : : *
17429 : : * You'd think a PL/pgSQL "expression" should be just an a_expr, but
17430 : : * historically it can include just about anything that can follow SELECT.
17431 : : * Therefore the returned struct is a SelectStmt.
17432 : : *****************************************************************************/
17433 : :
17434 : : PLpgSQL_Expr: opt_distinct_clause opt_target_list
17435 : : from_clause where_clause
17436 : : group_clause having_clause window_clause
17437 : : opt_sort_clause opt_select_limit opt_for_locking_clause
17438 : : {
1196 tgl@sss.pgh.pa.us 17439 : 20482 : SelectStmt *n = makeNode(SelectStmt);
17440 : :
1178 17441 : 20482 : n->distinctClause = $1;
17442 : 20482 : n->targetList = $2;
17443 : 20482 : n->fromClause = $3;
17444 : 20482 : n->whereClause = $4;
1123 tomas.vondra@postgre 17445 : 20482 : n->groupClause = ($5)->list;
17446 : 20482 : n->groupDistinct = ($5)->distinct;
1178 tgl@sss.pgh.pa.us 17447 : 20482 : n->havingClause = $6;
17448 : 20482 : n->windowClause = $7;
17449 : 20482 : n->sortClause = $8;
17450 [ + + ]: 20482 : if ($9)
17451 : : {
17452 : 2 : n->limitOffset = $9->limitOffset;
17453 : 2 : n->limitCount = $9->limitCount;
1196 17454 [ + - ]: 2 : if (!n->sortClause &&
1178 17455 [ - + ]: 2 : $9->limitOption == LIMIT_OPTION_WITH_TIES)
1196 tgl@sss.pgh.pa.us 17456 [ # # ]:UBC 0 : ereport(ERROR,
17457 : : (errcode(ERRCODE_SYNTAX_ERROR),
17458 : : errmsg("WITH TIES cannot be specified without ORDER BY clause")));
1178 tgl@sss.pgh.pa.us 17459 :CBC 2 : n->limitOption = $9->limitOption;
17460 : : }
17461 : 20482 : n->lockingClause = $10;
1196 17462 : 20482 : $$ = (Node *) n;
17463 : : }
17464 : : ;
17465 : :
17466 : : /*
17467 : : * PL/pgSQL Assignment statement: name opt_indirection := PLpgSQL_Expr
17468 : : */
17469 : :
17470 : : PLAssignStmt: plassign_target opt_indirection plassign_equals PLpgSQL_Expr
17471 : : {
17472 : 3837 : PLAssignStmt *n = makeNode(PLAssignStmt);
17473 : :
17474 : 3837 : n->name = $1;
17475 : 3837 : n->indirection = check_indirection($2, yyscanner);
17476 : : /* nnames will be filled by calling production */
17477 : 3837 : n->val = (SelectStmt *) $4;
17478 : 3837 : n->location = @1;
17479 : 3837 : $$ = (Node *) n;
17480 : : }
17481 : : ;
17482 : :
17483 : 3825 : plassign_target: ColId { $$ = $1; }
17484 : 12 : | PARAM { $$ = psprintf("$%d", $1); }
17485 : : ;
17486 : :
17487 : : plassign_equals: COLON_EQUALS
17488 : : | '='
17489 : : ;
17490 : :
17491 : :
17492 : : /*
17493 : : * Name classification hierarchy.
17494 : : *
17495 : : * IDENT is the lexeme returned by the lexer for identifiers that match
17496 : : * no known keyword. In most cases, we can accept certain keywords as
17497 : : * names, not only IDENTs. We prefer to accept as many such keywords
17498 : : * as possible to minimize the impact of "reserved words" on programmers.
17499 : : * So, we divide names into several possible classes. The classification
17500 : : * is chosen in part to make keywords acceptable as names wherever possible.
17501 : : */
17502 : :
17503 : : /* Column identifier --- names that can be column, table, etc names.
17504 : : */
7972 bruce@momjian.us 17505 : 1439828 : ColId: IDENT { $$ = $1; }
17506 : 27424 : | unreserved_keyword { $$ = pstrdup($1); }
17507 : 2346 : | col_name_keyword { $$ = pstrdup($1); }
17508 : : ;
17509 : :
17510 : : /* Type/function identifier --- names that can be type or function names.
17511 : : */
6315 tgl@sss.pgh.pa.us 17512 : 311590 : type_function_name: IDENT { $$ = $1; }
7972 bruce@momjian.us 17513 : 33761 : | unreserved_keyword { $$ = pstrdup($1); }
6315 tgl@sss.pgh.pa.us 17514 : 21 : | type_func_name_keyword { $$ = pstrdup($1); }
17515 : : ;
17516 : :
17517 : : /* Any not-fully-reserved word --- these names can be, eg, role names.
17518 : : */
3969 17519 : 32665 : NonReservedWord: IDENT { $$ = $1; }
17520 : 12567 : | unreserved_keyword { $$ = pstrdup($1); }
17521 : 88 : | col_name_keyword { $$ = pstrdup($1); }
17522 : 1781 : | type_func_name_keyword { $$ = pstrdup($1); }
17523 : : ;
17524 : :
17525 : : /* Column label --- allowed labels in "AS" clauses.
17526 : : * This presently includes *all* Postgres keywords.
17527 : : */
7972 bruce@momjian.us 17528 : 761550 : ColLabel: IDENT { $$ = $1; }
17529 : 16866 : | unreserved_keyword { $$ = pstrdup($1); }
17530 : 136 : | col_name_keyword { $$ = pstrdup($1); }
6315 tgl@sss.pgh.pa.us 17531 : 881 : | type_func_name_keyword { $$ = pstrdup($1); }
7972 bruce@momjian.us 17532 : 3501 : | reserved_keyword { $$ = pstrdup($1); }
17533 : : ;
17534 : :
17535 : : /* Bare column label --- names that can be column labels without writing "AS".
17536 : : * This classification is orthogonal to the other keyword categories.
17537 : : */
1304 tgl@sss.pgh.pa.us 17538 : 1559 : BareColLabel: IDENT { $$ = $1; }
17539 : 3 : | bare_label_keyword { $$ = pstrdup($1); }
17540 : : ;
17541 : :
17542 : :
17543 : : /*
17544 : : * Keyword category lists. Generally, every keyword present in
17545 : : * the Postgres grammar should appear in exactly one of these lists.
17546 : : *
17547 : : * Put a new keyword into the first list that it can go into without causing
17548 : : * shift or reduce conflicts. The earlier lists define "less reserved"
17549 : : * categories of keywords.
17550 : : *
17551 : : * Make sure that each keyword's category in kwlist.h matches where
17552 : : * it is listed here. (Someday we may be able to generate these lists and
17553 : : * kwlist.h's table from one source of truth.)
17554 : : */
17555 : :
17556 : : /* "Unreserved" keywords --- available for use as any kind of name.
17557 : : */
17558 : : unreserved_keyword:
17559 : : ABORT_P
17560 : : | ABSENT
17561 : : | ABSOLUTE_P
17562 : : | ACCESS
17563 : : | ACTION
17564 : : | ADD_P
17565 : : | ADMIN
17566 : : | AFTER
17567 : : | AGGREGATE
17568 : : | ALSO
17569 : : | ALTER
17570 : : | ALWAYS
17571 : : | ASENSITIVE
17572 : : | ASSERTION
17573 : : | ASSIGNMENT
17574 : : | AT
17575 : : | ATOMIC
17576 : : | ATTACH
17577 : : | ATTRIBUTE
17578 : : | BACKWARD
17579 : : | BEFORE
17580 : : | BEGIN_P
17581 : : | BREADTH
17582 : : | BY
17583 : : | CACHE
17584 : : | CALL
17585 : : | CALLED
17586 : : | CASCADE
17587 : : | CASCADED
17588 : : | CATALOG_P
17589 : : | CHAIN
17590 : : | CHARACTERISTICS
17591 : : | CHECKPOINT
17592 : : | CLASS
17593 : : | CLOSE
17594 : : | CLUSTER
17595 : : | COLUMNS
17596 : : | COMMENT
17597 : : | COMMENTS
17598 : : | COMMIT
17599 : : | COMMITTED
17600 : : | COMPRESSION
17601 : : | CONDITIONAL
17602 : : | CONFIGURATION
17603 : : | CONFLICT
17604 : : | CONNECTION
17605 : : | CONSTRAINTS
17606 : : | CONTENT_P
17607 : : | CONTINUE_P
17608 : : | CONVERSION_P
17609 : : | COPY
17610 : : | COST
17611 : : | CSV
17612 : : | CUBE
17613 : : | CURRENT_P
17614 : : | CURSOR
17615 : : | CYCLE
17616 : : | DATA_P
17617 : : | DATABASE
17618 : : | DAY_P
17619 : : | DEALLOCATE
17620 : : | DECLARE
17621 : : | DEFAULTS
17622 : : | DEFERRED
17623 : : | DEFINER
17624 : : | DELETE_P
17625 : : | DELIMITER
17626 : : | DELIMITERS
17627 : : | DEPENDS
17628 : : | DEPTH
17629 : : | DETACH
17630 : : | DICTIONARY
17631 : : | DISABLE_P
17632 : : | DISCARD
17633 : : | DOCUMENT_P
17634 : : | DOMAIN_P
17635 : : | DOUBLE_P
17636 : : | DROP
17637 : : | EACH
17638 : : | EMPTY_P
17639 : : | ENABLE_P
17640 : : | ENCODING
17641 : : | ENCRYPTED
17642 : : | ENUM_P
17643 : : | ERROR_P
17644 : : | ESCAPE
17645 : : | EVENT
17646 : : | EXCLUDE
17647 : : | EXCLUDING
17648 : : | EXCLUSIVE
17649 : : | EXECUTE
17650 : : | EXPLAIN
17651 : : | EXPRESSION
17652 : : | EXTENSION
17653 : : | EXTERNAL
17654 : : | FAMILY
17655 : : | FILTER
17656 : : | FINALIZE
17657 : : | FIRST_P
17658 : : | FOLLOWING
17659 : : | FORCE
17660 : : | FORMAT
17661 : : | FORWARD
17662 : : | FUNCTION
17663 : : | FUNCTIONS
17664 : : | GENERATED
17665 : : | GLOBAL
17666 : : | GRANTED
17667 : : | GROUPS
17668 : : | HANDLER
17669 : : | HEADER_P
17670 : : | HOLD
17671 : : | HOUR_P
17672 : : | IDENTITY_P
17673 : : | IF_P
17674 : : | IMMEDIATE
17675 : : | IMMUTABLE
17676 : : | IMPLICIT_P
17677 : : | IMPORT_P
17678 : : | INCLUDE
17679 : : | INCLUDING
17680 : : | INCREMENT
17681 : : | INDENT
17682 : : | INDEX
17683 : : | INDEXES
17684 : : | INHERIT
17685 : : | INHERITS
17686 : : | INLINE_P
17687 : : | INPUT_P
17688 : : | INSENSITIVE
17689 : : | INSERT
17690 : : | INSTEAD
17691 : : | INVOKER
17692 : : | ISOLATION
17693 : : | KEEP
17694 : : | KEY
17695 : : | KEYS
17696 : : | LABEL
17697 : : | LANGUAGE
17698 : : | LARGE_P
17699 : : | LAST_P
17700 : : | LEAKPROOF
17701 : : | LEVEL
17702 : : | LISTEN
17703 : : | LOAD
17704 : : | LOCAL
17705 : : | LOCATION
17706 : : | LOCK_P
17707 : : | LOCKED
17708 : : | LOGGED
17709 : : | MAPPING
17710 : : | MATCH
17711 : : | MATCHED
17712 : : | MATERIALIZED
17713 : : | MAXVALUE
17714 : : | MERGE
17715 : : | METHOD
17716 : : | MINUTE_P
17717 : : | MINVALUE
17718 : : | MODE
17719 : : | MONTH_P
17720 : : | MOVE
17721 : : | NAME_P
17722 : : | NAMES
17723 : : | NESTED
17724 : : | NEW
17725 : : | NEXT
17726 : : | NFC
17727 : : | NFD
17728 : : | NFKC
17729 : : | NFKD
17730 : : | NO
17731 : : | NORMALIZED
17732 : : | NOTHING
17733 : : | NOTIFY
17734 : : | NOWAIT
17735 : : | NULLS_P
17736 : : | OBJECT_P
17737 : : | OF
17738 : : | OFF
17739 : : | OIDS
17740 : : | OLD
17741 : : | OMIT
17742 : : | OPERATOR
17743 : : | OPTION
17744 : : | OPTIONS
17745 : : | ORDINALITY
17746 : : | OTHERS
17747 : : | OVER
17748 : : | OVERRIDING
17749 : : | OWNED
17750 : : | OWNER
17751 : : | PARALLEL
17752 : : | PARAMETER
17753 : : | PARSER
17754 : : | PARTIAL
17755 : : | PARTITION
17756 : : | PARTITIONS
17757 : : | PASSING
17758 : : | PASSWORD
17759 : : | PATH
17760 : : | PERIOD
17761 : : | PLAN
17762 : : | PLANS
17763 : : | POLICY
17764 : : | PRECEDING
17765 : : | PREPARE
17766 : : | PREPARED
17767 : : | PRESERVE
17768 : : | PRIOR
17769 : : | PRIVILEGES
17770 : : | PROCEDURAL
17771 : : | PROCEDURE
17772 : : | PROCEDURES
17773 : : | PROGRAM
17774 : : | PUBLICATION
17775 : : | QUOTE
17776 : : | QUOTES
17777 : : | RANGE
17778 : : | READ
17779 : : | REASSIGN
17780 : : | RECHECK
17781 : : | RECURSIVE
17782 : : | REF_P
17783 : : | REFERENCING
17784 : : | REFRESH
17785 : : | REINDEX
17786 : : | RELATIVE_P
17787 : : | RELEASE
17788 : : | RENAME
17789 : : | REPEATABLE
17790 : : | REPLACE
17791 : : | REPLICA
17792 : : | RESET
17793 : : | RESTART
17794 : : | RESTRICT
17795 : : | RETURN
17796 : : | RETURNS
17797 : : | REVOKE
17798 : : | ROLE
17799 : : | ROLLBACK
17800 : : | ROLLUP
17801 : : | ROUTINE
17802 : : | ROUTINES
17803 : : | ROWS
17804 : : | RULE
17805 : : | SAVEPOINT
17806 : : | SCALAR
17807 : : | SCHEMA
17808 : : | SCHEMAS
17809 : : | SCROLL
17810 : : | SEARCH
17811 : : | SECOND_P
17812 : : | SECURITY
17813 : : | SEQUENCE
17814 : : | SEQUENCES
17815 : : | SERIALIZABLE
17816 : : | SERVER
17817 : : | SESSION
17818 : : | SET
17819 : : | SETS
17820 : : | SHARE
17821 : : | SHOW
17822 : : | SIMPLE
17823 : : | SKIP
17824 : : | SNAPSHOT
17825 : : | SOURCE
17826 : : | SPLIT
17827 : : | SQL_P
17828 : : | STABLE
17829 : : | STANDALONE_P
17830 : : | START
17831 : : | STATEMENT
17832 : : | STATISTICS
17833 : : | STDIN
17834 : : | STDOUT
17835 : : | STORAGE
17836 : : | STORED
17837 : : | STRICT_P
17838 : : | STRING_P
17839 : : | STRIP_P
17840 : : | SUBSCRIPTION
17841 : : | SUPPORT
17842 : : | SYSID
17843 : : | SYSTEM_P
17844 : : | TABLES
17845 : : | TABLESPACE
17846 : : | TARGET
17847 : : | TEMP
17848 : : | TEMPLATE
17849 : : | TEMPORARY
17850 : : | TEXT_P
17851 : : | TIES
17852 : : | TRANSACTION
17853 : : | TRANSFORM
17854 : : | TRIGGER
17855 : : | TRUNCATE
17856 : : | TRUSTED
17857 : : | TYPE_P
17858 : : | TYPES_P
17859 : : | UESCAPE
17860 : : | UNBOUNDED
17861 : : | UNCOMMITTED
17862 : : | UNCONDITIONAL
17863 : : | UNENCRYPTED
17864 : : | UNKNOWN
17865 : : | UNLISTEN
17866 : : | UNLOGGED
17867 : : | UNTIL
17868 : : | UPDATE
17869 : : | VACUUM
17870 : : | VALID
17871 : : | VALIDATE
17872 : : | VALIDATOR
17873 : : | VALUE_P
17874 : : | VARYING
17875 : : | VERSION_P
17876 : : | VIEW
17877 : : | VIEWS
17878 : : | VOLATILE
17879 : : | WHITESPACE_P
17880 : : | WITHIN
17881 : : | WITHOUT
17882 : : | WORK
17883 : : | WRAPPER
17884 : : | WRITE
17885 : : | XML_P
17886 : : | YEAR_P
17887 : : | YES_P
17888 : : | ZONE
17889 : : ;
17890 : :
17891 : : /* Column identifier --- keywords that can be column, table, etc names.
17892 : : *
17893 : : * Many of these keywords will in fact be recognized as type or function
17894 : : * names too; but they have special productions for the purpose, and so
17895 : : * can't be treated as "generic" type or function names.
17896 : : *
17897 : : * The type names appearing here are not usable as function names
17898 : : * because they can be followed by '(' in typename productions, which
17899 : : * looks too much like a function call for an LR(1) parser.
17900 : : */
17901 : : col_name_keyword:
17902 : : BETWEEN
17903 : : | BIGINT
17904 : : | BIT
17905 : : | BOOLEAN_P
17906 : : | CHAR_P
17907 : : | CHARACTER
17908 : : | COALESCE
17909 : : | DEC
17910 : : | DECIMAL_P
17911 : : | EXISTS
17912 : : | EXTRACT
17913 : : | FLOAT_P
17914 : : | GREATEST
17915 : : | GROUPING
17916 : : | INOUT
17917 : : | INT_P
17918 : : | INTEGER
17919 : : | INTERVAL
17920 : : | JSON
17921 : : | JSON_ARRAY
17922 : : | JSON_ARRAYAGG
17923 : : | JSON_EXISTS
17924 : : | JSON_OBJECT
17925 : : | JSON_OBJECTAGG
17926 : : | JSON_QUERY
17927 : : | JSON_SCALAR
17928 : : | JSON_SERIALIZE
17929 : : | JSON_TABLE
17930 : : | JSON_VALUE
17931 : : | LEAST
17932 : : | MERGE_ACTION
17933 : : | NATIONAL
17934 : : | NCHAR
17935 : : | NONE
17936 : : | NORMALIZE
17937 : : | NULLIF
17938 : : | NUMERIC
17939 : : | OUT_P
17940 : : | OVERLAY
17941 : : | POSITION
17942 : : | PRECISION
17943 : : | REAL
17944 : : | ROW
17945 : : | SETOF
17946 : : | SMALLINT
17947 : : | SUBSTRING
17948 : : | TIME
17949 : : | TIMESTAMP
17950 : : | TREAT
17951 : : | TRIM
17952 : : | VALUES
17953 : : | VARCHAR
17954 : : | XMLATTRIBUTES
17955 : : | XMLCONCAT
17956 : : | XMLELEMENT
17957 : : | XMLEXISTS
17958 : : | XMLFOREST
17959 : : | XMLNAMESPACES
17960 : : | XMLPARSE
17961 : : | XMLPI
17962 : : | XMLROOT
17963 : : | XMLSERIALIZE
17964 : : | XMLTABLE
17965 : : ;
17966 : :
17967 : : /* Type/function identifier --- keywords that can be type or function names.
17968 : : *
17969 : : * Most of these are keywords that are used as operators in expressions;
17970 : : * in general such keywords can't be column names because they would be
17971 : : * ambiguous with variables, but they are unambiguous as function identifiers.
17972 : : *
17973 : : * Do not include POSITION, SUBSTRING, etc here since they have explicit
17974 : : * productions in a_expr to support the goofy SQL9x argument syntax.
17975 : : * - thomas 2000-11-28
17976 : : */
17977 : : type_func_name_keyword:
17978 : : AUTHORIZATION
17979 : : | BINARY
17980 : : | COLLATION
17981 : : | CONCURRENTLY
17982 : : | CROSS
17983 : : | CURRENT_SCHEMA
17984 : : | FREEZE
17985 : : | FULL
17986 : : | ILIKE
17987 : : | INNER_P
17988 : : | IS
17989 : : | ISNULL
17990 : : | JOIN
17991 : : | LEFT
17992 : : | LIKE
17993 : : | NATURAL
17994 : : | NOTNULL
17995 : : | OUTER_P
17996 : : | OVERLAPS
17997 : : | RIGHT
17998 : : | SIMILAR
17999 : : | TABLESAMPLE
18000 : : | VERBOSE
18001 : : ;
18002 : :
18003 : : /* Reserved keyword --- these keywords are usable only as a ColLabel.
18004 : : *
18005 : : * Keywords appear here if they could not be distinguished from variable,
18006 : : * type, or function names in some contexts. Don't put things here unless
18007 : : * forced to.
18008 : : */
18009 : : reserved_keyword:
18010 : : ALL
18011 : : | ANALYSE
18012 : : | ANALYZE
18013 : : | AND
18014 : : | ANY
18015 : : | ARRAY
18016 : : | AS
18017 : : | ASC
18018 : : | ASYMMETRIC
18019 : : | BOTH
18020 : : | CASE
18021 : : | CAST
18022 : : | CHECK
18023 : : | COLLATE
18024 : : | COLUMN
18025 : : | CONSTRAINT
18026 : : | CREATE
18027 : : | CURRENT_CATALOG
18028 : : | CURRENT_DATE
18029 : : | CURRENT_ROLE
18030 : : | CURRENT_TIME
18031 : : | CURRENT_TIMESTAMP
18032 : : | CURRENT_USER
18033 : : | DEFAULT
18034 : : | DEFERRABLE
18035 : : | DESC
18036 : : | DISTINCT
18037 : : | DO
18038 : : | ELSE
18039 : : | END_P
18040 : : | EXCEPT
18041 : : | FALSE_P
18042 : : | FETCH
18043 : : | FOR
18044 : : | FOREIGN
18045 : : | FROM
18046 : : | GRANT
18047 : : | GROUP_P
18048 : : | HAVING
18049 : : | IN_P
18050 : : | INITIALLY
18051 : : | INTERSECT
18052 : : | INTO
18053 : : | LATERAL_P
18054 : : | LEADING
18055 : : | LIMIT
18056 : : | LOCALTIME
18057 : : | LOCALTIMESTAMP
18058 : : | NOT
18059 : : | NULL_P
18060 : : | OFFSET
18061 : : | ON
18062 : : | ONLY
18063 : : | OR
18064 : : | ORDER
18065 : : | PLACING
18066 : : | PRIMARY
18067 : : | REFERENCES
18068 : : | RETURNING
18069 : : | SELECT
18070 : : | SESSION_USER
18071 : : | SOME
18072 : : | SYMMETRIC
18073 : : | SYSTEM_USER
18074 : : | TABLE
18075 : : | THEN
18076 : : | TO
18077 : : | TRAILING
18078 : : | TRUE_P
18079 : : | UNION
18080 : : | UNIQUE
18081 : : | USER
18082 : : | USING
18083 : : | VARIADIC
18084 : : | WHEN
18085 : : | WHERE
18086 : : | WINDOW
18087 : : | WITH
18088 : : ;
18089 : :
18090 : : /*
18091 : : * While all keywords can be used as column labels when preceded by AS,
18092 : : * not all of them can be used as a "bare" column label without AS.
18093 : : * Those that can be used as a bare label must be listed here,
18094 : : * in addition to appearing in one of the category lists above.
18095 : : *
18096 : : * Always add a new keyword to this list if possible. Mark it BARE_LABEL
18097 : : * in kwlist.h if it is included here, or AS_LABEL if it is not.
18098 : : */
18099 : : bare_label_keyword:
18100 : : ABORT_P
18101 : : | ABSENT
18102 : : | ABSOLUTE_P
18103 : : | ACCESS
18104 : : | ACTION
18105 : : | ADD_P
18106 : : | ADMIN
18107 : : | AFTER
18108 : : | AGGREGATE
18109 : : | ALL
18110 : : | ALSO
18111 : : | ALTER
18112 : : | ALWAYS
18113 : : | ANALYSE
18114 : : | ANALYZE
18115 : : | AND
18116 : : | ANY
18117 : : | ASC
18118 : : | ASENSITIVE
18119 : : | ASSERTION
18120 : : | ASSIGNMENT
18121 : : | ASYMMETRIC
18122 : : | AT
18123 : : | ATOMIC
18124 : : | ATTACH
18125 : : | ATTRIBUTE
18126 : : | AUTHORIZATION
18127 : : | BACKWARD
18128 : : | BEFORE
18129 : : | BEGIN_P
18130 : : | BETWEEN
18131 : : | BIGINT
18132 : : | BINARY
18133 : : | BIT
18134 : : | BOOLEAN_P
18135 : : | BOTH
18136 : : | BREADTH
18137 : : | BY
18138 : : | CACHE
18139 : : | CALL
18140 : : | CALLED
18141 : : | CASCADE
18142 : : | CASCADED
18143 : : | CASE
18144 : : | CAST
18145 : : | CATALOG_P
18146 : : | CHAIN
18147 : : | CHARACTERISTICS
18148 : : | CHECK
18149 : : | CHECKPOINT
18150 : : | CLASS
18151 : : | CLOSE
18152 : : | CLUSTER
18153 : : | COALESCE
18154 : : | COLLATE
18155 : : | COLLATION
18156 : : | COLUMN
18157 : : | COLUMNS
18158 : : | COMMENT
18159 : : | COMMENTS
18160 : : | COMMIT
18161 : : | COMMITTED
18162 : : | COMPRESSION
18163 : : | CONCURRENTLY
18164 : : | CONDITIONAL
18165 : : | CONFIGURATION
18166 : : | CONFLICT
18167 : : | CONNECTION
18168 : : | CONSTRAINT
18169 : : | CONSTRAINTS
18170 : : | CONTENT_P
18171 : : | CONTINUE_P
18172 : : | CONVERSION_P
18173 : : | COPY
18174 : : | COST
18175 : : | CROSS
18176 : : | CSV
18177 : : | CUBE
18178 : : | CURRENT_P
18179 : : | CURRENT_CATALOG
18180 : : | CURRENT_DATE
18181 : : | CURRENT_ROLE
18182 : : | CURRENT_SCHEMA
18183 : : | CURRENT_TIME
18184 : : | CURRENT_TIMESTAMP
18185 : : | CURRENT_USER
18186 : : | CURSOR
18187 : : | CYCLE
18188 : : | DATA_P
18189 : : | DATABASE
18190 : : | DEALLOCATE
18191 : : | DEC
18192 : : | DECIMAL_P
18193 : : | DECLARE
18194 : : | DEFAULT
18195 : : | DEFAULTS
18196 : : | DEFERRABLE
18197 : : | DEFERRED
18198 : : | DEFINER
18199 : : | DELETE_P
18200 : : | DELIMITER
18201 : : | DELIMITERS
18202 : : | DEPENDS
18203 : : | DEPTH
18204 : : | DESC
18205 : : | DETACH
18206 : : | DICTIONARY
18207 : : | DISABLE_P
18208 : : | DISCARD
18209 : : | DISTINCT
18210 : : | DO
18211 : : | DOCUMENT_P
18212 : : | DOMAIN_P
18213 : : | DOUBLE_P
18214 : : | DROP
18215 : : | EACH
18216 : : | ELSE
18217 : : | EMPTY_P
18218 : : | ENABLE_P
18219 : : | ENCODING
18220 : : | ENCRYPTED
18221 : : | END_P
18222 : : | ENUM_P
18223 : : | ERROR_P
18224 : : | ESCAPE
18225 : : | EVENT
18226 : : | EXCLUDE
18227 : : | EXCLUDING
18228 : : | EXCLUSIVE
18229 : : | EXECUTE
18230 : : | EXISTS
18231 : : | EXPLAIN
18232 : : | EXPRESSION
18233 : : | EXTENSION
18234 : : | EXTERNAL
18235 : : | EXTRACT
18236 : : | FALSE_P
18237 : : | FAMILY
18238 : : | FINALIZE
18239 : : | FIRST_P
18240 : : | FLOAT_P
18241 : : | FOLLOWING
18242 : : | FORCE
18243 : : | FOREIGN
18244 : : | FORMAT
18245 : : | FORWARD
18246 : : | FREEZE
18247 : : | FULL
18248 : : | FUNCTION
18249 : : | FUNCTIONS
18250 : : | GENERATED
18251 : : | GLOBAL
18252 : : | GRANTED
18253 : : | GREATEST
18254 : : | GROUPING
18255 : : | GROUPS
18256 : : | HANDLER
18257 : : | HEADER_P
18258 : : | HOLD
18259 : : | IDENTITY_P
18260 : : | IF_P
18261 : : | ILIKE
18262 : : | IMMEDIATE
18263 : : | IMMUTABLE
18264 : : | IMPLICIT_P
18265 : : | IMPORT_P
18266 : : | IN_P
18267 : : | INCLUDE
18268 : : | INCLUDING
18269 : : | INCREMENT
18270 : : | INDENT
18271 : : | INDEX
18272 : : | INDEXES
18273 : : | INHERIT
18274 : : | INHERITS
18275 : : | INITIALLY
18276 : : | INLINE_P
18277 : : | INNER_P
18278 : : | INOUT
18279 : : | INPUT_P
18280 : : | INSENSITIVE
18281 : : | INSERT
18282 : : | INSTEAD
18283 : : | INT_P
18284 : : | INTEGER
18285 : : | INTERVAL
18286 : : | INVOKER
18287 : : | IS
18288 : : | ISOLATION
18289 : : | JOIN
18290 : : | JSON
18291 : : | JSON_ARRAY
18292 : : | JSON_ARRAYAGG
18293 : : | JSON_EXISTS
18294 : : | JSON_OBJECT
18295 : : | JSON_OBJECTAGG
18296 : : | JSON_QUERY
18297 : : | JSON_SCALAR
18298 : : | JSON_SERIALIZE
18299 : : | JSON_TABLE
18300 : : | JSON_VALUE
18301 : : | KEEP
18302 : : | KEY
18303 : : | KEYS
18304 : : | LABEL
18305 : : | LANGUAGE
18306 : : | LARGE_P
18307 : : | LAST_P
18308 : : | LATERAL_P
18309 : : | LEADING
18310 : : | LEAKPROOF
18311 : : | LEAST
18312 : : | LEFT
18313 : : | LEVEL
18314 : : | LIKE
18315 : : | LISTEN
18316 : : | LOAD
18317 : : | LOCAL
18318 : : | LOCALTIME
18319 : : | LOCALTIMESTAMP
18320 : : | LOCATION
18321 : : | LOCK_P
18322 : : | LOCKED
18323 : : | LOGGED
18324 : : | MAPPING
18325 : : | MATCH
18326 : : | MATCHED
18327 : : | MATERIALIZED
18328 : : | MAXVALUE
18329 : : | MERGE
18330 : : | MERGE_ACTION
18331 : : | METHOD
18332 : : | MINVALUE
18333 : : | MODE
18334 : : | MOVE
18335 : : | NAME_P
18336 : : | NAMES
18337 : : | NATIONAL
18338 : : | NATURAL
18339 : : | NCHAR
18340 : : | NESTED
18341 : : | NEW
18342 : : | NEXT
18343 : : | NFC
18344 : : | NFD
18345 : : | NFKC
18346 : : | NFKD
18347 : : | NO
18348 : : | NONE
18349 : : | NORMALIZE
18350 : : | NORMALIZED
18351 : : | NOT
18352 : : | NOTHING
18353 : : | NOTIFY
18354 : : | NOWAIT
18355 : : | NULL_P
18356 : : | NULLIF
18357 : : | NULLS_P
18358 : : | NUMERIC
18359 : : | OBJECT_P
18360 : : | OF
18361 : : | OFF
18362 : : | OIDS
18363 : : | OLD
18364 : : | OMIT
18365 : : | ONLY
18366 : : | OPERATOR
18367 : : | OPTION
18368 : : | OPTIONS
18369 : : | OR
18370 : : | ORDINALITY
18371 : : | OTHERS
18372 : : | OUT_P
18373 : : | OUTER_P
18374 : : | OVERLAY
18375 : : | OVERRIDING
18376 : : | OWNED
18377 : : | OWNER
18378 : : | PARALLEL
18379 : : | PARAMETER
18380 : : | PARSER
18381 : : | PARTIAL
18382 : : | PARTITION
18383 : : | PARTITIONS
18384 : : | PASSING
18385 : : | PASSWORD
18386 : : | PATH
18387 : : | PERIOD
18388 : : | PLACING
18389 : : | PLAN
18390 : : | PLANS
18391 : : | POLICY
18392 : : | POSITION
18393 : : | PRECEDING
18394 : : | PREPARE
18395 : : | PREPARED
18396 : : | PRESERVE
18397 : : | PRIMARY
18398 : : | PRIOR
18399 : : | PRIVILEGES
18400 : : | PROCEDURAL
18401 : : | PROCEDURE
18402 : : | PROCEDURES
18403 : : | PROGRAM
18404 : : | PUBLICATION
18405 : : | QUOTE
18406 : : | QUOTES
18407 : : | RANGE
18408 : : | READ
18409 : : | REAL
18410 : : | REASSIGN
18411 : : | RECHECK
18412 : : | RECURSIVE
18413 : : | REF_P
18414 : : | REFERENCES
18415 : : | REFERENCING
18416 : : | REFRESH
18417 : : | REINDEX
18418 : : | RELATIVE_P
18419 : : | RELEASE
18420 : : | RENAME
18421 : : | REPEATABLE
18422 : : | REPLACE
18423 : : | REPLICA
18424 : : | RESET
18425 : : | RESTART
18426 : : | RESTRICT
18427 : : | RETURN
18428 : : | RETURNS
18429 : : | REVOKE
18430 : : | RIGHT
18431 : : | ROLE
18432 : : | ROLLBACK
18433 : : | ROLLUP
18434 : : | ROUTINE
18435 : : | ROUTINES
18436 : : | ROW
18437 : : | ROWS
18438 : : | RULE
18439 : : | SAVEPOINT
18440 : : | SCALAR
18441 : : | SCHEMA
18442 : : | SCHEMAS
18443 : : | SCROLL
18444 : : | SEARCH
18445 : : | SECURITY
18446 : : | SELECT
18447 : : | SEQUENCE
18448 : : | SEQUENCES
18449 : : | SERIALIZABLE
18450 : : | SERVER
18451 : : | SESSION
18452 : : | SESSION_USER
18453 : : | SET
18454 : : | SETOF
18455 : : | SETS
18456 : : | SHARE
18457 : : | SHOW
18458 : : | SIMILAR
18459 : : | SIMPLE
18460 : : | SKIP
18461 : : | SMALLINT
18462 : : | SNAPSHOT
18463 : : | SOME
18464 : : | SOURCE
18465 : : | SPLIT
18466 : : | SQL_P
18467 : : | STABLE
18468 : : | STANDALONE_P
18469 : : | START
18470 : : | STATEMENT
18471 : : | STATISTICS
18472 : : | STDIN
18473 : : | STDOUT
18474 : : | STORAGE
18475 : : | STORED
18476 : : | STRICT_P
18477 : : | STRING_P
18478 : : | STRIP_P
18479 : : | SUBSCRIPTION
18480 : : | SUBSTRING
18481 : : | SUPPORT
18482 : : | SYMMETRIC
18483 : : | SYSID
18484 : : | SYSTEM_P
18485 : : | SYSTEM_USER
18486 : : | TABLE
18487 : : | TABLES
18488 : : | TABLESAMPLE
18489 : : | TABLESPACE
18490 : : | TARGET
18491 : : | TEMP
18492 : : | TEMPLATE
18493 : : | TEMPORARY
18494 : : | TEXT_P
18495 : : | THEN
18496 : : | TIES
18497 : : | TIME
18498 : : | TIMESTAMP
18499 : : | TRAILING
18500 : : | TRANSACTION
18501 : : | TRANSFORM
18502 : : | TREAT
18503 : : | TRIGGER
18504 : : | TRIM
18505 : : | TRUE_P
18506 : : | TRUNCATE
18507 : : | TRUSTED
18508 : : | TYPE_P
18509 : : | TYPES_P
18510 : : | UESCAPE
18511 : : | UNBOUNDED
18512 : : | UNCOMMITTED
18513 : : | UNCONDITIONAL
18514 : : | UNENCRYPTED
18515 : : | UNIQUE
18516 : : | UNKNOWN
18517 : : | UNLISTEN
18518 : : | UNLOGGED
18519 : : | UNTIL
18520 : : | UPDATE
18521 : : | USER
18522 : : | USING
18523 : : | VACUUM
18524 : : | VALID
18525 : : | VALIDATE
18526 : : | VALIDATOR
18527 : : | VALUE_P
18528 : : | VALUES
18529 : : | VARCHAR
18530 : : | VARIADIC
18531 : : | VERBOSE
18532 : : | VERSION_P
18533 : : | VIEW
18534 : : | VIEWS
18535 : : | VOLATILE
18536 : : | WHEN
18537 : : | WHITESPACE_P
18538 : : | WORK
18539 : : | WRAPPER
18540 : : | WRITE
18541 : : | XML_P
18542 : : | XMLATTRIBUTES
18543 : : | XMLCONCAT
18544 : : | XMLELEMENT
18545 : : | XMLEXISTS
18546 : : | XMLFOREST
18547 : : | XMLNAMESPACES
18548 : : | XMLPARSE
18549 : : | XMLPI
18550 : : | XMLROOT
18551 : : | XMLSERIALIZE
18552 : : | XMLTABLE
18553 : : | YES_P
18554 : : | ZONE
18555 : : ;
18556 : :
18557 : : %%
18558 : :
18559 : : /*
18560 : : * The signature of this function is required by bison. However, we
18561 : : * ignore the passed yylloc and instead use the last token position
18562 : : * available from the scanner.
18563 : : */
18564 : : static void
5270 18565 : 338 : base_yyerror(YYLTYPE *yylloc, core_yyscan_t yyscanner, const char *msg)
18566 : : {
5389 18567 : 338 : parser_yyerror(msg);
18568 : : }
18569 : :
18570 : : static RawStmt *
2647 18571 : 383893 : makeRawStmt(Node *stmt, int stmt_location)
18572 : : {
18573 : 383893 : RawStmt *rs = makeNode(RawStmt);
18574 : :
18575 : 383893 : rs->stmt = stmt;
18576 : 383893 : rs->stmt_location = stmt_location;
18577 : 383893 : rs->stmt_len = 0; /* might get changed later */
18578 : 383893 : return rs;
18579 : : }
18580 : :
18581 : : /* Adjust a RawStmt to reflect that it doesn't run to the end of the string */
18582 : : static void
18583 : 275774 : updateRawStmtEnd(RawStmt *rs, int end_location)
18584 : : {
18585 : : /*
18586 : : * If we already set the length, don't change it. This is for situations
18587 : : * like "select foo ;; select bar" where the same statement will be last
18588 : : * in the string for more than one semicolon.
18589 : : */
18590 [ + + ]: 275774 : if (rs->stmt_len > 0)
18591 : 5 : return;
18592 : :
18593 : : /* OK, update length of RawStmt */
18594 : 275769 : rs->stmt_len = end_location - rs->stmt_location;
18595 : : }
18596 : :
18597 : : static Node *
5389 18598 : 763337 : makeColumnRef(char *colname, List *indirection,
18599 : : int location, core_yyscan_t yyscanner)
18600 : : {
18601 : : /*
18602 : : * Generate a ColumnRef node, with an A_Indirection node added if there
18603 : : * is any subscripting in the specified indirection list. However,
18604 : : * any field selection at the start of the indirection list must be
18605 : : * transposed into the "fields" part of the ColumnRef node.
18606 : : */
7249 18607 : 763337 : ColumnRef *c = makeNode(ColumnRef);
702 peter@eisentraut.org 18608 : 763337 : int nfields = 0;
18609 : : ListCell *l;
18610 : :
6606 tgl@sss.pgh.pa.us 18611 : 763337 : c->location = location;
7249 18612 [ + + + + : 1225629 : foreach(l, indirection)
+ + ]
18613 : : {
18614 [ + + ]: 466635 : if (IsA(lfirst(l), A_Indices))
18615 : : {
18616 : 4343 : A_Indirection *i = makeNode(A_Indirection);
18617 : :
18618 [ + + ]: 4343 : if (nfields == 0)
18619 : : {
18620 : : /* easy case - all indirection goes to A_Indirection */
5706 18621 : 3149 : c->fields = list_make1(makeString(colname));
5389 18622 : 3149 : i->indirection = check_indirection(indirection, yyscanner);
18623 : : }
18624 : : else
18625 : : {
18626 : : /* got to split the list in two */
5706 18627 : 1194 : i->indirection = check_indirection(list_copy_tail(indirection,
18628 : : nfields),
18629 : : yyscanner);
7249 18630 : 1194 : indirection = list_truncate(indirection, nfields);
5706 18631 : 1194 : c->fields = lcons(makeString(colname), indirection);
18632 : : }
7249 18633 : 4343 : i->arg = (Node *) c;
18634 : 4343 : return (Node *) i;
18635 : : }
5706 18636 [ + + ]: 462292 : else if (IsA(lfirst(l), A_Star))
18637 : : {
18638 : : /* We only allow '*' at the end of a ColumnRef */
1735 18639 [ - + ]: 2346 : if (lnext(indirection, l) != NULL)
5389 tgl@sss.pgh.pa.us 18640 :UBC 0 : parser_yyerror("improper use of \"*\"");
18641 : : }
7249 tgl@sss.pgh.pa.us 18642 :CBC 462292 : nfields++;
18643 : : }
18644 : : /* No subscripting, so all indirection gets added to field list */
5706 18645 : 758994 : c->fields = lcons(makeString(colname), indirection);
7249 18646 : 758994 : return (Node *) c;
18647 : : }
18648 : :
18649 : : static Node *
5708 18650 : 120023 : makeTypeCast(Node *arg, TypeName *typename, int location)
18651 : : {
702 peter@eisentraut.org 18652 : 120023 : TypeCast *n = makeNode(TypeCast);
18653 : :
7953 bruce@momjian.us 18654 : 120023 : n->arg = arg;
5386 peter_e@gmx.net 18655 : 120023 : n->typeName = typename;
5708 tgl@sss.pgh.pa.us 18656 : 120023 : n->location = location;
7953 bruce@momjian.us 18657 : 120023 : return (Node *) n;
18658 : : }
18659 : :
18660 : : static Node *
5708 tgl@sss.pgh.pa.us 18661 : 7748 : makeStringConstCast(char *str, int location, TypeName *typename)
18662 : : {
702 peter@eisentraut.org 18663 : 7748 : Node *s = makeStringConst(str, location);
18664 : :
5708 tgl@sss.pgh.pa.us 18665 : 7748 : return makeTypeCast(s, typename, -1);
18666 : : }
18667 : :
18668 : : static Node *
18669 : 220339 : makeIntConst(int val, int location)
18670 : : {
702 peter@eisentraut.org 18671 : 220339 : A_Const *n = makeNode(A_Const);
18672 : :
948 18673 : 220339 : n->val.ival.type = T_Integer;
821 18674 : 220339 : n->val.ival.ival = val;
5708 tgl@sss.pgh.pa.us 18675 : 220339 : n->location = location;
18676 : :
702 peter@eisentraut.org 18677 : 220339 : return (Node *) n;
18678 : : }
18679 : :
18680 : : static Node *
5708 tgl@sss.pgh.pa.us 18681 : 5402 : makeFloatConst(char *str, int location)
18682 : : {
702 peter@eisentraut.org 18683 : 5402 : A_Const *n = makeNode(A_Const);
18684 : :
948 18685 : 5402 : n->val.fval.type = T_Float;
821 18686 : 5402 : n->val.fval.fval = str;
5708 tgl@sss.pgh.pa.us 18687 : 5402 : n->location = location;
18688 : :
702 peter@eisentraut.org 18689 : 5402 : return (Node *) n;
18690 : : }
18691 : :
18692 : : static Node *
821 18693 : 28259 : makeBoolAConst(bool state, int location)
18694 : : {
702 18695 : 28259 : A_Const *n = makeNode(A_Const);
18696 : :
821 18697 : 28259 : n->val.boolval.type = T_Boolean;
18698 : 28259 : n->val.boolval.boolval = state;
18699 : 28259 : n->location = location;
18700 : :
702 18701 : 28259 : return (Node *) n;
18702 : : }
18703 : :
18704 : : static Node *
5708 tgl@sss.pgh.pa.us 18705 : 2035 : makeBitStringConst(char *str, int location)
18706 : : {
702 peter@eisentraut.org 18707 : 2035 : A_Const *n = makeNode(A_Const);
18708 : :
948 18709 : 2035 : n->val.bsval.type = T_BitString;
821 18710 : 2035 : n->val.bsval.bsval = str;
5708 tgl@sss.pgh.pa.us 18711 : 2035 : n->location = location;
18712 : :
702 peter@eisentraut.org 18713 : 2035 : return (Node *) n;
18714 : : }
18715 : :
18716 : : static Node *
5708 tgl@sss.pgh.pa.us 18717 : 28185 : makeNullAConst(int location)
18718 : : {
702 peter@eisentraut.org 18719 : 28185 : A_Const *n = makeNode(A_Const);
18720 : :
948 18721 : 28185 : n->isnull = true;
5708 tgl@sss.pgh.pa.us 18722 : 28185 : n->location = location;
18723 : :
702 peter@eisentraut.org 18724 : 28185 : return (Node *) n;
18725 : : }
18726 : :
18727 : : static Node *
948 18728 : 2175 : makeAConst(Node *v, int location)
18729 : : {
18730 : : Node *n;
18731 : :
8029 lockhart@fourpalms.o 18732 [ + + - ]: 2175 : switch (v->type)
18733 : : {
18734 : 109 : case T_Float:
821 peter@eisentraut.org 18735 : 109 : n = makeFloatConst(castNode(Float, v)->fval, location);
8029 lockhart@fourpalms.o 18736 : 109 : break;
18737 : :
18738 : 2066 : case T_Integer:
821 peter@eisentraut.org 18739 : 2066 : n = makeIntConst(castNode(Integer, v)->ival, location);
8029 lockhart@fourpalms.o 18740 : 2066 : break;
18741 : :
8029 lockhart@fourpalms.o 18742 :UBC 0 : default:
18743 : : /* currently not used */
821 peter@eisentraut.org 18744 : 0 : Assert(false);
18745 : : n = NULL;
18746 : : }
18747 : :
8029 lockhart@fourpalms.o 18748 :CBC 2175 : return n;
18749 : : }
18750 : :
18751 : : /* makeRoleSpec
18752 : : * Create a RoleSpec with the given type
18753 : : */
18754 : : static RoleSpec *
3324 alvherre@alvh.no-ip. 18755 : 12833 : makeRoleSpec(RoleSpecType type, int location)
18756 : : {
702 peter@eisentraut.org 18757 : 12833 : RoleSpec *spec = makeNode(RoleSpec);
18758 : :
3324 alvherre@alvh.no-ip. 18759 : 12833 : spec->roletype = type;
18760 : 12833 : spec->location = location;
18761 : :
2664 peter_e@gmx.net 18762 : 12833 : return spec;
18763 : : }
18764 : :
18765 : : /* check_qualified_name --- check the result of qualified_name production
18766 : : *
18767 : : * It's easiest to let the grammar production for qualified_name allow
18768 : : * subscripts and '*', which we then must reject here.
18769 : : */
18770 : : static void
5270 tgl@sss.pgh.pa.us 18771 : 109424 : check_qualified_name(List *names, core_yyscan_t yyscanner)
18772 : : {
18773 : : ListCell *i;
18774 : :
7097 18775 [ + - + + : 218848 : foreach(i, names)
+ + ]
18776 : : {
18777 [ - + ]: 109424 : if (!IsA(lfirst(i), String))
5389 tgl@sss.pgh.pa.us 18778 :UBC 0 : parser_yyerror("syntax error");
18779 : : }
7097 tgl@sss.pgh.pa.us 18780 :CBC 109424 : }
18781 : :
18782 : : /* check_func_name --- check the result of func_name production
18783 : : *
18784 : : * It's easiest to let the grammar production for func_name allow subscripts
18785 : : * and '*', which we then must reject here.
18786 : : */
18787 : : static List *
5270 18788 : 55031 : check_func_name(List *names, core_yyscan_t yyscanner)
18789 : : {
18790 : : ListCell *i;
18791 : :
7249 18792 [ + - + + : 165093 : foreach(i, names)
+ + ]
18793 : : {
18794 [ - + ]: 110062 : if (!IsA(lfirst(i), String))
5389 tgl@sss.pgh.pa.us 18795 :UBC 0 : parser_yyerror("syntax error");
18796 : : }
7249 tgl@sss.pgh.pa.us 18797 :CBC 55031 : return names;
18798 : : }
18799 : :
18800 : : /* check_indirection --- check the result of indirection production
18801 : : *
18802 : : * We only allow '*' at the end of the list, but it's hard to enforce that
18803 : : * in the grammar, so do it here.
18804 : : */
18805 : : static List *
5270 18806 : 36812 : check_indirection(List *indirection, core_yyscan_t yyscanner)
18807 : : {
18808 : : ListCell *l;
18809 : :
5706 18810 [ + + + + : 48633 : foreach(l, indirection)
+ + ]
18811 : : {
18812 [ + + ]: 11821 : if (IsA(lfirst(l), A_Star))
18813 : : {
1735 18814 [ - + ]: 608 : if (lnext(indirection, l) != NULL)
5389 tgl@sss.pgh.pa.us 18815 :UBC 0 : parser_yyerror("improper use of \"*\"");
18816 : : }
18817 : : }
5706 tgl@sss.pgh.pa.us 18818 :CBC 36812 : return indirection;
18819 : : }
18820 : :
18821 : : /* extractArgTypes()
18822 : : * Given a list of FunctionParameter nodes, extract a list of just the
18823 : : * argument types (TypeNames) for input parameters only. This is what
18824 : : * is needed to look up an existing function, which is what is wanted by
18825 : : * the productions that use this call.
18826 : : */
18827 : : static List *
1039 18828 : 6663 : extractArgTypes(List *parameters)
18829 : : {
7404 18830 : 6663 : List *result = NIL;
18831 : : ListCell *i;
18832 : :
18833 [ + + + + : 14881 : foreach(i, parameters)
+ + ]
18834 : : {
18835 : 8218 : FunctionParameter *p = (FunctionParameter *) lfirst(i);
18836 : :
1039 18837 [ + + + - ]: 8218 : if (p->mode != FUNC_PARAM_OUT && p->mode != FUNC_PARAM_TABLE)
6956 18838 : 8143 : result = lappend(result, p->argType);
18839 : : }
7404 18840 : 6663 : return result;
18841 : : }
18842 : :
18843 : : /* extractAggrArgTypes()
18844 : : * As above, but work from the output of the aggr_args production.
18845 : : */
18846 : : static List *
3765 18847 : 181 : extractAggrArgTypes(List *aggrargs)
18848 : : {
18849 [ - + ]: 181 : Assert(list_length(aggrargs) == 2);
1039 18850 : 181 : return extractArgTypes((List *) linitial(aggrargs));
18851 : : }
18852 : :
18853 : : /* makeOrderedSetArgs()
18854 : : * Build the result of the aggr_args production (which see the comments for).
18855 : : * This handles only the case where both given lists are nonempty, so that
18856 : : * we have to deal with multiple VARIADIC arguments.
18857 : : */
18858 : : static List *
3765 18859 : 16 : makeOrderedSetArgs(List *directargs, List *orderedargs,
18860 : : core_yyscan_t yyscanner)
18861 : : {
18862 : 16 : FunctionParameter *lastd = (FunctionParameter *) llast(directargs);
18863 : : Integer *ndirectargs;
18864 : :
18865 : : /* No restriction unless last direct arg is VARIADIC */
18866 [ + + ]: 16 : if (lastd->mode == FUNC_PARAM_VARIADIC)
18867 : : {
18868 : 8 : FunctionParameter *firsto = (FunctionParameter *) linitial(orderedargs);
18869 : :
18870 : : /*
18871 : : * We ignore the names, though the aggr_arg production allows them;
18872 : : * it doesn't allow default values, so those need not be checked.
18873 : : */
18874 [ + - ]: 8 : if (list_length(orderedargs) != 1 ||
18875 [ + - ]: 8 : firsto->mode != FUNC_PARAM_VARIADIC ||
18876 [ - + ]: 8 : !equal(lastd->argType, firsto->argType))
3765 tgl@sss.pgh.pa.us 18877 [ # # ]:UBC 0 : ereport(ERROR,
18878 : : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
18879 : : errmsg("an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type"),
18880 : : parser_errposition(exprLocation((Node *) firsto))));
18881 : :
18882 : : /* OK, drop the duplicate VARIADIC argument from the internal form */
3765 tgl@sss.pgh.pa.us 18883 :CBC 8 : orderedargs = NIL;
18884 : : }
18885 : :
18886 : : /* don't merge into the next line, as list_concat changes directargs */
1285 18887 : 16 : ndirectargs = makeInteger(list_length(directargs));
18888 : :
3765 18889 : 16 : return list_make2(list_concat(directargs, orderedargs),
18890 : : ndirectargs);
18891 : : }
18892 : :
18893 : : /* insertSelectOptions()
18894 : : * Insert ORDER BY, etc into an already-constructed SelectStmt.
18895 : : *
18896 : : * This routine is just to avoid duplicating code in SelectStmt productions.
18897 : : */
18898 : : static void
8561 18899 : 33133 : insertSelectOptions(SelectStmt *stmt,
18900 : : List *sortClause, List *lockingClause,
18901 : : SelectLimit *limitClause,
18902 : : WithClause *withClause,
18903 : : core_yyscan_t yyscanner)
18904 : : {
5671 18905 [ - + ]: 33133 : Assert(IsA(stmt, SelectStmt));
18906 : :
18907 : : /*
18908 : : * Tests here are to reject constructs like
18909 : : * (SELECT foo ORDER BY bar) ORDER BY baz
18910 : : */
8561 18911 [ + + ]: 33133 : if (sortClause)
18912 : : {
18913 [ - + ]: 28703 : if (stmt->sortClause)
7575 tgl@sss.pgh.pa.us 18914 [ # # ]:UBC 0 : ereport(ERROR,
18915 : : (errcode(ERRCODE_SYNTAX_ERROR),
18916 : : errmsg("multiple ORDER BY clauses not allowed"),
18917 : : parser_errposition(exprLocation((Node *) sortClause))));
8561 tgl@sss.pgh.pa.us 18918 :CBC 28703 : stmt->sortClause = sortClause;
18919 : : }
18920 : : /* We can handle multiple locking clauses, though */
6559 18921 : 33133 : stmt->lockingClause = list_concat(stmt->lockingClause, lockingClause);
1468 alvherre@alvh.no-ip. 18922 [ + + + + ]: 33133 : if (limitClause && limitClause->limitOffset)
18923 : : {
8561 tgl@sss.pgh.pa.us 18924 [ - + ]: 390 : if (stmt->limitOffset)
7575 tgl@sss.pgh.pa.us 18925 [ # # ]:UBC 0 : ereport(ERROR,
18926 : : (errcode(ERRCODE_SYNTAX_ERROR),
18927 : : errmsg("multiple OFFSET clauses not allowed"),
18928 : : parser_errposition(exprLocation(limitClause->limitOffset))));
1468 alvherre@alvh.no-ip. 18929 :CBC 390 : stmt->limitOffset = limitClause->limitOffset;
18930 : : }
18931 [ + + + + ]: 33133 : if (limitClause && limitClause->limitCount)
18932 : : {
8561 tgl@sss.pgh.pa.us 18933 [ - + ]: 2226 : if (stmt->limitCount)
7575 tgl@sss.pgh.pa.us 18934 [ # # ]:UBC 0 : ereport(ERROR,
18935 : : (errcode(ERRCODE_SYNTAX_ERROR),
18936 : : errmsg("multiple LIMIT clauses not allowed"),
18937 : : parser_errposition(exprLocation(limitClause->limitCount))));
1468 alvherre@alvh.no-ip. 18938 :CBC 2226 : stmt->limitCount = limitClause->limitCount;
18939 : : }
120 alvherre@alvh.no-ip. 18940 [ + + ]:GNC 33133 : if (limitClause)
18941 : : {
1468 alvherre@alvh.no-ip. 18942 [ - + ]:CBC 2425 : if (stmt->limitOption)
1468 alvherre@alvh.no-ip. 18943 [ # # ]:UBC 0 : ereport(ERROR,
18944 : : (errcode(ERRCODE_SYNTAX_ERROR),
18945 : : errmsg("multiple limit options not allowed")));
1468 alvherre@alvh.no-ip. 18946 [ + + + + ]:CBC 2425 : if (!stmt->sortClause && limitClause->limitOption == LIMIT_OPTION_WITH_TIES)
18947 [ + - ]: 3 : ereport(ERROR,
18948 : : (errcode(ERRCODE_SYNTAX_ERROR),
18949 : : errmsg("WITH TIES cannot be specified without ORDER BY clause")));
926 18950 [ + + + + ]: 2422 : if (limitClause->limitOption == LIMIT_OPTION_WITH_TIES && stmt->lockingClause)
18951 : : {
18952 : : ListCell *lc;
18953 : :
18954 [ + - + - : 3 : foreach(lc, stmt->lockingClause)
+ - ]
18955 : : {
18956 : 3 : LockingClause *lock = lfirst_node(LockingClause, lc);
18957 : :
18958 [ + - ]: 3 : if (lock->waitPolicy == LockWaitSkip)
18959 [ + - ]: 3 : ereport(ERROR,
18960 : : (errcode(ERRCODE_SYNTAX_ERROR),
18961 : : errmsg("%s and %s options cannot be used together",
18962 : : "SKIP LOCKED", "WITH TIES")));
18963 : : }
18964 : : }
1468 18965 : 2419 : stmt->limitOption = limitClause->limitOption;
18966 : : }
5671 tgl@sss.pgh.pa.us 18967 [ + + ]: 33127 : if (withClause)
18968 : : {
18969 [ - + ]: 1212 : if (stmt->withClause)
5671 tgl@sss.pgh.pa.us 18970 [ # # ]:UBC 0 : ereport(ERROR,
18971 : : (errcode(ERRCODE_SYNTAX_ERROR),
18972 : : errmsg("multiple WITH clauses not allowed"),
18973 : : parser_errposition(exprLocation((Node *) withClause))));
5671 tgl@sss.pgh.pa.us 18974 :CBC 1212 : stmt->withClause = withClause;
18975 : : }
8561 18976 : 33127 : }
18977 : :
18978 : : static Node *
18979 : 6972 : makeSetOp(SetOperation op, bool all, Node *larg, Node *rarg)
18980 : : {
18981 : 6972 : SelectStmt *n = makeNode(SelectStmt);
18982 : :
18983 : 6972 : n->op = op;
18984 : 6972 : n->all = all;
18985 : 6972 : n->larg = (SelectStmt *) larg;
18986 : 6972 : n->rarg = (SelectStmt *) rarg;
18987 : 6972 : return (Node *) n;
18988 : : }
18989 : :
18990 : : /* SystemFuncName()
18991 : : * Build a properly-qualified reference to a built-in function.
18992 : : */
18993 : : List *
8041 18994 : 8419 : SystemFuncName(char *name)
18995 : : {
7259 neilc@samurai.com 18996 : 8419 : return list_make2(makeString("pg_catalog"), makeString(name));
18997 : : }
18998 : :
18999 : : /* SystemTypeName()
19000 : : * Build a properly-qualified reference to a built-in type.
19001 : : *
19002 : : * typmod is defaulted, but may be changed afterwards by caller.
19003 : : * Likewise for the location.
19004 : : */
19005 : : TypeName *
8017 tgl@sss.pgh.pa.us 19006 : 45225 : SystemTypeName(char *name)
19007 : : {
6315 19008 : 45225 : return makeTypeNameFromNameList(list_make2(makeString("pg_catalog"),
19009 : : makeString(name)));
19010 : : }
19011 : :
19012 : : /* doNegate()
19013 : : * Handle negation of a numeric constant.
19014 : : *
19015 : : * Formerly, we did this here because the optimizer couldn't cope with
19016 : : * indexquals that looked like "var = -4" --- it wants "var = const"
19017 : : * and a unary minus operator applied to a constant didn't qualify.
19018 : : * As of Postgres 7.0, that problem doesn't exist anymore because there
19019 : : * is a constant-subexpression simplifier in the optimizer. However,
19020 : : * there's still a good reason for doing this here, which is that we can
19021 : : * postpone committing to a particular internal representation for simple
19022 : : * negative constants. It's better to leave "-123.456" in string form
19023 : : * until we know what the desired type is.
19024 : : */
19025 : : static Node *
6606 19026 : 15322 : doNegate(Node *n, int location)
19027 : : {
9159 bruce@momjian.us 19028 [ + + ]: 15322 : if (IsA(n, A_Const))
19029 : : {
702 peter@eisentraut.org 19030 : 14857 : A_Const *con = (A_Const *) n;
19031 : :
19032 : : /* report the constant's location as that of the '-' sign */
5708 tgl@sss.pgh.pa.us 19033 : 14857 : con->location = location;
19034 : :
948 peter@eisentraut.org 19035 [ + + ]: 14857 : if (IsA(&con->val, Integer))
19036 : : {
821 19037 : 14396 : con->val.ival.ival = -con->val.ival.ival;
9159 bruce@momjian.us 19038 : 14396 : return n;
19039 : : }
948 peter@eisentraut.org 19040 [ + - ]: 461 : if (IsA(&con->val, Float))
19041 : : {
19042 : 461 : doNegateFloat(&con->val.fval);
9159 bruce@momjian.us 19043 : 461 : return n;
19044 : : }
19045 : : }
19046 : :
6606 tgl@sss.pgh.pa.us 19047 : 465 : return (Node *) makeSimpleA_Expr(AEXPR_OP, "-", NULL, n, location);
19048 : : }
19049 : :
19050 : : static void
948 peter@eisentraut.org 19051 : 471 : doNegateFloat(Float *v)
19052 : : {
702 19053 : 471 : char *oldval = v->fval;
19054 : :
8819 tgl@sss.pgh.pa.us 19055 [ - + ]: 471 : if (*oldval == '+')
8819 tgl@sss.pgh.pa.us 19056 :UBC 0 : oldval++;
8819 tgl@sss.pgh.pa.us 19057 [ - + ]:CBC 471 : if (*oldval == '-')
821 peter@eisentraut.org 19058 :UBC 0 : v->fval = oldval+1; /* just strip the '-' */
19059 : : else
821 peter@eisentraut.org 19060 :CBC 471 : v->fval = psprintf("-%s", oldval);
8819 tgl@sss.pgh.pa.us 19061 : 471 : }
19062 : :
19063 : : static Node *
3590 19064 : 102865 : makeAndExpr(Node *lexpr, Node *rexpr, int location)
19065 : : {
19066 : : /* Flatten "a AND b AND c ..." to a single BoolExpr on sight */
1223 19067 [ + + ]: 102865 : if (IsA(lexpr, BoolExpr))
19068 : : {
702 peter@eisentraut.org 19069 : 47542 : BoolExpr *blexpr = (BoolExpr *) lexpr;
19070 : :
3590 tgl@sss.pgh.pa.us 19071 [ + + ]: 47542 : if (blexpr->boolop == AND_EXPR)
19072 : : {
19073 : 46359 : blexpr->args = lappend(blexpr->args, rexpr);
19074 : 46359 : return (Node *) blexpr;
19075 : : }
19076 : : }
19077 : 56506 : return (Node *) makeBoolExpr(AND_EXPR, list_make2(lexpr, rexpr), location);
19078 : : }
19079 : :
19080 : : static Node *
19081 : 8024 : makeOrExpr(Node *lexpr, Node *rexpr, int location)
19082 : : {
19083 : : /* Flatten "a OR b OR c ..." to a single BoolExpr on sight */
1223 19084 [ + + ]: 8024 : if (IsA(lexpr, BoolExpr))
19085 : : {
702 peter@eisentraut.org 19086 : 3836 : BoolExpr *blexpr = (BoolExpr *) lexpr;
19087 : :
3590 tgl@sss.pgh.pa.us 19088 [ + + ]: 3836 : if (blexpr->boolop == OR_EXPR)
19089 : : {
19090 : 1672 : blexpr->args = lappend(blexpr->args, rexpr);
19091 : 1672 : return (Node *) blexpr;
19092 : : }
19093 : : }
19094 : 6352 : return (Node *) makeBoolExpr(OR_EXPR, list_make2(lexpr, rexpr), location);
19095 : : }
19096 : :
19097 : : static Node *
19098 : 6978 : makeNotExpr(Node *expr, int location)
19099 : : {
19100 : 6978 : return (Node *) makeBoolExpr(NOT_EXPR, list_make1(expr), location);
19101 : : }
19102 : :
19103 : : static Node *
5708 19104 : 4057 : makeAArrayExpr(List *elements, int location)
19105 : : {
5869 19106 : 4057 : A_ArrayExpr *n = makeNode(A_ArrayExpr);
19107 : :
19108 : 4057 : n->elements = elements;
5708 19109 : 4057 : n->location = location;
5869 19110 : 4057 : return (Node *) n;
19111 : : }
19112 : :
19113 : : static Node *
333 michael@paquier.xyz 19114 : 1206 : makeSQLValueFunction(SQLValueFunctionOp op, int32 typmod, int location)
19115 : : {
19116 : 1206 : SQLValueFunction *svf = makeNode(SQLValueFunction);
19117 : :
19118 : 1206 : svf->op = op;
19119 : : /* svf->type will be filled during parse analysis */
19120 : 1206 : svf->typmod = typmod;
19121 : 1206 : svf->location = location;
19122 : 1206 : return (Node *) svf;
19123 : : }
19124 : :
19125 : : static Node *
5708 tgl@sss.pgh.pa.us 19126 : 298 : makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args,
19127 : : int location)
19128 : : {
4548 peter_e@gmx.net 19129 : 298 : XmlExpr *x = makeNode(XmlExpr);
19130 : :
6324 19131 : 298 : x->op = op;
19132 : 298 : x->name = name;
19133 : : /*
19134 : : * named_args is a list of ResTarget; it'll be split apart into separate
19135 : : * expression and name lists in transformXmlExpr().
19136 : : */
19137 : 298 : x->named_args = named_args;
6321 tgl@sss.pgh.pa.us 19138 : 298 : x->arg_names = NIL;
6324 peter_e@gmx.net 19139 : 298 : x->args = args;
19140 : : /* xmloption, if relevant, must be filled in by caller */
19141 : : /* type and typmod will be filled in during parse analysis */
4130 tgl@sss.pgh.pa.us 19142 : 298 : x->type = InvalidOid; /* marks the node as not analyzed */
5708 19143 : 298 : x->location = location;
6324 peter_e@gmx.net 19144 : 298 : return (Node *) x;
19145 : : }
19146 : :
19147 : : /*
19148 : : * Merge the input and output parameters of a table function.
19149 : : */
19150 : : static List *
5749 tgl@sss.pgh.pa.us 19151 : 94 : mergeTableFuncParameters(List *func_args, List *columns)
19152 : : {
19153 : : ListCell *lc;
19154 : :
19155 : : /* Explicit OUT and INOUT parameters shouldn't be used in this syntax */
19156 [ + + + + : 191 : foreach(lc, func_args)
+ + ]
19157 : : {
19158 : 97 : FunctionParameter *p = (FunctionParameter *) lfirst(lc);
19159 : :
1039 19160 [ - + ]: 97 : if (p->mode != FUNC_PARAM_DEFAULT &&
1039 tgl@sss.pgh.pa.us 19161 [ # # ]:UBC 0 : p->mode != FUNC_PARAM_IN &&
19162 [ # # ]: 0 : p->mode != FUNC_PARAM_VARIADIC)
5749 19163 [ # # ]: 0 : ereport(ERROR,
19164 : : (errcode(ERRCODE_SYNTAX_ERROR),
19165 : : errmsg("OUT and INOUT arguments aren't allowed in TABLE functions")));
19166 : : }
19167 : :
5749 tgl@sss.pgh.pa.us 19168 :CBC 94 : return list_concat(func_args, columns);
19169 : : }
19170 : :
19171 : : /*
19172 : : * Determine return type of a TABLE function. A single result column
19173 : : * returns setof that column's type; otherwise return setof record.
19174 : : */
19175 : : static TypeName *
19176 : 94 : TableFuncTypeName(List *columns)
19177 : : {
19178 : : TypeName *result;
19179 : :
19180 [ + + ]: 94 : if (list_length(columns) == 1)
19181 : : {
19182 : 31 : FunctionParameter *p = (FunctionParameter *) linitial(columns);
19183 : :
2593 peter_e@gmx.net 19184 : 31 : result = copyObject(p->argType);
19185 : : }
19186 : : else
5749 tgl@sss.pgh.pa.us 19187 : 63 : result = SystemTypeName("record");
19188 : :
19189 : 94 : result->setof = true;
19190 : :
19191 : 94 : return result;
19192 : : }
19193 : :
19194 : : /*
19195 : : * Convert a list of (dotted) names to a RangeVar (like
19196 : : * makeRangeVarFromNameList, but with position support). The
19197 : : * "AnyName" refers to the any_name production in the grammar.
19198 : : */
19199 : : static RangeVar *
4949 peter_e@gmx.net 19200 : 462 : makeRangeVarFromAnyName(List *names, int position, core_yyscan_t yyscanner)
19201 : : {
702 peter@eisentraut.org 19202 : 462 : RangeVar *r = makeNode(RangeVar);
19203 : :
4949 peter_e@gmx.net 19204 [ + + - - ]: 462 : switch (list_length(names))
19205 : : {
19206 : 421 : case 1:
19207 : 421 : r->catalogname = NULL;
19208 : 421 : r->schemaname = NULL;
19209 : 421 : r->relname = strVal(linitial(names));
19210 : 421 : break;
19211 : 41 : case 2:
19212 : 41 : r->catalogname = NULL;
19213 : 41 : r->schemaname = strVal(linitial(names));
19214 : 41 : r->relname = strVal(lsecond(names));
19215 : 41 : break;
4949 peter_e@gmx.net 19216 :UBC 0 : case 3:
3302 heikki.linnakangas@i 19217 : 0 : r->catalogname = strVal(linitial(names));
4949 peter_e@gmx.net 19218 : 0 : r->schemaname = strVal(lsecond(names));
19219 : 0 : r->relname = strVal(lthird(names));
19220 : 0 : break;
19221 : 0 : default:
19222 [ # # ]: 0 : ereport(ERROR,
19223 : : (errcode(ERRCODE_SYNTAX_ERROR),
19224 : : errmsg("improper qualified name (too many dotted names): %s",
19225 : : NameListToString(names)),
19226 : : parser_errposition(position)));
19227 : : break;
19228 : : }
19229 : :
4871 rhaas@postgresql.org 19230 :CBC 462 : r->relpersistence = RELPERSISTENCE_PERMANENT;
4949 peter_e@gmx.net 19231 : 462 : r->location = position;
19232 : :
19233 : 462 : return r;
19234 : : }
19235 : :
19236 : : /*
19237 : : * Convert a relation_name with name and namelist to a RangeVar using
19238 : : * makeRangeVar.
19239 : : */
19240 : : static RangeVar *
900 akapila@postgresql.o 19241 : 109424 : makeRangeVarFromQualifiedName(char *name, List *namelist, int location,
19242 : : core_yyscan_t yyscanner)
19243 : : {
19244 : : RangeVar *r;
19245 : :
19246 : 109424 : check_qualified_name(namelist, yyscanner);
19247 : 109424 : r = makeRangeVar(NULL, NULL, location);
19248 : :
19249 [ + - - ]: 109424 : switch (list_length(namelist))
19250 : : {
19251 : 109424 : case 1:
19252 : 109424 : r->catalogname = NULL;
19253 : 109424 : r->schemaname = name;
19254 : 109424 : r->relname = strVal(linitial(namelist));
19255 : 109424 : break;
900 akapila@postgresql.o 19256 :UBC 0 : case 2:
19257 : 0 : r->catalogname = name;
19258 : 0 : r->schemaname = strVal(linitial(namelist));
19259 : 0 : r->relname = strVal(lsecond(namelist));
19260 : 0 : break;
19261 : 0 : default:
19262 [ # # ]: 0 : ereport(ERROR,
19263 : : errcode(ERRCODE_SYNTAX_ERROR),
19264 : : errmsg("improper qualified name (too many dotted names): %s",
19265 : : NameListToString(lcons(makeString(name), namelist))),
19266 : : parser_errposition(location));
19267 : : break;
19268 : : }
19269 : :
900 akapila@postgresql.o 19270 :CBC 109424 : return r;
19271 : : }
19272 : :
19273 : : /* Separate Constraint nodes from COLLATE clauses in a ColQualList */
19274 : : static void
4785 tgl@sss.pgh.pa.us 19275 : 32008 : SplitColQualList(List *qualList,
19276 : : List **constraintList, CollateClause **collClause,
19277 : : core_yyscan_t yyscanner)
19278 : : {
19279 : : ListCell *cell;
19280 : :
19281 : 32008 : *collClause = NULL;
1735 19282 [ + + + + : 40519 : foreach(cell, qualList)
+ + ]
19283 : : {
702 peter@eisentraut.org 19284 : 8511 : Node *n = (Node *) lfirst(cell);
19285 : :
4785 tgl@sss.pgh.pa.us 19286 [ + + ]: 8511 : if (IsA(n, Constraint))
19287 : : {
19288 : : /* keep it in list */
19289 : 8206 : continue;
19290 : : }
19291 [ + - ]: 305 : if (IsA(n, CollateClause))
19292 : : {
19293 : 305 : CollateClause *c = (CollateClause *) n;
19294 : :
19295 [ - + ]: 305 : if (*collClause)
4785 tgl@sss.pgh.pa.us 19296 [ # # ]:UBC 0 : ereport(ERROR,
19297 : : (errcode(ERRCODE_SYNTAX_ERROR),
19298 : : errmsg("multiple COLLATE clauses not allowed"),
19299 : : parser_errposition(c->location)));
4785 tgl@sss.pgh.pa.us 19300 :CBC 305 : *collClause = c;
19301 : : }
19302 : : else
4785 tgl@sss.pgh.pa.us 19303 [ # # ]:UBC 0 : elog(ERROR, "unexpected node type %d", (int) n->type);
19304 : : /* remove non-Constraint nodes from qualList */
1735 tgl@sss.pgh.pa.us 19305 :CBC 305 : qualList = foreach_delete_current(qualList, cell);
19306 : : }
4785 19307 : 32008 : *constraintList = qualList;
19308 : 32008 : }
19309 : :
19310 : : /*
19311 : : * Process result of ConstraintAttributeSpec, and set appropriate bool flags
19312 : : * in the output command node. Pass NULL for any flags the particular
19313 : : * command doesn't support.
19314 : : */
19315 : : static void
4687 19316 : 7065 : processCASbits(int cas_bits, int location, const char *constrType,
19317 : : bool *deferrable, bool *initdeferred, bool *not_valid,
19318 : : bool *no_inherit, core_yyscan_t yyscanner)
19319 : : {
19320 : : /* defaults */
19321 [ + + ]: 7065 : if (deferrable)
19322 : 6389 : *deferrable = false;
19323 [ + + ]: 7065 : if (initdeferred)
19324 : 6389 : *initdeferred = false;
19325 [ + + ]: 7065 : if (not_valid)
19326 : 1451 : *not_valid = false;
19327 : :
19328 [ + + ]: 7065 : if (cas_bits & (CAS_DEFERRABLE | CAS_INITIALLY_DEFERRED))
19329 : : {
19330 [ + - ]: 123 : if (deferrable)
19331 : 123 : *deferrable = true;
19332 : : else
4687 tgl@sss.pgh.pa.us 19333 [ # # ]:UBC 0 : ereport(ERROR,
19334 : : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
19335 : : /* translator: %s is CHECK, UNIQUE, or similar */
19336 : : errmsg("%s constraints cannot be marked DEFERRABLE",
19337 : : constrType),
19338 : : parser_errposition(location)));
19339 : : }
19340 : :
4687 tgl@sss.pgh.pa.us 19341 [ + + ]:CBC 7065 : if (cas_bits & CAS_INITIALLY_DEFERRED)
19342 : : {
19343 [ + - ]: 78 : if (initdeferred)
19344 : 78 : *initdeferred = true;
19345 : : else
4687 tgl@sss.pgh.pa.us 19346 [ # # ]:UBC 0 : ereport(ERROR,
19347 : : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
19348 : : /* translator: %s is CHECK, UNIQUE, or similar */
19349 : : errmsg("%s constraints cannot be marked DEFERRABLE",
19350 : : constrType),
19351 : : parser_errposition(location)));
19352 : : }
19353 : :
4687 tgl@sss.pgh.pa.us 19354 [ + + ]:CBC 7065 : if (cas_bits & CAS_NOT_VALID)
19355 : : {
19356 [ + - ]: 258 : if (not_valid)
19357 : 258 : *not_valid = true;
19358 : : else
4687 tgl@sss.pgh.pa.us 19359 [ # # ]:UBC 0 : ereport(ERROR,
19360 : : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
19361 : : /* translator: %s is CHECK, UNIQUE, or similar */
19362 : : errmsg("%s constraints cannot be marked NOT VALID",
19363 : : constrType),
19364 : : parser_errposition(location)));
19365 : : }
19366 : :
4282 alvherre@alvh.no-ip. 19367 [ + + ]:CBC 7065 : if (cas_bits & CAS_NO_INHERIT)
19368 : : {
19369 [ + - ]: 71 : if (no_inherit)
19370 : 71 : *no_inherit = true;
19371 : : else
4282 alvherre@alvh.no-ip. 19372 [ # # ]:UBC 0 : ereport(ERROR,
19373 : : (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
19374 : : /* translator: %s is CHECK, UNIQUE, or similar */
19375 : : errmsg("%s constraints cannot be marked NO INHERIT",
19376 : : constrType),
19377 : : parser_errposition(location)));
19378 : : }
4687 tgl@sss.pgh.pa.us 19379 :CBC 7065 : }
19380 : :
19381 : : /*
19382 : : * Parse a user-supplied partition strategy string into parse node
19383 : : * PartitionStrategy representation, or die trying.
19384 : : */
19385 : : static PartitionStrategy
528 alvherre@alvh.no-ip. 19386 : 2441 : parsePartitionStrategy(char *strategy)
19387 : : {
19388 [ + + ]: 2441 : if (pg_strcasecmp(strategy, "list") == 0)
19389 : 1177 : return PARTITION_STRATEGY_LIST;
19390 [ + + ]: 1264 : else if (pg_strcasecmp(strategy, "range") == 0)
19391 : 1147 : return PARTITION_STRATEGY_RANGE;
19392 [ + + ]: 117 : else if (pg_strcasecmp(strategy, "hash") == 0)
19393 : 114 : return PARTITION_STRATEGY_HASH;
19394 : :
19395 [ + - ]: 3 : ereport(ERROR,
19396 : : (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
19397 : : errmsg("unrecognized partitioning strategy \"%s\"",
19398 : : strategy)));
19399 : : return PARTITION_STRATEGY_LIST; /* keep compiler quiet */
19400 : :
19401 : : }
19402 : :
19403 : : /*
19404 : : * Process pubobjspec_list to check for errors in any of the objects and
19405 : : * convert PUBLICATIONOBJ_CONTINUATION into appropriate PublicationObjSpecType.
19406 : : */
19407 : : static void
900 akapila@postgresql.o 19408 : 736 : preprocess_pubobj_list(List *pubobjspec_list, core_yyscan_t yyscanner)
19409 : : {
19410 : : ListCell *cell;
19411 : : PublicationObjSpec *pubobj;
19412 : 736 : PublicationObjSpecType prevobjtype = PUBLICATIONOBJ_CONTINUATION;
19413 : :
19414 [ - + ]: 736 : if (!pubobjspec_list)
900 akapila@postgresql.o 19415 :UBC 0 : return;
19416 : :
900 akapila@postgresql.o 19417 :CBC 736 : pubobj = (PublicationObjSpec *) linitial(pubobjspec_list);
19418 [ + + ]: 736 : if (pubobj->pubobjtype == PUBLICATIONOBJ_CONTINUATION)
19419 [ + - ]: 6 : ereport(ERROR,
19420 : : errcode(ERRCODE_SYNTAX_ERROR),
19421 : : errmsg("invalid publication object list"),
19422 : : errdetail("One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name."),
19423 : : parser_errposition(pubobj->location));
19424 : :
19425 [ + - + + : 1560 : foreach(cell, pubobjspec_list)
+ + ]
19426 : : {
19427 : 842 : pubobj = (PublicationObjSpec *) lfirst(cell);
19428 : :
19429 [ + + ]: 842 : if (pubobj->pubobjtype == PUBLICATIONOBJ_CONTINUATION)
19430 : 87 : pubobj->pubobjtype = prevobjtype;
19431 : :
738 tomas.vondra@postgre 19432 [ + + ]: 842 : if (pubobj->pubobjtype == PUBLICATIONOBJ_TABLE)
19433 : : {
19434 : : /* relation name or pubtable must be set for this type of object */
900 akapila@postgresql.o 19435 [ + + + + ]: 640 : if (!pubobj->name && !pubobj->pubtable)
19436 [ + - ]: 3 : ereport(ERROR,
19437 : : errcode(ERRCODE_SYNTAX_ERROR),
19438 : : errmsg("invalid table name"),
19439 : : parser_errposition(pubobj->location));
19440 : :
782 19441 [ + + ]: 637 : if (pubobj->name)
19442 : : {
19443 : : /* convert it to PublicationTable */
900 19444 : 29 : PublicationTable *pubtable = makeNode(PublicationTable);
19445 : :
836 alvherre@alvh.no-ip. 19446 : 29 : pubtable->relation =
19447 : 29 : makeRangeVar(NULL, pubobj->name, pubobj->location);
900 akapila@postgresql.o 19448 : 29 : pubobj->pubtable = pubtable;
19449 : 29 : pubobj->name = NULL;
19450 : : }
19451 : : }
836 alvherre@alvh.no-ip. 19452 [ + + ]: 202 : else if (pubobj->pubobjtype == PUBLICATIONOBJ_TABLES_IN_SCHEMA ||
19453 [ + - ]: 12 : pubobj->pubobjtype == PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA)
19454 : : {
19455 : : /* WHERE clause is not allowed on a schema object */
782 akapila@postgresql.o 19456 [ + + + + ]: 202 : if (pubobj->pubtable && pubobj->pubtable->whereClause)
19457 [ + - ]: 3 : ereport(ERROR,
19458 : : errcode(ERRCODE_SYNTAX_ERROR),
19459 : : errmsg("WHERE clause not allowed for schema"),
19460 : : parser_errposition(pubobj->location));
19461 : :
19462 : : /* Column list is not allowed on a schema object */
750 tomas.vondra@postgre 19463 [ + + + + ]: 199 : if (pubobj->pubtable && pubobj->pubtable->columns)
19464 [ + - ]: 3 : ereport(ERROR,
19465 : : errcode(ERRCODE_SYNTAX_ERROR),
19466 : : errmsg("column specification not allowed for schema"),
19467 : : parser_errposition(pubobj->location));
19468 : :
19469 : : /*
19470 : : * We can distinguish between the different type of schema
19471 : : * objects based on whether name and pubtable is set.
19472 : : */
900 akapila@postgresql.o 19473 [ + + ]: 196 : if (pubobj->name)
836 alvherre@alvh.no-ip. 19474 : 181 : pubobj->pubobjtype = PUBLICATIONOBJ_TABLES_IN_SCHEMA;
900 akapila@postgresql.o 19475 [ + - + + ]: 15 : else if (!pubobj->name && !pubobj->pubtable)
836 alvherre@alvh.no-ip. 19476 : 12 : pubobj->pubobjtype = PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA;
19477 : : else
900 akapila@postgresql.o 19478 [ + - ]: 3 : ereport(ERROR,
19479 : : errcode(ERRCODE_SYNTAX_ERROR),
19480 : : errmsg("invalid schema name"),
19481 : : parser_errposition(pubobj->location));
19482 : : }
19483 : :
19484 : 830 : prevobjtype = pubobj->pubobjtype;
19485 : : }
19486 : : }
19487 : :
19488 : : /*----------
19489 : : * Recursive view transformation
19490 : : *
19491 : : * Convert
19492 : : *
19493 : : * CREATE RECURSIVE VIEW relname (aliases) AS query
19494 : : *
19495 : : * to
19496 : : *
19497 : : * CREATE VIEW relname (aliases) AS
19498 : : * WITH RECURSIVE relname (aliases) AS (query)
19499 : : * SELECT aliases FROM relname
19500 : : *
19501 : : * Actually, just the WITH ... part, which is then inserted into the original
19502 : : * view definition as the query.
19503 : : * ----------
19504 : : */
19505 : : static Node *
4091 peter_e@gmx.net 19506 : 7 : makeRecursiveViewSelect(char *relname, List *aliases, Node *query)
19507 : : {
19508 : 7 : SelectStmt *s = makeNode(SelectStmt);
19509 : 7 : WithClause *w = makeNode(WithClause);
19510 : 7 : CommonTableExpr *cte = makeNode(CommonTableExpr);
19511 : 7 : List *tl = NIL;
19512 : : ListCell *lc;
19513 : :
19514 : : /* create common table expression */
19515 : 7 : cte->ctename = relname;
19516 : 7 : cte->aliascolnames = aliases;
1884 tgl@sss.pgh.pa.us 19517 : 7 : cte->ctematerialized = CTEMaterializeDefault;
4091 peter_e@gmx.net 19518 : 7 : cte->ctequery = query;
19519 : 7 : cte->location = -1;
19520 : :
19521 : : /* create WITH clause and attach CTE */
19522 : 7 : w->recursive = true;
19523 : 7 : w->ctes = list_make1(cte);
19524 : 7 : w->location = -1;
19525 : :
19526 : : /* create target list for the new SELECT from the alias list of the
19527 : : * recursive view specification */
19528 [ + - + + : 14 : foreach (lc, aliases)
+ + ]
19529 : : {
19530 : 7 : ResTarget *rt = makeNode(ResTarget);
19531 : :
19532 : 7 : rt->name = NULL;
19533 : 7 : rt->indirection = NIL;
19534 : 7 : rt->val = makeColumnRef(strVal(lfirst(lc)), NIL, -1, 0);
19535 : 7 : rt->location = -1;
19536 : :
19537 : 7 : tl = lappend(tl, rt);
19538 : : }
19539 : :
19540 : : /* create new SELECT combining WITH clause, target list, and fake FROM
19541 : : * clause */
19542 : 7 : s->withClause = w;
19543 : 7 : s->targetList = tl;
19544 : 7 : s->fromClause = list_make1(makeRangeVar(NULL, relname, -1));
19545 : :
19546 : 7 : return (Node *) s;
19547 : : }
19548 : :
19549 : : /* parser_init()
19550 : : * Initialize to parse one query string
19551 : : */
19552 : : void
4785 tgl@sss.pgh.pa.us 19553 : 365534 : parser_init(base_yy_extra_type *yyext)
19554 : : {
19555 : 365534 : yyext->parsetree = NIL; /* in case grammar forgets to set it */
19556 : 365534 : }
|