PageRenderTime 53ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 1ms

/src/backend/parser/gram.y

https://bitbucket.org/gencer/postgres
Happy | 13995 lines | 13015 code | 980 blank | 0 comment | 0 complexity | 49316f1c06db37f1aa54936ab75ef001 MD5 | raw file
Possible License(s): AGPL-3.0
  1. %{
  2. /*#define YYDEBUG 1*/
  3. /*-------------------------------------------------------------------------
  4. *
  5. * gram.y
  6. * POSTGRESQL BISON rules/actions
  7. *
  8. * Portions Copyright (c) 1996-2014, PostgreSQL Global Development Group
  9. * Portions Copyright (c) 1994, Regents of the University of California
  10. *
  11. *
  12. * IDENTIFICATION
  13. * src/backend/parser/gram.y
  14. *
  15. * HISTORY
  16. * AUTHOR DATE MAJOR EVENT
  17. * Andrew Yu Sept, 1994 POSTQUEL to SQL conversion
  18. * Andrew Yu Oct, 1994 lispy code conversion
  19. *
  20. * NOTES
  21. * CAPITALS are used to represent terminal symbols.
  22. * non-capitals are used to represent non-terminals.
  23. *
  24. * In general, nothing in this file should initiate database accesses
  25. * nor depend on changeable state (such as SET variables). If you do
  26. * database accesses, your code will fail when we have aborted the
  27. * current transaction and are just parsing commands to find the next
  28. * ROLLBACK or COMMIT. If you make use of SET variables, then you
  29. * will do the wrong thing in multi-query strings like this:
  30. * SET SQL_inheritance TO off; SELECT * FROM foo;
  31. * because the entire string is parsed by gram.y before the SET gets
  32. * executed. Anything that depends on the database or changeable state
  33. * should be handled during parse analysis so that it happens at the
  34. * right time not the wrong time. The handling of SQL_inheritance is
  35. * a good example.
  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. #include <ctype.h>
  48. #include <limits.h>
  49. #include "catalog/index.h"
  50. #include "catalog/namespace.h"
  51. #include "catalog/pg_trigger.h"
  52. #include "commands/defrem.h"
  53. #include "commands/trigger.h"
  54. #include "nodes/makefuncs.h"
  55. #include "nodes/nodeFuncs.h"
  56. #include "parser/gramparse.h"
  57. #include "parser/parser.h"
  58. #include "storage/lmgr.h"
  59. #include "utils/date.h"
  60. #include "utils/datetime.h"
  61. #include "utils/numeric.h"
  62. #include "utils/xml.h"
  63. /*
  64. * Location tracking support --- simpler than bison's default, since we only
  65. * want to track the start position not the end position of each nonterminal.
  66. */
  67. #define YYLLOC_DEFAULT(Current, Rhs, N) \
  68. do { \
  69. if ((N) > 0) \
  70. (Current) = (Rhs)[1]; \
  71. else \
  72. (Current) = (-1); \
  73. } while (0)
  74. /*
  75. * The above macro assigns -1 (unknown) as the parse location of any
  76. * nonterminal that was reduced from an empty rule. This is problematic
  77. * for nonterminals defined like
  78. * OptFooList: / * EMPTY * / { ... } | OptFooList Foo { ... } ;
  79. * because we'll set -1 as the location during the first reduction and then
  80. * copy it during each subsequent reduction, leaving us with -1 for the
  81. * location even when the list is not empty. To fix that, do this in the
  82. * action for the nonempty rule(s):
  83. * if (@$ < 0) @$ = @2;
  84. * (Although we have many nonterminals that follow this pattern, we only
  85. * bother with fixing @$ like this when the nonterminal's parse location
  86. * is actually referenced in some rule.)
  87. */
  88. /*
  89. * Bison doesn't allocate anything that needs to live across parser calls,
  90. * so we can easily have it use palloc instead of malloc. This prevents
  91. * memory leaks if we error out during parsing. Note this only works with
  92. * bison >= 2.0. However, in bison 1.875 the default is to use alloca()
  93. * if possible, so there's not really much problem anyhow, at least if
  94. * you're building with gcc.
  95. */
  96. #define YYMALLOC palloc
  97. #define YYFREE pfree
  98. /* Private struct for the result of privilege_target production */
  99. typedef struct PrivTarget
  100. {
  101. GrantTargetType targtype;
  102. GrantObjectType objtype;
  103. List *objs;
  104. } PrivTarget;
  105. /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
  106. #define CAS_NOT_DEFERRABLE 0x01
  107. #define CAS_DEFERRABLE 0x02
  108. #define CAS_INITIALLY_IMMEDIATE 0x04
  109. #define CAS_INITIALLY_DEFERRED 0x08
  110. #define CAS_NOT_VALID 0x10
  111. #define CAS_NO_INHERIT 0x20
  112. #define parser_yyerror(msg) scanner_yyerror(msg, yyscanner)
  113. #define parser_errposition(pos) scanner_errposition(pos, yyscanner)
  114. static void base_yyerror(YYLTYPE *yylloc, core_yyscan_t yyscanner,
  115. const char *msg);
  116. static Node *makeColumnRef(char *colname, List *indirection,
  117. int location, core_yyscan_t yyscanner);
  118. static Node *makeTypeCast(Node *arg, TypeName *typename, int location);
  119. static Node *makeStringConst(char *str, int location);
  120. static Node *makeStringConstCast(char *str, int location, TypeName *typename);
  121. static Node *makeIntConst(int val, int location);
  122. static Node *makeFloatConst(char *str, int location);
  123. static Node *makeBitStringConst(char *str, int location);
  124. static Node *makeNullAConst(int location);
  125. static Node *makeAConst(Value *v, int location);
  126. static Node *makeBoolAConst(bool state, int location);
  127. static void check_qualified_name(List *names, core_yyscan_t yyscanner);
  128. static List *check_func_name(List *names, core_yyscan_t yyscanner);
  129. static List *check_indirection(List *indirection, core_yyscan_t yyscanner);
  130. static List *extractArgTypes(List *parameters);
  131. static List *extractAggrArgTypes(List *aggrargs);
  132. static List *makeOrderedSetArgs(List *directargs, List *orderedargs,
  133. core_yyscan_t yyscanner);
  134. static void insertSelectOptions(SelectStmt *stmt,
  135. List *sortClause, List *lockingClause,
  136. Node *limitOffset, Node *limitCount,
  137. WithClause *withClause,
  138. core_yyscan_t yyscanner);
  139. static Node *makeSetOp(SetOperation op, bool all, Node *larg, Node *rarg);
  140. static Node *doNegate(Node *n, int location);
  141. static void doNegateFloat(Value *v);
  142. static Node *makeAArrayExpr(List *elements, int location);
  143. static Node *makeXmlExpr(XmlExprOp op, char *name, List *named_args,
  144. List *args, int location);
  145. static List *mergeTableFuncParameters(List *func_args, List *columns);
  146. static TypeName *TableFuncTypeName(List *columns);
  147. static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_t yyscanner);
  148. static void SplitColQualList(List *qualList,
  149. List **constraintList, CollateClause **collClause,
  150. core_yyscan_t yyscanner);
  151. static void processCASbits(int cas_bits, int location, const char *constrType,
  152. bool *deferrable, bool *initdeferred, bool *not_valid,
  153. bool *no_inherit, core_yyscan_t yyscanner);
  154. static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
  155. %}
  156. %pure-parser
  157. %expect 0
  158. %name-prefix="base_yy"
  159. %locations
  160. %parse-param {core_yyscan_t yyscanner}
  161. %lex-param {core_yyscan_t yyscanner}
  162. %union
  163. {
  164. core_YYSTYPE core_yystype;
  165. /* these fields must match core_YYSTYPE: */
  166. int ival;
  167. char *str;
  168. const char *keyword;
  169. char chr;
  170. bool boolean;
  171. JoinType jtype;
  172. DropBehavior dbehavior;
  173. OnCommitAction oncommit;
  174. List *list;
  175. Node *node;
  176. Value *value;
  177. ObjectType objtype;
  178. TypeName *typnam;
  179. FunctionParameter *fun_param;
  180. FunctionParameterMode fun_param_mode;
  181. FuncWithArgs *funwithargs;
  182. DefElem *defelt;
  183. SortBy *sortby;
  184. WindowDef *windef;
  185. JoinExpr *jexpr;
  186. IndexElem *ielem;
  187. Alias *alias;
  188. RangeVar *range;
  189. IntoClause *into;
  190. WithClause *with;
  191. A_Indices *aind;
  192. ResTarget *target;
  193. struct PrivTarget *privtarget;
  194. AccessPriv *accesspriv;
  195. InsertStmt *istmt;
  196. VariableSetStmt *vsetstmt;
  197. }
  198. %type <node> stmt schema_stmt
  199. AlterEventTrigStmt
  200. AlterDatabaseStmt AlterDatabaseSetStmt AlterDomainStmt AlterEnumStmt
  201. AlterFdwStmt AlterForeignServerStmt AlterGroupStmt
  202. AlterObjectSchemaStmt AlterOwnerStmt AlterSeqStmt AlterSystemStmt AlterTableStmt
  203. AlterExtensionStmt AlterExtensionContentsStmt AlterForeignTableStmt
  204. AlterCompositeTypeStmt AlterUserStmt AlterUserMappingStmt AlterUserSetStmt
  205. AlterRoleStmt AlterRoleSetStmt
  206. AlterDefaultPrivilegesStmt DefACLAction
  207. AnalyzeStmt ClosePortalStmt ClusterStmt CommentStmt
  208. ConstraintsSetStmt CopyStmt CreateAsStmt CreateCastStmt
  209. CreateDomainStmt CreateExtensionStmt CreateGroupStmt CreateOpClassStmt
  210. CreateOpFamilyStmt AlterOpFamilyStmt CreatePLangStmt
  211. CreateSchemaStmt CreateSeqStmt CreateStmt CreateTableSpaceStmt
  212. CreateFdwStmt CreateForeignServerStmt CreateForeignTableStmt
  213. CreateAssertStmt CreateTrigStmt CreateEventTrigStmt
  214. CreateUserStmt CreateUserMappingStmt CreateRoleStmt
  215. CreatedbStmt DeclareCursorStmt DefineStmt DeleteStmt DiscardStmt DoStmt
  216. DropGroupStmt DropOpClassStmt DropOpFamilyStmt DropPLangStmt DropStmt
  217. DropAssertStmt DropTrigStmt DropRuleStmt DropCastStmt DropRoleStmt
  218. DropUserStmt DropdbStmt DropTableSpaceStmt DropFdwStmt
  219. DropForeignServerStmt DropUserMappingStmt ExplainStmt FetchStmt
  220. GrantStmt GrantRoleStmt IndexStmt InsertStmt ListenStmt LoadStmt
  221. LockStmt NotifyStmt ExplainableStmt PreparableStmt
  222. CreateFunctionStmt AlterFunctionStmt ReindexStmt RemoveAggrStmt
  223. RemoveFuncStmt RemoveOperStmt RenameStmt RevokeStmt RevokeRoleStmt
  224. RuleActionStmt RuleActionStmtOrEmpty RuleStmt
  225. SecLabelStmt SelectStmt TransactionStmt TruncateStmt
  226. UnlistenStmt UpdateStmt VacuumStmt
  227. VariableResetStmt VariableSetStmt VariableShowStmt
  228. ViewStmt CheckPointStmt CreateConversionStmt
  229. DeallocateStmt PrepareStmt ExecuteStmt
  230. DropOwnedStmt ReassignOwnedStmt
  231. AlterTSConfigurationStmt AlterTSDictionaryStmt
  232. CreateMatViewStmt RefreshMatViewStmt
  233. %type <node> select_no_parens select_with_parens select_clause
  234. simple_select values_clause
  235. %type <node> alter_column_default opclass_item opclass_drop alter_using
  236. %type <ival> add_drop opt_asc_desc opt_nulls_order
  237. %type <node> alter_table_cmd alter_type_cmd opt_collate_clause
  238. replica_identity
  239. %type <list> alter_table_cmds alter_type_cmds
  240. %type <dbehavior> opt_drop_behavior
  241. %type <list> createdb_opt_list alterdb_opt_list copy_opt_list
  242. transaction_mode_list
  243. create_extension_opt_list alter_extension_opt_list
  244. %type <defelt> createdb_opt_item alterdb_opt_item copy_opt_item
  245. transaction_mode_item
  246. create_extension_opt_item alter_extension_opt_item
  247. %type <ival> opt_lock lock_type cast_context
  248. %type <ival> vacuum_option_list vacuum_option_elem
  249. %type <boolean> opt_force opt_or_replace
  250. opt_grant_grant_option opt_grant_admin_option
  251. opt_nowait opt_if_exists opt_with_data
  252. %type <list> OptRoleList AlterOptRoleList
  253. %type <defelt> CreateOptRoleElem AlterOptRoleElem
  254. %type <str> opt_type
  255. %type <str> foreign_server_version opt_foreign_server_version
  256. %type <str> auth_ident
  257. %type <str> opt_in_database
  258. %type <str> OptSchemaName
  259. %type <list> OptSchemaEltList
  260. %type <boolean> TriggerForSpec TriggerForType
  261. %type <ival> TriggerActionTime
  262. %type <list> TriggerEvents TriggerOneEvent
  263. %type <value> TriggerFuncArg
  264. %type <node> TriggerWhen
  265. %type <list> event_trigger_when_list event_trigger_value_list
  266. %type <defelt> event_trigger_when_item
  267. %type <chr> enable_trigger
  268. %type <str> copy_file_name
  269. database_name access_method_clause access_method attr_name
  270. name cursor_name file_name
  271. index_name opt_index_name cluster_index_specification
  272. %type <list> func_name handler_name qual_Op qual_all_Op subquery_Op
  273. opt_class opt_inline_handler opt_validator validator_clause
  274. opt_collate
  275. %type <range> qualified_name OptConstrFromTable
  276. %type <str> all_Op MathOp
  277. %type <str> iso_level opt_encoding
  278. %type <node> grantee
  279. %type <list> grantee_list
  280. %type <accesspriv> privilege
  281. %type <list> privileges privilege_list
  282. %type <privtarget> privilege_target
  283. %type <funwithargs> function_with_argtypes
  284. %type <list> function_with_argtypes_list
  285. %type <ival> defacl_privilege_target
  286. %type <defelt> DefACLOption
  287. %type <list> DefACLOptionList
  288. %type <list> stmtblock stmtmulti
  289. OptTableElementList TableElementList OptInherit definition
  290. OptTypedTableElementList TypedTableElementList
  291. reloptions opt_reloptions
  292. OptWith opt_distinct opt_definition func_args func_args_list
  293. func_args_with_defaults func_args_with_defaults_list
  294. aggr_args aggr_args_list
  295. func_as createfunc_opt_list alterfunc_opt_list
  296. old_aggr_definition old_aggr_list
  297. oper_argtypes RuleActionList RuleActionMulti
  298. opt_column_list columnList opt_name_list
  299. sort_clause opt_sort_clause sortby_list index_params
  300. name_list role_list from_clause from_list opt_array_bounds
  301. qualified_name_list any_name any_name_list
  302. any_operator expr_list attrs
  303. target_list opt_target_list insert_column_list set_target_list
  304. set_clause_list set_clause multiple_set_clause
  305. ctext_expr_list ctext_row def_list indirection opt_indirection
  306. reloption_list group_clause TriggerFuncArgs select_limit
  307. opt_select_limit opclass_item_list opclass_drop_list
  308. opclass_purpose opt_opfamily transaction_mode_list_or_empty
  309. OptTableFuncElementList TableFuncElementList opt_type_modifiers
  310. prep_type_clause
  311. execute_param_clause using_clause returning_clause
  312. opt_enum_val_list enum_val_list table_func_column_list
  313. create_generic_options alter_generic_options
  314. relation_expr_list dostmt_opt_list
  315. %type <list> opt_fdw_options fdw_options
  316. %type <defelt> fdw_option
  317. %type <range> OptTempTableName
  318. %type <into> into_clause create_as_target create_mv_target
  319. %type <defelt> createfunc_opt_item common_func_opt_item dostmt_opt_item
  320. %type <fun_param> func_arg func_arg_with_default table_func_column aggr_arg
  321. %type <fun_param_mode> arg_class
  322. %type <typnam> func_return func_type
  323. %type <boolean> opt_trusted opt_restart_seqs
  324. %type <ival> OptTemp
  325. %type <ival> OptNoLog
  326. %type <oncommit> OnCommitOption
  327. %type <ival> for_locking_strength
  328. %type <node> for_locking_item
  329. %type <list> for_locking_clause opt_for_locking_clause for_locking_items
  330. %type <list> locked_rels_list
  331. %type <boolean> opt_all
  332. %type <node> join_outer join_qual
  333. %type <jtype> join_type
  334. %type <list> extract_list overlay_list position_list
  335. %type <list> substr_list trim_list
  336. %type <list> opt_interval interval_second
  337. %type <node> overlay_placing substr_from substr_for
  338. %type <boolean> opt_instead
  339. %type <boolean> opt_unique opt_concurrently opt_verbose opt_full
  340. %type <boolean> opt_freeze opt_default opt_recheck
  341. %type <defelt> opt_binary opt_oids copy_delimiter
  342. %type <boolean> copy_from opt_program
  343. %type <ival> opt_column event cursor_options opt_hold opt_set_data
  344. %type <objtype> reindex_type drop_type comment_type security_label_type
  345. %type <node> fetch_args limit_clause select_limit_value
  346. offset_clause select_offset_value
  347. select_offset_value2 opt_select_fetch_first_value
  348. %type <ival> row_or_rows first_or_next
  349. %type <list> OptSeqOptList SeqOptList
  350. %type <defelt> SeqOptElem
  351. %type <istmt> insert_rest
  352. %type <vsetstmt> generic_set set_rest set_rest_more SetResetClause FunctionSetResetClause
  353. %type <node> TableElement TypedTableElement ConstraintElem TableFuncElement
  354. %type <node> columnDef columnOptions
  355. %type <defelt> def_elem reloption_elem old_aggr_elem
  356. %type <node> def_arg columnElem where_clause where_or_current_clause
  357. a_expr b_expr c_expr AexprConst indirection_el
  358. columnref in_expr having_clause func_table array_expr
  359. ExclusionWhereClause
  360. %type <list> rowsfrom_item rowsfrom_list opt_col_def_list
  361. %type <boolean> opt_ordinality
  362. %type <list> ExclusionConstraintList ExclusionConstraintElem
  363. %type <list> func_arg_list
  364. %type <node> func_arg_expr
  365. %type <list> row type_list array_expr_list
  366. %type <node> case_expr case_arg when_clause case_default
  367. %type <list> when_clause_list
  368. %type <ival> sub_type
  369. %type <node> ctext_expr
  370. %type <value> NumericOnly
  371. %type <list> NumericOnly_list
  372. %type <alias> alias_clause opt_alias_clause
  373. %type <list> func_alias_clause
  374. %type <sortby> sortby
  375. %type <ielem> index_elem
  376. %type <node> table_ref
  377. %type <jexpr> joined_table
  378. %type <range> relation_expr
  379. %type <range> relation_expr_opt_alias
  380. %type <target> target_el single_set_clause set_target insert_column_item
  381. %type <str> generic_option_name
  382. %type <node> generic_option_arg
  383. %type <defelt> generic_option_elem alter_generic_option_elem
  384. %type <list> generic_option_list alter_generic_option_list
  385. %type <str> explain_option_name
  386. %type <node> explain_option_arg
  387. %type <defelt> explain_option_elem
  388. %type <list> explain_option_list
  389. %type <node> copy_generic_opt_arg copy_generic_opt_arg_list_item
  390. %type <defelt> copy_generic_opt_elem
  391. %type <list> copy_generic_opt_list copy_generic_opt_arg_list
  392. %type <list> copy_options
  393. %type <typnam> Typename SimpleTypename ConstTypename
  394. GenericType Numeric opt_float
  395. Character ConstCharacter
  396. CharacterWithLength CharacterWithoutLength
  397. ConstDatetime ConstInterval
  398. Bit ConstBit BitWithLength BitWithoutLength
  399. %type <str> character
  400. %type <str> extract_arg
  401. %type <str> opt_charset
  402. %type <boolean> opt_varying opt_timezone opt_no_inherit
  403. %type <ival> Iconst SignedIconst
  404. %type <str> Sconst comment_text notify_payload
  405. %type <str> RoleId opt_granted_by opt_boolean_or_string
  406. %type <list> var_list
  407. %type <str> ColId ColLabel var_name type_function_name param_name
  408. %type <str> NonReservedWord NonReservedWord_or_Sconst
  409. %type <node> var_value zone_value
  410. %type <keyword> unreserved_keyword type_func_name_keyword
  411. %type <keyword> col_name_keyword reserved_keyword
  412. %type <node> TableConstraint TableLikeClause
  413. %type <ival> TableLikeOptionList TableLikeOption
  414. %type <list> ColQualList
  415. %type <node> ColConstraint ColConstraintElem ConstraintAttr
  416. %type <ival> key_actions key_delete key_match key_update key_action
  417. %type <ival> ConstraintAttributeSpec ConstraintAttributeElem
  418. %type <str> ExistingIndex
  419. %type <list> constraints_set_list
  420. %type <boolean> constraints_set_mode
  421. %type <str> OptTableSpace OptConsTableSpace OptTableSpaceOwner
  422. %type <ival> opt_check_option
  423. %type <str> opt_provider security_label
  424. %type <target> xml_attribute_el
  425. %type <list> xml_attribute_list xml_attributes
  426. %type <node> xml_root_version opt_xml_root_standalone
  427. %type <node> xmlexists_argument
  428. %type <ival> document_or_content
  429. %type <boolean> xml_whitespace_option
  430. %type <node> func_application func_expr_common_subexpr
  431. %type <node> func_expr func_expr_windowless
  432. %type <node> common_table_expr
  433. %type <with> with_clause opt_with_clause
  434. %type <list> cte_list
  435. %type <list> within_group_clause
  436. %type <node> filter_clause
  437. %type <list> window_clause window_definition_list opt_partition_clause
  438. %type <windef> window_definition over_clause window_specification
  439. opt_frame_clause frame_extent frame_bound
  440. %type <str> opt_existing_window_name
  441. %type <boolean> opt_if_not_exists
  442. /*
  443. * Non-keyword token types. These are hard-wired into the "flex" lexer.
  444. * They must be listed first so that their numeric codes do not depend on
  445. * the set of keywords. PL/pgsql depends on this so that it can share the
  446. * same lexer. If you add/change tokens here, fix PL/pgsql to match!
  447. *
  448. * DOT_DOT is unused in the core SQL grammar, and so will always provoke
  449. * parse errors. It is needed by PL/pgsql.
  450. */
  451. %token <str> IDENT FCONST SCONST BCONST XCONST Op
  452. %token <ival> ICONST PARAM
  453. %token TYPECAST DOT_DOT COLON_EQUALS
  454. /*
  455. * If you want to make any keyword changes, update the keyword table in
  456. * src/include/parser/kwlist.h and add new keywords to the appropriate one
  457. * of the reserved-or-not-so-reserved keyword lists, below; search
  458. * this file for "Keyword category lists".
  459. */
  460. /* ordinary key words in alphabetical order */
  461. %token <keyword> ABORT_P ABSOLUTE_P ACCESS ACTION ADD_P ADMIN AFTER
  462. AGGREGATE ALL ALSO ALTER ALWAYS ANALYSE ANALYZE AND ANY ARRAY AS ASC
  463. ASSERTION ASSIGNMENT ASYMMETRIC AT ATTRIBUTE AUTHORIZATION
  464. BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT
  465. BOOLEAN_P BOTH BY
  466. CACHE CALLED CASCADE CASCADED CASE CAST CATALOG_P CHAIN CHAR_P
  467. CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE
  468. CLUSTER COALESCE COLLATE COLLATION COLUMN COMMENT COMMENTS COMMIT
  469. COMMITTED CONCURRENTLY CONFIGURATION CONNECTION CONSTRAINT CONSTRAINTS
  470. CONTENT_P CONTINUE_P CONVERSION_P COPY COST CREATE
  471. CROSS CSV CURRENT_P
  472. CURRENT_CATALOG CURRENT_DATE CURRENT_ROLE CURRENT_SCHEMA
  473. CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE
  474. DATA_P DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS
  475. DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS DESC
  476. DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P DOUBLE_P DROP
  477. EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
  478. EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN
  479. EXTENSION EXTERNAL EXTRACT
  480. FALSE_P FAMILY FETCH FILTER FIRST_P FLOAT_P FOLLOWING FOR
  481. FORCE FOREIGN FORWARD FREEZE FROM FULL FUNCTION FUNCTIONS
  482. GLOBAL GRANT GRANTED GREATEST GROUP_P
  483. HANDLER HAVING HEADER_P HOLD HOUR_P
  484. IDENTITY_P IF_P ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IN_P
  485. INCLUDING INCREMENT INDEX INDEXES INHERIT INHERITS INITIALLY INLINE_P
  486. INNER_P INOUT INPUT_P INSENSITIVE INSERT INSTEAD INT_P INTEGER
  487. INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION
  488. JOIN
  489. KEY
  490. LABEL LANGUAGE LARGE_P LAST_P LATERAL_P LC_COLLATE_P LC_CTYPE_P
  491. LEADING LEAKPROOF LEAST LEFT LEVEL LIKE LIMIT LISTEN LOAD LOCAL
  492. LOCALTIME LOCALTIMESTAMP LOCATION LOCK_P
  493. MAPPING MATCH MATERIALIZED MAXVALUE MINUTE_P MINVALUE MODE MONTH_P MOVE
  494. NAME_P NAMES NATIONAL NATURAL NCHAR NEXT NO NONE
  495. NOT NOTHING NOTIFY NOTNULL NOWAIT NULL_P NULLIF
  496. NULLS_P NUMERIC
  497. OBJECT_P OF OFF OFFSET OIDS ON ONLY OPERATOR OPTION OPTIONS OR
  498. ORDER ORDINALITY OUT_P OUTER_P OVER OVERLAPS OVERLAY OWNED OWNER
  499. PARSER PARTIAL PARTITION PASSING PASSWORD PLACING PLANS POSITION
  500. PRECEDING PRECISION PRESERVE PREPARE PREPARED PRIMARY
  501. PRIOR PRIVILEGES PROCEDURAL PROCEDURE PROGRAM
  502. QUOTE
  503. RANGE READ REAL REASSIGN RECHECK RECURSIVE REF REFERENCES REFRESH REINDEX
  504. RELATIVE_P RELEASE RENAME REPEATABLE REPLACE REPLICA
  505. RESET RESTART RESTRICT RETURNING RETURNS REVOKE RIGHT ROLE ROLLBACK
  506. ROW ROWS RULE
  507. SAVEPOINT SCHEMA SCROLL SEARCH SECOND_P SECURITY SELECT SEQUENCE SEQUENCES
  508. SERIALIZABLE SERVER SESSION SESSION_USER SET SETOF SHARE
  509. SHOW SIMILAR SIMPLE SMALLINT SNAPSHOT SOME STABLE STANDALONE_P START
  510. STATEMENT STATISTICS STDIN STDOUT STORAGE STRICT_P STRIP_P SUBSTRING
  511. SYMMETRIC SYSID SYSTEM_P
  512. TABLE TABLES TABLESPACE TEMP TEMPLATE TEMPORARY TEXT_P THEN TIME TIMESTAMP
  513. TO TRAILING TRANSACTION TREAT TRIGGER TRIM TRUE_P
  514. TRUNCATE TRUSTED TYPE_P TYPES_P
  515. UNBOUNDED UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN UNLISTEN UNLOGGED
  516. UNTIL UPDATE USER USING
  517. VACUUM VALID VALIDATE VALIDATOR VALUE_P VALUES VARCHAR VARIADIC VARYING
  518. VERBOSE VERSION_P VIEW VIEWS VOLATILE
  519. WHEN WHERE WHITESPACE_P WINDOW WITH WITHIN WITHOUT WORK WRAPPER WRITE
  520. XML_P XMLATTRIBUTES XMLCONCAT XMLELEMENT XMLEXISTS XMLFOREST XMLPARSE
  521. XMLPI XMLROOT XMLSERIALIZE
  522. YEAR_P YES_P
  523. ZONE
  524. /*
  525. * The grammar thinks these are keywords, but they are not in the kwlist.h
  526. * list and so can never be entered directly. The filter in parser.c
  527. * creates these tokens when required.
  528. */
  529. %token NULLS_FIRST NULLS_LAST WITH_ORDINALITY WITH_TIME
  530. /* Precedence: lowest to highest */
  531. %nonassoc SET /* see relation_expr_opt_alias */
  532. %left UNION EXCEPT
  533. %left INTERSECT
  534. %left OR
  535. %left AND
  536. %right NOT
  537. %right '='
  538. %nonassoc '<' '>'
  539. %nonassoc LIKE ILIKE SIMILAR
  540. %nonassoc ESCAPE
  541. %nonassoc OVERLAPS
  542. %nonassoc BETWEEN
  543. %nonassoc IN_P
  544. %left POSTFIXOP /* dummy for postfix Op rules */
  545. /*
  546. * To support target_el without AS, we must give IDENT an explicit priority
  547. * between POSTFIXOP and Op. We can safely assign the same priority to
  548. * various unreserved keywords as needed to resolve ambiguities (this can't
  549. * have any bad effects since obviously the keywords will still behave the
  550. * same as if they weren't keywords). We need to do this for PARTITION,
  551. * RANGE, ROWS to support opt_existing_window_name; and for RANGE, ROWS
  552. * so that they can follow a_expr without creating postfix-operator problems;
  553. * and for NULL so that it can follow b_expr in ColQualList without creating
  554. * postfix-operator problems.
  555. *
  556. * The frame_bound productions UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING
  557. * are even messier: since UNBOUNDED is an unreserved keyword (per spec!),
  558. * there is no principled way to distinguish these from the productions
  559. * a_expr PRECEDING/FOLLOWING. We hack this up by giving UNBOUNDED slightly
  560. * lower precedence than PRECEDING and FOLLOWING. At present this doesn't
  561. * appear to cause UNBOUNDED to be treated differently from other unreserved
  562. * keywords anywhere else in the grammar, but it's definitely risky. We can
  563. * blame any funny behavior of UNBOUNDED on the SQL standard, though.
  564. */
  565. %nonassoc UNBOUNDED /* ideally should have same precedence as IDENT */
  566. %nonassoc IDENT NULL_P PARTITION RANGE ROWS PRECEDING FOLLOWING
  567. %left Op OPERATOR /* multi-character ops and user-defined operators */
  568. %nonassoc NOTNULL
  569. %nonassoc ISNULL
  570. %nonassoc IS /* sets precedence for IS NULL, etc */
  571. %left '+' '-'
  572. %left '*' '/' '%'
  573. %left '^'
  574. /* Unary Operators */
  575. %left AT /* sets precedence for AT TIME ZONE */
  576. %left COLLATE
  577. %right UMINUS
  578. %left '[' ']'
  579. %left '(' ')'
  580. %left TYPECAST
  581. %left '.'
  582. /*
  583. * These might seem to be low-precedence, but actually they are not part
  584. * of the arithmetic hierarchy at all in their use as JOIN operators.
  585. * We make them high-precedence to support their use as function names.
  586. * They wouldn't be given a precedence at all, were it not that we need
  587. * left-associativity among the JOIN rules themselves.
  588. */
  589. %left JOIN CROSS LEFT FULL RIGHT INNER_P NATURAL
  590. /* kluge to keep xml_whitespace_option from causing shift/reduce conflicts */
  591. %right PRESERVE STRIP_P
  592. %%
  593. /*
  594. * The target production for the whole parse.
  595. */
  596. stmtblock: stmtmulti
  597. {
  598. pg_yyget_extra(yyscanner)->parsetree = $1;
  599. }
  600. ;
  601. /* the thrashing around here is to discard "empty" statements... */
  602. stmtmulti: stmtmulti ';' stmt
  603. {
  604. if ($3 != NULL)
  605. $$ = lappend($1, $3);
  606. else
  607. $$ = $1;
  608. }
  609. | stmt
  610. {
  611. if ($1 != NULL)
  612. $$ = list_make1($1);
  613. else
  614. $$ = NIL;
  615. }
  616. ;
  617. stmt :
  618. AlterEventTrigStmt
  619. | AlterDatabaseStmt
  620. | AlterDatabaseSetStmt
  621. | AlterDefaultPrivilegesStmt
  622. | AlterDomainStmt
  623. | AlterEnumStmt
  624. | AlterExtensionStmt
  625. | AlterExtensionContentsStmt
  626. | AlterFdwStmt
  627. | AlterForeignServerStmt
  628. | AlterForeignTableStmt
  629. | AlterFunctionStmt
  630. | AlterGroupStmt
  631. | AlterObjectSchemaStmt
  632. | AlterOwnerStmt
  633. | AlterSeqStmt
  634. | AlterSystemStmt
  635. | AlterTableStmt
  636. | AlterCompositeTypeStmt
  637. | AlterRoleSetStmt
  638. | AlterRoleStmt
  639. | AlterTSConfigurationStmt
  640. | AlterTSDictionaryStmt
  641. | AlterUserMappingStmt
  642. | AlterUserSetStmt
  643. | AlterUserStmt
  644. | AnalyzeStmt
  645. | CheckPointStmt
  646. | ClosePortalStmt
  647. | ClusterStmt
  648. | CommentStmt
  649. | ConstraintsSetStmt
  650. | CopyStmt
  651. | CreateAsStmt
  652. | CreateAssertStmt
  653. | CreateCastStmt
  654. | CreateConversionStmt
  655. | CreateDomainStmt
  656. | CreateExtensionStmt
  657. | CreateFdwStmt
  658. | CreateForeignServerStmt
  659. | CreateForeignTableStmt
  660. | CreateFunctionStmt
  661. | CreateGroupStmt
  662. | CreateMatViewStmt
  663. | CreateOpClassStmt
  664. | CreateOpFamilyStmt
  665. | AlterOpFamilyStmt
  666. | CreatePLangStmt
  667. | CreateSchemaStmt
  668. | CreateSeqStmt
  669. | CreateStmt
  670. | CreateTableSpaceStmt
  671. | CreateTrigStmt
  672. | CreateEventTrigStmt
  673. | CreateRoleStmt
  674. | CreateUserStmt
  675. | CreateUserMappingStmt
  676. | CreatedbStmt
  677. | DeallocateStmt
  678. | DeclareCursorStmt
  679. | DefineStmt
  680. | DeleteStmt
  681. | DiscardStmt
  682. | DoStmt
  683. | DropAssertStmt
  684. | DropCastStmt
  685. | DropFdwStmt
  686. | DropForeignServerStmt
  687. | DropGroupStmt
  688. | DropOpClassStmt
  689. | DropOpFamilyStmt
  690. | DropOwnedStmt
  691. | DropPLangStmt
  692. | DropRuleStmt
  693. | DropStmt
  694. | DropTableSpaceStmt
  695. | DropTrigStmt
  696. | DropRoleStmt
  697. | DropUserStmt
  698. | DropUserMappingStmt
  699. | DropdbStmt
  700. | ExecuteStmt
  701. | ExplainStmt
  702. | FetchStmt
  703. | GrantStmt
  704. | GrantRoleStmt
  705. | IndexStmt
  706. | InsertStmt
  707. | ListenStmt
  708. | RefreshMatViewStmt
  709. | LoadStmt
  710. | LockStmt
  711. | NotifyStmt
  712. | PrepareStmt
  713. | ReassignOwnedStmt
  714. | ReindexStmt
  715. | RemoveAggrStmt
  716. | RemoveFuncStmt
  717. | RemoveOperStmt
  718. | RenameStmt
  719. | RevokeStmt
  720. | RevokeRoleStmt
  721. | RuleStmt
  722. | SecLabelStmt
  723. | SelectStmt
  724. | TransactionStmt
  725. | TruncateStmt
  726. | UnlistenStmt
  727. | UpdateStmt
  728. | VacuumStmt
  729. | VariableResetStmt
  730. | VariableSetStmt
  731. | VariableShowStmt
  732. | ViewStmt
  733. | /*EMPTY*/
  734. { $$ = NULL; }
  735. ;
  736. /*****************************************************************************
  737. *
  738. * Create a new Postgres DBMS role
  739. *
  740. *****************************************************************************/
  741. CreateRoleStmt:
  742. CREATE ROLE RoleId opt_with OptRoleList
  743. {
  744. CreateRoleStmt *n = makeNode(CreateRoleStmt);
  745. n->stmt_type = ROLESTMT_ROLE;
  746. n->role = $3;
  747. n->options = $5;
  748. $$ = (Node *)n;
  749. }
  750. ;
  751. opt_with: WITH {}
  752. | /*EMPTY*/ {}
  753. ;
  754. /*
  755. * Options for CREATE ROLE and ALTER ROLE (also used by CREATE/ALTER USER
  756. * for backwards compatibility). Note: the only option required by SQL99
  757. * is "WITH ADMIN name".
  758. */
  759. OptRoleList:
  760. OptRoleList CreateOptRoleElem { $$ = lappend($1, $2); }
  761. | /* EMPTY */ { $$ = NIL; }
  762. ;
  763. AlterOptRoleList:
  764. AlterOptRoleList AlterOptRoleElem { $$ = lappend($1, $2); }
  765. | /* EMPTY */ { $$ = NIL; }
  766. ;
  767. AlterOptRoleElem:
  768. PASSWORD Sconst
  769. {
  770. $$ = makeDefElem("password",
  771. (Node *)makeString($2));
  772. }
  773. | PASSWORD NULL_P
  774. {
  775. $$ = makeDefElem("password", NULL);
  776. }
  777. | ENCRYPTED PASSWORD Sconst
  778. {
  779. $$ = makeDefElem("encryptedPassword",
  780. (Node *)makeString($3));
  781. }
  782. | UNENCRYPTED PASSWORD Sconst
  783. {
  784. $$ = makeDefElem("unencryptedPassword",
  785. (Node *)makeString($3));
  786. }
  787. | INHERIT
  788. {
  789. $$ = makeDefElem("inherit", (Node *)makeInteger(TRUE));
  790. }
  791. | CONNECTION LIMIT SignedIconst
  792. {
  793. $$ = makeDefElem("connectionlimit", (Node *)makeInteger($3));
  794. }
  795. | VALID UNTIL Sconst
  796. {
  797. $$ = makeDefElem("validUntil", (Node *)makeString($3));
  798. }
  799. /* Supported but not documented for roles, for use by ALTER GROUP. */
  800. | USER role_list
  801. {
  802. $$ = makeDefElem("rolemembers", (Node *)$2);
  803. }
  804. | IDENT
  805. {
  806. /*
  807. * We handle identifiers that aren't parser keywords with
  808. * the following special-case codes, to avoid bloating the
  809. * size of the main parser.
  810. */
  811. if (strcmp($1, "superuser") == 0)
  812. $$ = makeDefElem("superuser", (Node *)makeInteger(TRUE));
  813. else if (strcmp($1, "nosuperuser") == 0)
  814. $$ = makeDefElem("superuser", (Node *)makeInteger(FALSE));
  815. else if (strcmp($1, "createuser") == 0)
  816. {
  817. /* For backwards compatibility, synonym for SUPERUSER */
  818. $$ = makeDefElem("superuser", (Node *)makeInteger(TRUE));
  819. }
  820. else if (strcmp($1, "nocreateuser") == 0)
  821. {
  822. /* For backwards compatibility, synonym for SUPERUSER */
  823. $$ = makeDefElem("superuser", (Node *)makeInteger(FALSE));
  824. }
  825. else if (strcmp($1, "createrole") == 0)
  826. $$ = makeDefElem("createrole", (Node *)makeInteger(TRUE));
  827. else if (strcmp($1, "nocreaterole") == 0)
  828. $$ = makeDefElem("createrole", (Node *)makeInteger(FALSE));
  829. else if (strcmp($1, "replication") == 0)
  830. $$ = makeDefElem("isreplication", (Node *)makeInteger(TRUE));
  831. else if (strcmp($1, "noreplication") == 0)
  832. $$ = makeDefElem("isreplication", (Node *)makeInteger(FALSE));
  833. else if (strcmp($1, "createdb") == 0)
  834. $$ = makeDefElem("createdb", (Node *)makeInteger(TRUE));
  835. else if (strcmp($1, "nocreatedb") == 0)
  836. $$ = makeDefElem("createdb", (Node *)makeInteger(FALSE));
  837. else if (strcmp($1, "login") == 0)
  838. $$ = makeDefElem("canlogin", (Node *)makeInteger(TRUE));
  839. else if (strcmp($1, "nologin") == 0)
  840. $$ = makeDefElem("canlogin", (Node *)makeInteger(FALSE));
  841. else if (strcmp($1, "noinherit") == 0)
  842. {
  843. /*
  844. * Note that INHERIT is a keyword, so it's handled by main parser, but
  845. * NOINHERIT is handled here.
  846. */
  847. $$ = makeDefElem("inherit", (Node *)makeInteger(FALSE));
  848. }
  849. else
  850. ereport(ERROR,
  851. (errcode(ERRCODE_SYNTAX_ERROR),
  852. errmsg("unrecognized role option \"%s\"", $1),
  853. parser_errposition(@1)));
  854. }
  855. ;
  856. CreateOptRoleElem:
  857. AlterOptRoleElem { $$ = $1; }
  858. /* The following are not supported by ALTER ROLE/USER/GROUP */
  859. | SYSID Iconst
  860. {
  861. $$ = makeDefElem("sysid", (Node *)makeInteger($2));
  862. }
  863. | ADMIN role_list
  864. {
  865. $$ = makeDefElem("adminmembers", (Node *)$2);
  866. }
  867. | ROLE role_list
  868. {
  869. $$ = makeDefElem("rolemembers", (Node *)$2);
  870. }
  871. | IN_P ROLE role_list
  872. {
  873. $$ = makeDefElem("addroleto", (Node *)$3);
  874. }
  875. | IN_P GROUP_P role_list
  876. {
  877. $$ = makeDefElem("addroleto", (Node *)$3);
  878. }
  879. ;
  880. /*****************************************************************************
  881. *
  882. * Create a new Postgres DBMS user (role with implied login ability)
  883. *
  884. *****************************************************************************/
  885. CreateUserStmt:
  886. CREATE USER RoleId opt_with OptRoleList
  887. {
  888. CreateRoleStmt *n = makeNode(CreateRoleStmt);
  889. n->stmt_type = ROLESTMT_USER;
  890. n->role = $3;
  891. n->options = $5;
  892. $$ = (Node *)n;
  893. }
  894. ;
  895. /*****************************************************************************
  896. *
  897. * Alter a postgresql DBMS role
  898. *
  899. *****************************************************************************/
  900. AlterRoleStmt:
  901. ALTER ROLE RoleId opt_with AlterOptRoleList
  902. {
  903. AlterRoleStmt *n = makeNode(AlterRoleStmt);
  904. n->role = $3;
  905. n->action = +1; /* add, if there are members */
  906. n->options = $5;
  907. $$ = (Node *)n;
  908. }
  909. ;
  910. opt_in_database:
  911. /* EMPTY */ { $$ = NULL; }
  912. | IN_P DATABASE database_name { $$ = $3; }
  913. ;
  914. AlterRoleSetStmt:
  915. ALTER ROLE RoleId opt_in_database SetResetClause
  916. {
  917. AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
  918. n->role = $3;
  919. n->database = $4;
  920. n->setstmt = $5;
  921. $$ = (Node *)n;
  922. }
  923. | ALTER ROLE ALL opt_in_database SetResetClause
  924. {
  925. AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
  926. n->role = NULL;
  927. n->database = $4;
  928. n->setstmt = $5;
  929. $$ = (Node *)n;
  930. }
  931. ;
  932. /*****************************************************************************
  933. *
  934. * Alter a postgresql DBMS user
  935. *
  936. *****************************************************************************/
  937. AlterUserStmt:
  938. ALTER USER RoleId opt_with AlterOptRoleList
  939. {
  940. AlterRoleStmt *n = makeNode(AlterRoleStmt);
  941. n->role = $3;
  942. n->action = +1; /* add, if there are members */
  943. n->options = $5;
  944. $$ = (Node *)n;
  945. }
  946. ;
  947. AlterUserSetStmt:
  948. ALTER USER RoleId SetResetClause
  949. {
  950. AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
  951. n->role = $3;
  952. n->database = NULL;
  953. n->setstmt = $4;
  954. $$ = (Node *)n;
  955. }
  956. ;
  957. /*****************************************************************************
  958. *
  959. * Drop a postgresql DBMS role
  960. *
  961. * XXX Ideally this would have CASCADE/RESTRICT options, but since a role
  962. * might own objects in multiple databases, there is presently no way to
  963. * implement either cascading or restricting. Caveat DBA.
  964. *****************************************************************************/
  965. DropRoleStmt:
  966. DROP ROLE role_list
  967. {
  968. DropRoleStmt *n = makeNode(DropRoleStmt);
  969. n->missing_ok = FALSE;
  970. n->roles = $3;
  971. $$ = (Node *)n;
  972. }
  973. | DROP ROLE IF_P EXISTS role_list
  974. {
  975. DropRoleStmt *n = makeNode(DropRoleStmt);
  976. n->missing_ok = TRUE;
  977. n->roles = $5;
  978. $$ = (Node *)n;
  979. }
  980. ;
  981. /*****************************************************************************
  982. *
  983. * Drop a postgresql DBMS user
  984. *
  985. * XXX Ideally this would have CASCADE/RESTRICT options, but since a user
  986. * might own objects in multiple databases, there is presently no way to
  987. * implement either cascading or restricting. Caveat DBA.
  988. *****************************************************************************/
  989. DropUserStmt:
  990. DROP USER role_list
  991. {
  992. DropRoleStmt *n = makeNode(DropRoleStmt);
  993. n->missing_ok = FALSE;
  994. n->roles = $3;
  995. $$ = (Node *)n;
  996. }
  997. | DROP USER IF_P EXISTS role_list
  998. {
  999. DropRoleStmt *n = makeNode(DropRoleStmt);
  1000. n->roles = $5;
  1001. n->missing_ok = TRUE;
  1002. $$ = (Node *)n;
  1003. }
  1004. ;
  1005. /*****************************************************************************
  1006. *
  1007. * Create a postgresql group (role without login ability)
  1008. *
  1009. *****************************************************************************/
  1010. CreateGroupStmt:
  1011. CREATE GROUP_P RoleId opt_with OptRoleList
  1012. {
  1013. CreateRoleStmt *n = makeNode(CreateRoleStmt);
  1014. n->stmt_type = ROLESTMT_GROUP;
  1015. n->role = $3;
  1016. n->options = $5;
  1017. $$ = (Node *)n;
  1018. }
  1019. ;
  1020. /*****************************************************************************
  1021. *
  1022. * Alter a postgresql group
  1023. *
  1024. *****************************************************************************/
  1025. AlterGroupStmt:
  1026. ALTER GROUP_P RoleId add_drop USER role_list
  1027. {
  1028. AlterRoleStmt *n = makeNode(AlterRoleStmt);
  1029. n->role = $3;
  1030. n->action = $4;
  1031. n->options = list_make1(makeDefElem("rolemembers",
  1032. (Node *)$6));
  1033. $$ = (Node *)n;
  1034. }
  1035. ;
  1036. add_drop: ADD_P { $$ = +1; }
  1037. | DROP { $$ = -1; }
  1038. ;
  1039. /*****************************************************************************
  1040. *
  1041. * Drop a postgresql group
  1042. *
  1043. * XXX see above notes about cascading DROP USER; groups have same problem.
  1044. *****************************************************************************/
  1045. DropGroupStmt:
  1046. DROP GROUP_P role_list
  1047. {
  1048. DropRoleStmt *n = makeNode(DropRoleStmt);
  1049. n->missing_ok = FALSE;
  1050. n->roles = $3;
  1051. $$ = (Node *)n;
  1052. }
  1053. | DROP GROUP_P IF_P EXISTS role_list
  1054. {
  1055. DropRoleStmt *n = makeNode(DropRoleStmt);
  1056. n->missing_ok = TRUE;
  1057. n->roles = $5;
  1058. $$ = (Node *)n;
  1059. }
  1060. ;
  1061. /*****************************************************************************
  1062. *
  1063. * Manipulate a schema
  1064. *
  1065. *****************************************************************************/
  1066. CreateSchemaStmt:
  1067. CREATE SCHEMA OptSchemaName AUTHORIZATION RoleId OptSchemaEltList
  1068. {
  1069. CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
  1070. /* One can omit the schema name or the authorization id. */
  1071. if ($3 != NULL)
  1072. n->schemaname = $3;
  1073. else
  1074. n->schemaname = $5;
  1075. n->authid = $5;
  1076. n->schemaElts = $6;
  1077. n->if_not_exists = false;
  1078. $$ = (Node *)n;
  1079. }
  1080. | CREATE SCHEMA ColId OptSchemaEltList
  1081. {
  1082. CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
  1083. /* ...but not both */
  1084. n->schemaname = $3;
  1085. n->authid = NULL;
  1086. n->schemaElts = $4;
  1087. n->if_not_exists = false;
  1088. $$ = (Node *)n;
  1089. }
  1090. | CREATE SCHEMA IF_P NOT EXISTS OptSchemaName AUTHORIZATION RoleId OptSchemaEltList
  1091. {
  1092. CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
  1093. /* One can omit the schema name or the authorization id. */
  1094. if ($6 != NULL)
  1095. n->schemaname = $6;
  1096. else
  1097. n->schemaname = $8;
  1098. n->authid = $8;
  1099. if ($9 != NIL)
  1100. ereport(ERROR,
  1101. (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
  1102. errmsg("CREATE SCHEMA IF NOT EXISTS cannot include schema elements"),
  1103. parser_errposition(@9)));
  1104. n->schemaElts = $9;
  1105. n->if_not_exists = true;
  1106. $$ = (Node *)n;
  1107. }
  1108. | CREATE SCHEMA IF_P NOT EXISTS ColId OptSchemaEltList
  1109. {
  1110. CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
  1111. /* ...but not both */
  1112. n->schemaname = $6;
  1113. n->authid = NULL;
  1114. if ($7 != NIL)
  1115. ereport(ERROR,
  1116. (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
  1117. errmsg("CREATE SCHEMA IF NOT EXISTS cannot include schema elements"),
  1118. parser_errposition(@7)));
  1119. n->schemaElts = $7;
  1120. n->if_not_exists = true;
  1121. $$ = (Node *)n;
  1122. }
  1123. ;
  1124. OptSchemaName:
  1125. ColId { $$ = $1; }
  1126. | /* EMPTY */ { $$ = NULL; }
  1127. ;
  1128. OptSchemaEltList:
  1129. OptSchemaEltList schema_stmt
  1130. {
  1131. if (@$ < 0) /* see comments for YYLLOC_DEFAULT */
  1132. @$ = @2;
  1133. $$ = lappend($1, $2);
  1134. }
  1135. | /* EMPTY */
  1136. { $$ = NIL; }
  1137. ;
  1138. /*
  1139. * schema_stmt are the ones that can show up inside a CREATE SCHEMA
  1140. * statement (in addition to by themselves).
  1141. */
  1142. schema_stmt:
  1143. CreateStmt
  1144. | IndexStmt
  1145. | CreateSeqStmt
  1146. | CreateTrigStmt
  1147. | GrantStmt
  1148. | ViewStmt
  1149. ;
  1150. /*****************************************************************************
  1151. *
  1152. * Set PG internal variable
  1153. * SET name TO 'var_value'
  1154. * Include SQL syntax (thomas 1997-10-22):
  1155. * SET TIME ZONE 'var_value'
  1156. *
  1157. *****************************************************************************/
  1158. VariableSetStmt:
  1159. SET set_rest
  1160. {
  1161. VariableSetStmt *n = $2;
  1162. n->is_local = false;
  1163. $$ = (Node *) n;
  1164. }
  1165. | SET LOCAL set_rest
  1166. {
  1167. VariableSetStmt *n = $3;
  1168. n->is_local = true;
  1169. $$ = (Node *) n;
  1170. }
  1171. | SET SESSION set_rest
  1172. {
  1173. VariableSetStmt *n = $3;
  1174. n->is_local = false;
  1175. $$ = (Node *) n;
  1176. }
  1177. ;
  1178. set_rest:
  1179. TRANSACTION transaction_mode_list
  1180. {
  1181. VariableSetStmt *n = makeNode(VariableSetStmt);
  1182. n->kind = VAR_SET_MULTI;
  1183. n->name = "TRANSACTION";
  1184. n->args = $2;
  1185. $$ = n;
  1186. }
  1187. | SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list
  1188. {
  1189. VariableSetStmt *n = makeNode(VariableSetStmt);
  1190. n->kind = VAR_SET_MULTI;
  1191. n->name = "SESSION CHARACTERISTICS";
  1192. n->args = $5;
  1193. $$ = n;
  1194. }
  1195. | set_rest_more
  1196. ;
  1197. generic_set:
  1198. var_name TO var_list
  1199. {
  1200. VariableSetStmt *n = makeNode(VariableSetStmt);
  1201. n->kind = VAR_SET_VALUE;
  1202. n->name = $1;
  1203. n->args = $3;
  1204. $$ = n;
  1205. }
  1206. | var_name '=' var_list
  1207. {
  1208. VariableSetStmt *n = makeNode(VariableSetStmt);
  1209. n->kind = VAR_SET_VALUE;
  1210. n->name = $1;
  1211. n->args = $3;
  1212. $$ = n;
  1213. }
  1214. | var_name TO DEFAULT
  1215. {
  1216. VariableSetStmt *n = makeNode(VariableSetStmt);
  1217. n->kind = VAR_SET_DEFAULT;
  1218. n->name = $1;
  1219. $$ = n;
  1220. }
  1221. | var_name '=' DEFAULT
  1222. {
  1223. VariableSetStmt *n = makeNode(VariableSetStmt);
  1224. n->kind = VAR_SET_DEFAULT;
  1225. n->name = $1;
  1226. $$ = n;
  1227. }
  1228. set_rest_more: /* Generic SET syntaxes: */
  1229. generic_set {$$ = $1;}
  1230. | var_name FROM CURRENT_P
  1231. {
  1232. VariableSetStmt *n = makeNode(VariableSetStmt);
  1233. n->kind = VAR_SET_CURRENT;
  1234. n->name = $1;
  1235. $$ = n;
  1236. }
  1237. /* Special syntaxes mandated by SQL standard: */
  1238. | TIME ZONE zone_value
  1239. {
  1240. VariableSetStmt *n = makeNode(VariableSetStmt);
  1241. n->kind = VAR_SET_VALUE;
  1242. n->name = "timezone";
  1243. if ($3 != NULL)
  1244. n->args = list_make1($3);
  1245. else
  1246. n->kind = VAR_SET_DEFAULT;
  1247. $$ = n;
  1248. }
  1249. | CATALOG_P Sconst
  1250. {
  1251. ereport(ERROR,
  1252. (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
  1253. errmsg("current database cannot be changed"),
  1254. parser_errposition(@2)));
  1255. $$ = NULL; /*not reached*/
  1256. }
  1257. | SCHEMA Sconst
  1258. {
  1259. VariableSetStmt *n = makeNode(VariableSetStmt);
  1260. n->kind = VAR_SET_VALUE;
  1261. n->name = "search_path";
  1262. n->args = list_make1(makeStringConst($2, @2));
  1263. $$ = n;
  1264. }
  1265. | NAMES opt_encoding
  1266. {
  1267. VariableSetStmt *n = makeNode(VariableSetStmt);
  1268. n->kind = VAR_SET_VALUE;
  1269. n->name = "client_encoding";
  1270. if ($2 != NULL)
  1271. n->args = list_make1(makeStringConst($2, @2));
  1272. else
  1273. n->kind = VAR_SET_DEFAULT;
  1274. $$ = n;
  1275. }
  1276. | ROLE NonReservedWord_or_Sconst
  1277. {
  1278. VariableSetStmt *n = makeNode(VariableSetStmt);
  1279. n->kind = VAR_SET_VALUE;
  1280. n->name = "role";
  1281. n->args = list_make1(makeStringConst($2, @2));
  1282. $$ = n;
  1283. }
  1284. | SESSION AUTHORIZATION NonReservedWord_or_Sconst
  1285. {
  1286. VariableSetStmt *n = makeNode(VariableSetStmt);
  1287. n->kind = VAR_SET_VALUE;
  1288. n->name = "session_authorization";
  1289. n->args = list_make1(makeStringConst($3, @3));
  1290. $$ = n;
  1291. }
  1292. | SESSION AUTHORIZATION DEFAULT
  1293. {
  1294. VariableSetStmt *n = makeNode(VariableSetStmt);
  1295. n->kind = VAR_SET_DEFAULT;
  1296. n->name = "session_authorization";
  1297. $$ = n;
  1298. }
  1299. | XML_P OPTION document_or_content
  1300. {
  1301. VariableSetStmt *n = makeNode(VariableSetStmt);
  1302. n->kind = VAR_SET_VALUE;
  1303. n->name = "xmloption";
  1304. n->args = list_make1(makeStringConst($3 == XMLOPTION_DOCUMENT ? "DOCUMENT" : "CONTENT", @3));
  1305. $$ = n;
  1306. }
  1307. /* Special syntaxes invented by PostgreSQL: */
  1308. | TRANSACTION SNAPSHOT Sconst
  1309. {
  1310. VariableSetStmt *n = makeNode(VariableSetStmt);
  1311. n->kind = VAR_SET_MULTI;
  1312. n->name = "TRANSACTION SNAPSHOT";
  1313. n->args = list_make1(makeStringConst($3, @3));
  1314. $$ = n;
  1315. }
  1316. ;
  1317. var_name: ColId { $$ = $1; }
  1318. | var_name '.' ColId
  1319. { $$ = psprintf("%s.%s", $1, $3); }
  1320. ;
  1321. var_list: var_value { $$ = list_make1($1); }
  1322. | var_list ',' var_value { $$ = lappend($1, $3); }
  1323. ;
  1324. var_value: opt_boolean_or_string
  1325. { $$ = makeStringConst($1, @1); }
  1326. | NumericOnly
  1327. { $$ = makeAConst($1, @1); }
  1328. ;
  1329. iso_level: READ UNCOMMITTED { $$ = "read uncommitted"; }
  1330. | READ COMMITTED { $$ = "read committed"; }
  1331. | REPEATABLE READ { $$ = "repeatable read"; }
  1332. | SERIALIZABLE { $$ = "serializable"; }
  1333. ;
  1334. opt_boolean_or_string:
  1335. TRUE_P { $$ = "true"; }
  1336. | FALSE_P { $$ = "false"; }
  1337. | ON { $$ = "on"; }
  1338. /*
  1339. * OFF is also accepted as a boolean value, but is handled by
  1340. * the NonReservedWord rule. The action for booleans and strings
  1341. * is the same, so we don't need to distinguish them here.
  1342. */
  1343. | NonReservedWord_or_Sconst { $$ = $1; }
  1344. ;
  1345. /* Timezone values can be:
  1346. * - a string such as 'pst8pdt'
  1347. * - an identifier such as "pst8pdt"
  1348. * - an integer or floating point number
  1349. * - a time interval per SQL99
  1350. * ColId gives reduce/reduce errors against ConstInterval and LOCAL,
  1351. * so use IDENT (meaning we reject anything that is a key word).
  1352. */
  1353. zone_value:
  1354. Sconst
  1355. {
  1356. $$ = makeStringConst($1, @1);
  1357. }
  1358. | IDENT
  1359. {
  1360. $$ = makeStringConst($1, @1);
  1361. }
  1362. | ConstInterval Sconst opt_interval
  1363. {
  1364. TypeName *t = $1;
  1365. if ($3 != NIL)
  1366. {
  1367. A_Const *n = (A_Const *) linitial($3);
  1368. if ((n->val.val.ival & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0)
  1369. ereport(ERROR,
  1370. (errcode(ERRCODE_SYNTAX_ERROR),
  1371. errmsg("time zone interval must be HOUR or HOUR TO MINUTE"),
  1372. parser_errposition(@3)));
  1373. }
  1374. t->typmods = $3;
  1375. $$ = makeStringConstCast($2, @2, t);
  1376. }
  1377. | ConstInterval '(' Iconst ')' Sconst opt_interval
  1378. {
  1379. TypeName *t = $1;
  1380. if ($6 != NIL)
  1381. {
  1382. A_Const *n = (A_Const *) linitial($6);
  1383. if ((n->val.val.ival & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0)
  1384. ereport(ERROR,
  1385. (errcode(ERRCODE_SYNTAX_ERROR),
  1386. errmsg("time zone interval must be HOUR or HOUR TO MINUTE"),
  1387. parser_errposition(@6)));
  1388. if (list_length($6) != 1)
  1389. ereport(ERROR,
  1390. (errcode(ERRCODE_SYNTAX_ERROR),
  1391. errmsg("interval precision specified twice"),
  1392. parser_errposition(@1)));
  1393. t->typmods = lappend($6, makeIntConst($3, @3));
  1394. }
  1395. else
  1396. t->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1),
  1397. makeIntConst($3, @3));
  1398. $$ = makeStringConstCast($5, @5, t);
  1399. }
  1400. | NumericOnly { $$ = makeAConst($1, @1); }
  1401. | DEFAULT { $$ = NULL; }
  1402. | LOCAL { $$ = NULL; }
  1403. ;
  1404. opt_encoding:
  1405. Sconst { $$ = $1; }
  1406. | DEFAULT { $$ = NULL; }
  1407. | /*EMPTY*/ { $$ = NULL; }
  1408. ;
  1409. NonReservedWord_or_Sconst:
  1410. NonReservedWord { $$ = $1; }
  1411. | Sconst { $$ = $1; }
  1412. ;
  1413. VariableResetStmt:
  1414. RESET var_name
  1415. {
  1416. VariableSetStmt *n = makeNode(VariableSetStmt);
  1417. n->kind = VAR_RESET;
  1418. n->name = $2;
  1419. $$ = (Node *) n;
  1420. }
  1421. | RESET TIME ZONE
  1422. {
  1423. VariableSetStmt *n = makeNode(VariableSetStmt);
  1424. n->kind = VAR_RESET;
  1425. n->name = "timezone";
  1426. $$ = (Node *) n;
  1427. }
  1428. | RESET TRANSACTION ISOLATION LEVEL
  1429. {
  1430. VariableSetStmt *n = makeNode(VariableSetStmt);
  1431. n->kind = VAR_RESET;
  1432. n->name = "transaction_isolation";
  1433. $$ = (Node *) n;
  1434. }
  1435. | RESET SESSION AUTHORIZATION
  1436. {
  1437. VariableSetStmt *n = makeNode(VariableSetStmt);
  1438. n->kind = VAR_RESET;
  1439. n->name = "session_authorization";
  1440. $$ = (Node *) n;
  1441. }
  1442. | RESET ALL
  1443. {
  1444. VariableSetStmt *n = makeNode(VariableSetStmt);
  1445. n->kind = VAR_RESET_ALL;
  1446. $$ = (Node *) n;
  1447. }
  1448. ;
  1449. /* SetResetClause allows SET or RESET without LOCAL */
  1450. SetResetClause:
  1451. SET set_rest { $$ = $2; }
  1452. | VariableResetStmt { $$ = (VariableSetStmt *) $1; }
  1453. ;
  1454. /* SetResetClause allows SET or RESET without LOCAL */
  1455. FunctionSetResetClause:
  1456. SET set_rest_more { $$ = $2; }
  1457. | VariableResetStmt { $$ = (VariableSetStmt *) $1; }
  1458. ;
  1459. VariableShowStmt:
  1460. SHOW var_name
  1461. {
  1462. VariableShowStmt *n = makeNode(VariableShowStmt);
  1463. n->name = $2;
  1464. $$ = (Node *) n;
  1465. }
  1466. | SHOW TIME ZONE
  1467. {
  1468. VariableShowStmt *n = makeNode(VariableShowStmt);
  1469. n->name = "timezone";
  1470. $$ = (Node *) n;
  1471. }
  1472. | SHOW TRANSACTION ISOLATION LEVEL
  1473. {
  1474. VariableShowStmt *n = makeNode(VariableShowStmt);
  1475. n->name = "transaction_isolation";
  1476. $$ = (Node *) n;
  1477. }
  1478. | SHOW SESSION AUTHORIZATION
  1479. {
  1480. VariableShowStmt *n = makeNode(VariableShowStmt);
  1481. n->name = "session_authorization";
  1482. $$ = (Node *) n;
  1483. }
  1484. | SHOW ALL
  1485. {
  1486. VariableShowStmt *n = makeNode(VariableShowStmt);
  1487. n->name = "all";
  1488. $$ = (Node *) n;
  1489. }
  1490. ;
  1491. ConstraintsSetStmt:
  1492. SET CONSTRAINTS constraints_set_list constraints_set_mode
  1493. {
  1494. ConstraintsSetStmt *n = makeNode(ConstraintsSetStmt);
  1495. n->constraints = $3;
  1496. n->deferred = $4;
  1497. $$ = (Node *) n;
  1498. }
  1499. ;
  1500. constraints_set_list:
  1501. ALL { $$ = NIL; }
  1502. | qualified_name_list { $$ = $1; }
  1503. ;
  1504. constraints_set_mode:
  1505. DEFERRED { $$ = TRUE; }
  1506. | IMMEDIATE { $$ = FALSE; }
  1507. ;
  1508. /*
  1509. * Checkpoint statement
  1510. */
  1511. CheckPointStmt:
  1512. CHECKPOINT
  1513. {
  1514. CheckPointStmt *n = makeNode(CheckPointStmt);
  1515. $$ = (Node *)n;
  1516. }
  1517. ;
  1518. /*****************************************************************************
  1519. *
  1520. * DISCARD { ALL | TEMP | PLANS | SEQUENCES }
  1521. *
  1522. *****************************************************************************/
  1523. DiscardStmt:
  1524. DISCARD ALL
  1525. {
  1526. DiscardStmt *n = makeNode(DiscardStmt);
  1527. n->target = DISCARD_ALL;
  1528. $$ = (Node *) n;
  1529. }
  1530. | DISCARD TEMP
  1531. {
  1532. DiscardStmt *n = makeNode(DiscardStmt);
  1533. n->target = DISCARD_TEMP;
  1534. $$ = (Node *) n;
  1535. }
  1536. | DISCARD TEMPORARY
  1537. {
  1538. DiscardStmt *n = makeNode(DiscardStmt);
  1539. n->target = DISCARD_TEMP;
  1540. $$ = (Node *) n;
  1541. }
  1542. | DISCARD PLANS
  1543. {
  1544. DiscardStmt *n = makeNode(DiscardStmt);
  1545. n->target = DISCARD_PLANS;
  1546. $$ = (Node *) n;
  1547. }
  1548. | DISCARD SEQUENCES
  1549. {
  1550. DiscardStmt *n = makeNode(DiscardStmt);
  1551. n->target = DISCARD_SEQUENCES;
  1552. $$ = (Node *) n;
  1553. }
  1554. ;
  1555. /*****************************************************************************
  1556. *
  1557. * ALTER [ TABLE | INDEX | SEQUENCE | VIEW | MATERIALIZED VIEW ] variations
  1558. *
  1559. * Note: we accept all subcommands for each of the five variants, and sort
  1560. * out what's really legal at execution time.
  1561. *****************************************************************************/
  1562. AlterTableStmt:
  1563. ALTER TABLE relation_expr alter_table_cmds
  1564. {
  1565. AlterTableStmt *n = makeNode(AlterTableStmt);
  1566. n->relation = $3;
  1567. n->cmds = $4;
  1568. n->relkind = OBJECT_TABLE;
  1569. n->missing_ok = false;
  1570. $$ = (Node *)n;
  1571. }
  1572. | ALTER TABLE IF_P EXISTS relation_expr alter_table_cmds
  1573. {
  1574. AlterTableStmt *n = makeNode(AlterTableStmt);
  1575. n->relation = $5;
  1576. n->cmds = $6;
  1577. n->relkind = OBJECT_TABLE;
  1578. n->missing_ok = true;
  1579. $$ = (Node *)n;
  1580. }
  1581. | ALTER INDEX qualified_name alter_table_cmds
  1582. {
  1583. AlterTableStmt *n = makeNode(AlterTableStmt);
  1584. n->relation = $3;
  1585. n->cmds = $4;
  1586. n->relkind = OBJECT_INDEX;
  1587. n->missing_ok = false;
  1588. $$ = (Node *)n;
  1589. }
  1590. | ALTER INDEX IF_P EXISTS qualified_name alter_table_cmds
  1591. {
  1592. AlterTableStmt *n = makeNode(AlterTableStmt);
  1593. n->relation = $5;
  1594. n->cmds = $6;
  1595. n->relkind = OBJECT_INDEX;
  1596. n->missing_ok = true;
  1597. $$ = (Node *)n;
  1598. }
  1599. | ALTER SEQUENCE qualified_name alter_table_cmds
  1600. {
  1601. AlterTableStmt *n = makeNode(AlterTableStmt);
  1602. n->relation = $3;
  1603. n->cmds = $4;
  1604. n->relkind = OBJECT_SEQUENCE;
  1605. n->missing_ok = false;
  1606. $$ = (Node *)n;
  1607. }
  1608. | ALTER SEQUENCE IF_P EXISTS qualified_name alter_table_cmds
  1609. {
  1610. AlterTableStmt *n = makeNode(AlterTableStmt);
  1611. n->relation = $5;
  1612. n->cmds = $6;
  1613. n->relkind = OBJECT_SEQUENCE;
  1614. n->missing_ok = true;
  1615. $$ = (Node *)n;
  1616. }
  1617. | ALTER VIEW qualified_name alter_table_cmds
  1618. {
  1619. AlterTableStmt *n = makeNode(AlterTableStmt);
  1620. n->relation = $3;
  1621. n->cmds = $4;
  1622. n->relkind = OBJECT_VIEW;
  1623. n->missing_ok = false;
  1624. $$ = (Node *)n;
  1625. }
  1626. | ALTER VIEW IF_P EXISTS qualified_name alter_table_cmds
  1627. {
  1628. AlterTableStmt *n = makeNode(AlterTableStmt);
  1629. n->relation = $5;
  1630. n->cmds = $6;
  1631. n->relkind = OBJECT_VIEW;
  1632. n->missing_ok = true;
  1633. $$ = (Node *)n;
  1634. }
  1635. | ALTER MATERIALIZED VIEW qualified_name alter_table_cmds
  1636. {
  1637. AlterTableStmt *n = makeNode(AlterTableStmt);
  1638. n->relation = $4;
  1639. n->cmds = $5;
  1640. n->relkind = OBJECT_MATVIEW;
  1641. n->missing_ok = false;
  1642. $$ = (Node *)n;
  1643. }
  1644. | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name alter_table_cmds
  1645. {
  1646. AlterTableStmt *n = makeNode(AlterTableStmt);
  1647. n->relation = $6;
  1648. n->cmds = $7;
  1649. n->relkind = OBJECT_MATVIEW;
  1650. n->missing_ok = true;
  1651. $$ = (Node *)n;
  1652. }
  1653. ;
  1654. alter_table_cmds:
  1655. alter_table_cmd { $$ = list_make1($1); }
  1656. | alter_table_cmds ',' alter_table_cmd { $$ = lappend($1, $3); }
  1657. ;
  1658. alter_table_cmd:
  1659. /* ALTER TABLE <name> ADD <coldef> */
  1660. ADD_P columnDef
  1661. {
  1662. AlterTableCmd *n = makeNode(AlterTableCmd);
  1663. n->subtype = AT_AddColumn;
  1664. n->def = $2;
  1665. $$ = (Node *)n;
  1666. }
  1667. /* ALTER TABLE <name> ADD COLUMN <coldef> */
  1668. | ADD_P COLUMN columnDef
  1669. {
  1670. AlterTableCmd *n = makeNode(AlterTableCmd);
  1671. n->subtype = AT_AddColumn;
  1672. n->def = $3;
  1673. $$ = (Node *)n;
  1674. }
  1675. /* ALTER TABLE <name> ALTER [COLUMN] <colname> {SET DEFAULT <expr>|DROP DEFAULT} */
  1676. | ALTER opt_column ColId alter_column_default
  1677. {
  1678. AlterTableCmd *n = makeNode(AlterTableCmd);
  1679. n->subtype = AT_ColumnDefault;
  1680. n->name = $3;
  1681. n->def = $4;
  1682. $$ = (Node *)n;
  1683. }
  1684. /* ALTER TABLE <name> ALTER [COLUMN] <colname> DROP NOT NULL */
  1685. | ALTER opt_column ColId DROP NOT NULL_P
  1686. {
  1687. AlterTableCmd *n = makeNode(AlterTableCmd);
  1688. n->subtype = AT_DropNotNull;
  1689. n->name = $3;
  1690. $$ = (Node *)n;
  1691. }
  1692. /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET NOT NULL */
  1693. | ALTER opt_column ColId SET NOT NULL_P
  1694. {
  1695. AlterTableCmd *n = makeNode(AlterTableCmd);
  1696. n->subtype = AT_SetNotNull;
  1697. n->name = $3;
  1698. $$ = (Node *)n;
  1699. }
  1700. /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET STATISTICS <SignedIconst> */
  1701. | ALTER opt_column ColId SET STATISTICS SignedIconst
  1702. {
  1703. AlterTableCmd *n = makeNode(AlterTableCmd);
  1704. n->subtype = AT_SetStatistics;
  1705. n->name = $3;
  1706. n->def = (Node *) makeInteger($6);
  1707. $$ = (Node *)n;
  1708. }
  1709. /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET ( column_parameter = value [, ... ] ) */
  1710. | ALTER opt_column ColId SET reloptions
  1711. {
  1712. AlterTableCmd *n = makeNode(AlterTableCmd);
  1713. n->subtype = AT_SetOptions;
  1714. n->name = $3;
  1715. n->def = (Node *) $5;
  1716. $$ = (Node *)n;
  1717. }
  1718. /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET ( column_parameter = value [, ... ] ) */
  1719. | ALTER opt_column ColId RESET reloptions
  1720. {
  1721. AlterTableCmd *n = makeNode(AlterTableCmd);
  1722. n->subtype = AT_ResetOptions;
  1723. n->name = $3;
  1724. n->def = (Node *) $5;
  1725. $$ = (Node *)n;
  1726. }
  1727. /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET STORAGE <storagemode> */
  1728. | ALTER opt_column ColId SET STORAGE ColId
  1729. {
  1730. AlterTableCmd *n = makeNode(AlterTableCmd);
  1731. n->subtype = AT_SetStorage;
  1732. n->name = $3;
  1733. n->def = (Node *) makeString($6);
  1734. $$ = (Node *)n;
  1735. }
  1736. /* ALTER TABLE <name> DROP [COLUMN] IF EXISTS <colname> [RESTRICT|CASCADE] */
  1737. | DROP opt_column IF_P EXISTS ColId opt_drop_behavior
  1738. {
  1739. AlterTableCmd *n = makeNode(AlterTableCmd);
  1740. n->subtype = AT_DropColumn;
  1741. n->name = $5;
  1742. n->behavior = $6;
  1743. n->missing_ok = TRUE;
  1744. $$ = (Node *)n;
  1745. }
  1746. /* ALTER TABLE <name> DROP [COLUMN] <colname> [RESTRICT|CASCADE] */
  1747. | DROP opt_column ColId opt_drop_behavior
  1748. {
  1749. AlterTableCmd *n = makeNode(AlterTableCmd);
  1750. n->subtype = AT_DropColumn;
  1751. n->name = $3;
  1752. n->behavior = $4;
  1753. n->missing_ok = FALSE;
  1754. $$ = (Node *)n;
  1755. }
  1756. /*
  1757. * ALTER TABLE <name> ALTER [COLUMN] <colname> [SET DATA] TYPE <typename>
  1758. * [ USING <expression> ]
  1759. */
  1760. | ALTER opt_column ColId opt_set_data TYPE_P Typename opt_collate_clause alter_using
  1761. {
  1762. AlterTableCmd *n = makeNode(AlterTableCmd);
  1763. ColumnDef *def = makeNode(ColumnDef);
  1764. n->subtype = AT_AlterColumnType;
  1765. n->name = $3;
  1766. n->def = (Node *) def;
  1767. /* We only use these fields of the ColumnDef node */
  1768. def->typeName = $6;
  1769. def->collClause = (CollateClause *) $7;
  1770. def->raw_default = $8;
  1771. def->location = @3;
  1772. $$ = (Node *)n;
  1773. }
  1774. /* ALTER FOREIGN TABLE <name> ALTER [COLUMN] <colname> OPTIONS */
  1775. | ALTER opt_column ColId alter_generic_options
  1776. {
  1777. AlterTableCmd *n = makeNode(AlterTableCmd);
  1778. n->subtype = AT_AlterColumnGenericOptions;
  1779. n->name = $3;
  1780. n->def = (Node *) $4;
  1781. $$ = (Node *)n;
  1782. }
  1783. /* ALTER TABLE <name> ADD CONSTRAINT ... */
  1784. | ADD_P TableConstraint
  1785. {
  1786. AlterTableCmd *n = makeNode(AlterTableCmd);
  1787. n->subtype = AT_AddConstraint;
  1788. n->def = $2;
  1789. $$ = (Node *)n;
  1790. }
  1791. /* ALTER TABLE <name> ALTER CONSTRAINT ... */
  1792. | ALTER CONSTRAINT name ConstraintAttributeSpec
  1793. {
  1794. AlterTableCmd *n = makeNode(AlterTableCmd);
  1795. Constraint *c = makeNode(Constraint);
  1796. n->subtype = AT_AlterConstraint;
  1797. n->def = (Node *) c;
  1798. c->contype = CONSTR_FOREIGN; /* others not supported, yet */
  1799. c->conname = $3;
  1800. processCASbits($4, @4, "ALTER CONSTRAINT statement",
  1801. &c->deferrable,
  1802. &c->initdeferred,
  1803. NULL, NULL, yyscanner);
  1804. $$ = (Node *)n;
  1805. }
  1806. /* ALTER TABLE <name> VALIDATE CONSTRAINT ... */
  1807. | VALIDATE CONSTRAINT name
  1808. {
  1809. AlterTableCmd *n = makeNode(AlterTableCmd);
  1810. n->subtype = AT_ValidateConstraint;
  1811. n->name = $3;
  1812. $$ = (Node *)n;
  1813. }
  1814. /* ALTER TABLE <name> DROP CONSTRAINT IF EXISTS <name> [RESTRICT|CASCADE] */
  1815. | DROP CONSTRAINT IF_P EXISTS name opt_drop_behavior
  1816. {
  1817. AlterTableCmd *n = makeNode(AlterTableCmd);
  1818. n->subtype = AT_DropConstraint;
  1819. n->name = $5;
  1820. n->behavior = $6;
  1821. n->missing_ok = TRUE;
  1822. $$ = (Node *)n;
  1823. }
  1824. /* ALTER TABLE <name> DROP CONSTRAINT <name> [RESTRICT|CASCADE] */
  1825. | DROP CONSTRAINT name opt_drop_behavior
  1826. {
  1827. AlterTableCmd *n = makeNode(AlterTableCmd);
  1828. n->subtype = AT_DropConstraint;
  1829. n->name = $3;
  1830. n->behavior = $4;
  1831. n->missing_ok = FALSE;
  1832. $$ = (Node *)n;
  1833. }
  1834. /* ALTER TABLE <name> SET WITH OIDS */
  1835. | SET WITH OIDS
  1836. {
  1837. AlterTableCmd *n = makeNode(AlterTableCmd);
  1838. n->subtype = AT_AddOids;
  1839. $$ = (Node *)n;
  1840. }
  1841. /* ALTER TABLE <name> SET WITHOUT OIDS */
  1842. | SET WITHOUT OIDS
  1843. {
  1844. AlterTableCmd *n = makeNode(AlterTableCmd);
  1845. n->subtype = AT_DropOids;
  1846. $$ = (Node *)n;
  1847. }
  1848. /* ALTER TABLE <name> CLUSTER ON <indexname> */
  1849. | CLUSTER ON name
  1850. {
  1851. AlterTableCmd *n = makeNode(AlterTableCmd);
  1852. n->subtype = AT_ClusterOn;
  1853. n->name = $3;
  1854. $$ = (Node *)n;
  1855. }
  1856. /* ALTER TABLE <name> SET WITHOUT CLUSTER */
  1857. | SET WITHOUT CLUSTER
  1858. {
  1859. AlterTableCmd *n = makeNode(AlterTableCmd);
  1860. n->subtype = AT_DropCluster;
  1861. n->name = NULL;
  1862. $$ = (Node *)n;
  1863. }
  1864. /* ALTER TABLE <name> ENABLE TRIGGER <trig> */
  1865. | ENABLE_P TRIGGER name
  1866. {
  1867. AlterTableCmd *n = makeNode(AlterTableCmd);
  1868. n->subtype = AT_EnableTrig;
  1869. n->name = $3;
  1870. $$ = (Node *)n;
  1871. }
  1872. /* ALTER TABLE <name> ENABLE ALWAYS TRIGGER <trig> */
  1873. | ENABLE_P ALWAYS TRIGGER name
  1874. {
  1875. AlterTableCmd *n = makeNode(AlterTableCmd);
  1876. n->subtype = AT_EnableAlwaysTrig;
  1877. n->name = $4;
  1878. $$ = (Node *)n;
  1879. }
  1880. /* ALTER TABLE <name> ENABLE REPLICA TRIGGER <trig> */
  1881. | ENABLE_P REPLICA TRIGGER name
  1882. {
  1883. AlterTableCmd *n = makeNode(AlterTableCmd);
  1884. n->subtype = AT_EnableReplicaTrig;
  1885. n->name = $4;
  1886. $$ = (Node *)n;
  1887. }
  1888. /* ALTER TABLE <name> ENABLE TRIGGER ALL */
  1889. | ENABLE_P TRIGGER ALL
  1890. {
  1891. AlterTableCmd *n = makeNode(AlterTableCmd);
  1892. n->subtype = AT_EnableTrigAll;
  1893. $$ = (Node *)n;
  1894. }
  1895. /* ALTER TABLE <name> ENABLE TRIGGER USER */
  1896. | ENABLE_P TRIGGER USER
  1897. {
  1898. AlterTableCmd *n = makeNode(AlterTableCmd);
  1899. n->subtype = AT_EnableTrigUser;
  1900. $$ = (Node *)n;
  1901. }
  1902. /* ALTER TABLE <name> DISABLE TRIGGER <trig> */
  1903. | DISABLE_P TRIGGER name
  1904. {
  1905. AlterTableCmd *n = makeNode(AlterTableCmd);
  1906. n->subtype = AT_DisableTrig;
  1907. n->name = $3;
  1908. $$ = (Node *)n;
  1909. }
  1910. /* ALTER TABLE <name> DISABLE TRIGGER ALL */
  1911. | DISABLE_P TRIGGER ALL
  1912. {
  1913. AlterTableCmd *n = makeNode(AlterTableCmd);
  1914. n->subtype = AT_DisableTrigAll;
  1915. $$ = (Node *)n;
  1916. }
  1917. /* ALTER TABLE <name> DISABLE TRIGGER USER */
  1918. | DISABLE_P TRIGGER USER
  1919. {
  1920. AlterTableCmd *n = makeNode(AlterTableCmd);
  1921. n->subtype = AT_DisableTrigUser;
  1922. $$ = (Node *)n;
  1923. }
  1924. /* ALTER TABLE <name> ENABLE RULE <rule> */
  1925. | ENABLE_P RULE name
  1926. {
  1927. AlterTableCmd *n = makeNode(AlterTableCmd);
  1928. n->subtype = AT_EnableRule;
  1929. n->name = $3;
  1930. $$ = (Node *)n;
  1931. }
  1932. /* ALTER TABLE <name> ENABLE ALWAYS RULE <rule> */
  1933. | ENABLE_P ALWAYS RULE name
  1934. {
  1935. AlterTableCmd *n = makeNode(AlterTableCmd);
  1936. n->subtype = AT_EnableAlwaysRule;
  1937. n->name = $4;
  1938. $$ = (Node *)n;
  1939. }
  1940. /* ALTER TABLE <name> ENABLE REPLICA RULE <rule> */
  1941. | ENABLE_P REPLICA RULE name
  1942. {
  1943. AlterTableCmd *n = makeNode(AlterTableCmd);
  1944. n->subtype = AT_EnableReplicaRule;
  1945. n->name = $4;
  1946. $$ = (Node *)n;
  1947. }
  1948. /* ALTER TABLE <name> DISABLE RULE <rule> */
  1949. | DISABLE_P RULE name
  1950. {
  1951. AlterTableCmd *n = makeNode(AlterTableCmd);
  1952. n->subtype = AT_DisableRule;
  1953. n->name = $3;
  1954. $$ = (Node *)n;
  1955. }
  1956. /* ALTER TABLE <name> INHERIT <parent> */
  1957. | INHERIT qualified_name
  1958. {
  1959. AlterTableCmd *n = makeNode(AlterTableCmd);
  1960. n->subtype = AT_AddInherit;
  1961. n->def = (Node *) $2;
  1962. $$ = (Node *)n;
  1963. }
  1964. /* ALTER TABLE <name> NO INHERIT <parent> */
  1965. | NO INHERIT qualified_name
  1966. {
  1967. AlterTableCmd *n = makeNode(AlterTableCmd);
  1968. n->subtype = AT_DropInherit;
  1969. n->def = (Node *) $3;
  1970. $$ = (Node *)n;
  1971. }
  1972. /* ALTER TABLE <name> OF <type_name> */
  1973. | OF any_name
  1974. {
  1975. AlterTableCmd *n = makeNode(AlterTableCmd);
  1976. TypeName *def = makeTypeNameFromNameList($2);
  1977. def->location = @2;
  1978. n->subtype = AT_AddOf;
  1979. n->def = (Node *) def;
  1980. $$ = (Node *)n;
  1981. }
  1982. /* ALTER TABLE <name> NOT OF */
  1983. | NOT OF
  1984. {
  1985. AlterTableCmd *n = makeNode(AlterTableCmd);
  1986. n->subtype = AT_DropOf;
  1987. $$ = (Node *)n;
  1988. }
  1989. /* ALTER TABLE <name> OWNER TO RoleId */
  1990. | OWNER TO RoleId
  1991. {
  1992. AlterTableCmd *n = makeNode(AlterTableCmd);
  1993. n->subtype = AT_ChangeOwner;
  1994. n->name = $3;
  1995. $$ = (Node *)n;
  1996. }
  1997. /* ALTER TABLE <name> SET TABLESPACE <tablespacename> */
  1998. | SET TABLESPACE name
  1999. {
  2000. AlterTableCmd *n = makeNode(AlterTableCmd);
  2001. n->subtype = AT_SetTableSpace;
  2002. n->name = $3;
  2003. $$ = (Node *)n;
  2004. }
  2005. /* ALTER TABLE <name> SET (...) */
  2006. | SET reloptions
  2007. {
  2008. AlterTableCmd *n = makeNode(AlterTableCmd);
  2009. n->subtype = AT_SetRelOptions;
  2010. n->def = (Node *)$2;
  2011. $$ = (Node *)n;
  2012. }
  2013. /* ALTER TABLE <name> RESET (...) */
  2014. | RESET reloptions
  2015. {
  2016. AlterTableCmd *n = makeNode(AlterTableCmd);
  2017. n->subtype = AT_ResetRelOptions;
  2018. n->def = (Node *)$2;
  2019. $$ = (Node *)n;
  2020. }
  2021. /* ALTER TABLE <name> REPLICA IDENTITY */
  2022. | REPLICA IDENTITY_P replica_identity
  2023. {
  2024. AlterTableCmd *n = makeNode(AlterTableCmd);
  2025. n->subtype = AT_ReplicaIdentity;
  2026. n->def = $3;
  2027. $$ = (Node *)n;
  2028. }
  2029. | alter_generic_options
  2030. {
  2031. AlterTableCmd *n = makeNode(AlterTableCmd);
  2032. n->subtype = AT_GenericOptions;
  2033. n->def = (Node *)$1;
  2034. $$ = (Node *) n;
  2035. }
  2036. ;
  2037. alter_column_default:
  2038. SET DEFAULT a_expr { $$ = $3; }
  2039. | DROP DEFAULT { $$ = NULL; }
  2040. ;
  2041. opt_drop_behavior:
  2042. CASCADE { $$ = DROP_CASCADE; }
  2043. | RESTRICT { $$ = DROP_RESTRICT; }
  2044. | /* EMPTY */ { $$ = DROP_RESTRICT; /* default */ }
  2045. ;
  2046. opt_collate_clause:
  2047. COLLATE any_name
  2048. {
  2049. CollateClause *n = makeNode(CollateClause);
  2050. n->arg = NULL;
  2051. n->collname = $2;
  2052. n->location = @1;
  2053. $$ = (Node *) n;
  2054. }
  2055. | /* EMPTY */ { $$ = NULL; }
  2056. ;
  2057. alter_using:
  2058. USING a_expr { $$ = $2; }
  2059. | /* EMPTY */ { $$ = NULL; }
  2060. ;
  2061. replica_identity:
  2062. NOTHING
  2063. {
  2064. ReplicaIdentityStmt *n = makeNode(ReplicaIdentityStmt);
  2065. n->identity_type = REPLICA_IDENTITY_NOTHING;
  2066. n->name = NULL;
  2067. $$ = (Node *) n;
  2068. }
  2069. | FULL
  2070. {
  2071. ReplicaIdentityStmt *n = makeNode(ReplicaIdentityStmt);
  2072. n->identity_type = REPLICA_IDENTITY_FULL;
  2073. n->name = NULL;
  2074. $$ = (Node *) n;
  2075. }
  2076. | DEFAULT
  2077. {
  2078. ReplicaIdentityStmt *n = makeNode(ReplicaIdentityStmt);
  2079. n->identity_type = REPLICA_IDENTITY_DEFAULT;
  2080. n->name = NULL;
  2081. $$ = (Node *) n;
  2082. }
  2083. | USING INDEX name
  2084. {
  2085. ReplicaIdentityStmt *n = makeNode(ReplicaIdentityStmt);
  2086. n->identity_type = REPLICA_IDENTITY_INDEX;
  2087. n->name = $3;
  2088. $$ = (Node *) n;
  2089. }
  2090. ;
  2091. reloptions:
  2092. '(' reloption_list ')' { $$ = $2; }
  2093. ;
  2094. opt_reloptions: WITH reloptions { $$ = $2; }
  2095. | /* EMPTY */ { $$ = NIL; }
  2096. ;
  2097. reloption_list:
  2098. reloption_elem { $$ = list_make1($1); }
  2099. | reloption_list ',' reloption_elem { $$ = lappend($1, $3); }
  2100. ;
  2101. /* This should match def_elem and also allow qualified names */
  2102. reloption_elem:
  2103. ColLabel '=' def_arg
  2104. {
  2105. $$ = makeDefElem($1, (Node *) $3);
  2106. }
  2107. | ColLabel
  2108. {
  2109. $$ = makeDefElem($1, NULL);
  2110. }
  2111. | ColLabel '.' ColLabel '=' def_arg
  2112. {
  2113. $$ = makeDefElemExtended($1, $3, (Node *) $5,
  2114. DEFELEM_UNSPEC);
  2115. }
  2116. | ColLabel '.' ColLabel
  2117. {
  2118. $$ = makeDefElemExtended($1, $3, NULL, DEFELEM_UNSPEC);
  2119. }
  2120. ;
  2121. /*****************************************************************************
  2122. *
  2123. * ALTER TYPE
  2124. *
  2125. * really variants of the ALTER TABLE subcommands with different spellings
  2126. *****************************************************************************/
  2127. AlterCompositeTypeStmt:
  2128. ALTER TYPE_P any_name alter_type_cmds
  2129. {
  2130. AlterTableStmt *n = makeNode(AlterTableStmt);
  2131. /* can't use qualified_name, sigh */
  2132. n->relation = makeRangeVarFromAnyName($3, @3, yyscanner);
  2133. n->cmds = $4;
  2134. n->relkind = OBJECT_TYPE;
  2135. $$ = (Node *)n;
  2136. }
  2137. ;
  2138. alter_type_cmds:
  2139. alter_type_cmd { $$ = list_make1($1); }
  2140. | alter_type_cmds ',' alter_type_cmd { $$ = lappend($1, $3); }
  2141. ;
  2142. alter_type_cmd:
  2143. /* ALTER TYPE <name> ADD ATTRIBUTE <coldef> [RESTRICT|CASCADE] */
  2144. ADD_P ATTRIBUTE TableFuncElement opt_drop_behavior
  2145. {
  2146. AlterTableCmd *n = makeNode(AlterTableCmd);
  2147. n->subtype = AT_AddColumn;
  2148. n->def = $3;
  2149. n->behavior = $4;
  2150. $$ = (Node *)n;
  2151. }
  2152. /* ALTER TYPE <name> DROP ATTRIBUTE IF EXISTS <attname> [RESTRICT|CASCADE] */
  2153. | DROP ATTRIBUTE IF_P EXISTS ColId opt_drop_behavior
  2154. {
  2155. AlterTableCmd *n = makeNode(AlterTableCmd);
  2156. n->subtype = AT_DropColumn;
  2157. n->name = $5;
  2158. n->behavior = $6;
  2159. n->missing_ok = TRUE;
  2160. $$ = (Node *)n;
  2161. }
  2162. /* ALTER TYPE <name> DROP ATTRIBUTE <attname> [RESTRICT|CASCADE] */
  2163. | DROP ATTRIBUTE ColId opt_drop_behavior
  2164. {
  2165. AlterTableCmd *n = makeNode(AlterTableCmd);
  2166. n->subtype = AT_DropColumn;
  2167. n->name = $3;
  2168. n->behavior = $4;
  2169. n->missing_ok = FALSE;
  2170. $$ = (Node *)n;
  2171. }
  2172. /* ALTER TYPE <name> ALTER ATTRIBUTE <attname> [SET DATA] TYPE <typename> [RESTRICT|CASCADE] */
  2173. | ALTER ATTRIBUTE ColId opt_set_data TYPE_P Typename opt_collate_clause opt_drop_behavior
  2174. {
  2175. AlterTableCmd *n = makeNode(AlterTableCmd);
  2176. ColumnDef *def = makeNode(ColumnDef);
  2177. n->subtype = AT_AlterColumnType;
  2178. n->name = $3;
  2179. n->def = (Node *) def;
  2180. n->behavior = $8;
  2181. /* We only use these fields of the ColumnDef node */
  2182. def->typeName = $6;
  2183. def->collClause = (CollateClause *) $7;
  2184. def->raw_default = NULL;
  2185. def->location = @3;
  2186. $$ = (Node *)n;
  2187. }
  2188. ;
  2189. /*****************************************************************************
  2190. *
  2191. * QUERY :
  2192. * close <portalname>
  2193. *
  2194. *****************************************************************************/
  2195. ClosePortalStmt:
  2196. CLOSE cursor_name
  2197. {
  2198. ClosePortalStmt *n = makeNode(ClosePortalStmt);
  2199. n->portalname = $2;
  2200. $$ = (Node *)n;
  2201. }
  2202. | CLOSE ALL
  2203. {
  2204. ClosePortalStmt *n = makeNode(ClosePortalStmt);
  2205. n->portalname = NULL;
  2206. $$ = (Node *)n;
  2207. }
  2208. ;
  2209. /*****************************************************************************
  2210. *
  2211. * QUERY :
  2212. * COPY relname [(columnList)] FROM/TO file [WITH] [(options)]
  2213. * COPY ( SELECT ... ) TO file [WITH] [(options)]
  2214. *
  2215. * where 'file' can be one of:
  2216. * { PROGRAM 'command' | STDIN | STDOUT | 'filename' }
  2217. *
  2218. * In the preferred syntax the options are comma-separated
  2219. * and use generic identifiers instead of keywords. The pre-9.0
  2220. * syntax had a hard-wired, space-separated set of options.
  2221. *
  2222. * Really old syntax, from versions 7.2 and prior:
  2223. * COPY [ BINARY ] table [ WITH OIDS ] FROM/TO file
  2224. * [ [ USING ] DELIMITERS 'delimiter' ] ]
  2225. * [ WITH NULL AS 'null string' ]
  2226. * This option placement is not supported with COPY (SELECT...).
  2227. *
  2228. *****************************************************************************/
  2229. CopyStmt: COPY opt_binary qualified_name opt_column_list opt_oids
  2230. copy_from opt_program copy_file_name copy_delimiter opt_with copy_options
  2231. {
  2232. CopyStmt *n = makeNode(CopyStmt);
  2233. n->relation = $3;
  2234. n->query = NULL;
  2235. n->attlist = $4;
  2236. n->is_from = $6;
  2237. n->is_program = $7;
  2238. n->filename = $8;
  2239. if (n->is_program && n->filename == NULL)
  2240. ereport(ERROR,
  2241. (errcode(ERRCODE_SYNTAX_ERROR),
  2242. errmsg("STDIN/STDOUT not allowed with PROGRAM"),
  2243. parser_errposition(@8)));
  2244. n->options = NIL;
  2245. /* Concatenate user-supplied flags */
  2246. if ($2)
  2247. n->options = lappend(n->options, $2);
  2248. if ($5)
  2249. n->options = lappend(n->options, $5);
  2250. if ($9)
  2251. n->options = lappend(n->options, $9);
  2252. if ($11)
  2253. n->options = list_concat(n->options, $11);
  2254. $$ = (Node *)n;
  2255. }
  2256. | COPY select_with_parens TO opt_program copy_file_name opt_with copy_options
  2257. {
  2258. CopyStmt *n = makeNode(CopyStmt);
  2259. n->relation = NULL;
  2260. n->query = $2;
  2261. n->attlist = NIL;
  2262. n->is_from = false;
  2263. n->is_program = $4;
  2264. n->filename = $5;
  2265. n->options = $7;
  2266. if (n->is_program && n->filename == NULL)
  2267. ereport(ERROR,
  2268. (errcode(ERRCODE_SYNTAX_ERROR),
  2269. errmsg("STDIN/STDOUT not allowed with PROGRAM"),
  2270. parser_errposition(@5)));
  2271. $$ = (Node *)n;
  2272. }
  2273. ;
  2274. copy_from:
  2275. FROM { $$ = TRUE; }
  2276. | TO { $$ = FALSE; }
  2277. ;
  2278. opt_program:
  2279. PROGRAM { $$ = TRUE; }
  2280. | /* EMPTY */ { $$ = FALSE; }
  2281. ;
  2282. /*
  2283. * copy_file_name NULL indicates stdio is used. Whether stdin or stdout is
  2284. * used depends on the direction. (It really doesn't make sense to copy from
  2285. * stdout. We silently correct the "typo".) - AY 9/94
  2286. */
  2287. copy_file_name:
  2288. Sconst { $$ = $1; }
  2289. | STDIN { $$ = NULL; }
  2290. | STDOUT { $$ = NULL; }
  2291. ;
  2292. copy_options: copy_opt_list { $$ = $1; }
  2293. | '(' copy_generic_opt_list ')' { $$ = $2; }
  2294. ;
  2295. /* old COPY option syntax */
  2296. copy_opt_list:
  2297. copy_opt_list copy_opt_item { $$ = lappend($1, $2); }
  2298. | /* EMPTY */ { $$ = NIL; }
  2299. ;
  2300. copy_opt_item:
  2301. BINARY
  2302. {
  2303. $$ = makeDefElem("format", (Node *)makeString("binary"));
  2304. }
  2305. | OIDS
  2306. {
  2307. $$ = makeDefElem("oids", (Node *)makeInteger(TRUE));
  2308. }
  2309. | FREEZE
  2310. {
  2311. $$ = makeDefElem("freeze", (Node *)makeInteger(TRUE));
  2312. }
  2313. | DELIMITER opt_as Sconst
  2314. {
  2315. $$ = makeDefElem("delimiter", (Node *)makeString($3));
  2316. }
  2317. | NULL_P opt_as Sconst
  2318. {
  2319. $$ = makeDefElem("null", (Node *)makeString($3));
  2320. }
  2321. | CSV
  2322. {
  2323. $$ = makeDefElem("format", (Node *)makeString("csv"));
  2324. }
  2325. | HEADER_P
  2326. {
  2327. $$ = makeDefElem("header", (Node *)makeInteger(TRUE));
  2328. }
  2329. | QUOTE opt_as Sconst
  2330. {
  2331. $$ = makeDefElem("quote", (Node *)makeString($3));
  2332. }
  2333. | ESCAPE opt_as Sconst
  2334. {
  2335. $$ = makeDefElem("escape", (Node *)makeString($3));
  2336. }
  2337. | FORCE QUOTE columnList
  2338. {
  2339. $$ = makeDefElem("force_quote", (Node *)$3);
  2340. }
  2341. | FORCE QUOTE '*'
  2342. {
  2343. $$ = makeDefElem("force_quote", (Node *)makeNode(A_Star));
  2344. }
  2345. | FORCE NOT NULL_P columnList
  2346. {
  2347. $$ = makeDefElem("force_not_null", (Node *)$4);
  2348. }
  2349. | FORCE NULL_P columnList
  2350. {
  2351. $$ = makeDefElem("force_null", (Node *)$3);
  2352. }
  2353. | ENCODING Sconst
  2354. {
  2355. $$ = makeDefElem("encoding", (Node *)makeString($2));
  2356. }
  2357. ;
  2358. /* The following exist for backward compatibility with very old versions */
  2359. opt_binary:
  2360. BINARY
  2361. {
  2362. $$ = makeDefElem("format", (Node *)makeString("binary"));
  2363. }
  2364. | /*EMPTY*/ { $$ = NULL; }
  2365. ;
  2366. opt_oids:
  2367. WITH OIDS
  2368. {
  2369. $$ = makeDefElem("oids", (Node *)makeInteger(TRUE));
  2370. }
  2371. | /*EMPTY*/ { $$ = NULL; }
  2372. ;
  2373. copy_delimiter:
  2374. opt_using DELIMITERS Sconst
  2375. {
  2376. $$ = makeDefElem("delimiter", (Node *)makeString($3));
  2377. }
  2378. | /*EMPTY*/ { $$ = NULL; }
  2379. ;
  2380. opt_using:
  2381. USING {}
  2382. | /*EMPTY*/ {}
  2383. ;
  2384. /* new COPY option syntax */
  2385. copy_generic_opt_list:
  2386. copy_generic_opt_elem
  2387. {
  2388. $$ = list_make1($1);
  2389. }
  2390. | copy_generic_opt_list ',' copy_generic_opt_elem
  2391. {
  2392. $$ = lappend($1, $3);
  2393. }
  2394. ;
  2395. copy_generic_opt_elem:
  2396. ColLabel copy_generic_opt_arg
  2397. {
  2398. $$ = makeDefElem($1, $2);
  2399. }
  2400. ;
  2401. copy_generic_opt_arg:
  2402. opt_boolean_or_string { $$ = (Node *) makeString($1); }
  2403. | NumericOnly { $$ = (Node *) $1; }
  2404. | '*' { $$ = (Node *) makeNode(A_Star); }
  2405. | '(' copy_generic_opt_arg_list ')' { $$ = (Node *) $2; }
  2406. | /* EMPTY */ { $$ = NULL; }
  2407. ;
  2408. copy_generic_opt_arg_list:
  2409. copy_generic_opt_arg_list_item
  2410. {
  2411. $$ = list_make1($1);
  2412. }
  2413. | copy_generic_opt_arg_list ',' copy_generic_opt_arg_list_item
  2414. {
  2415. $$ = lappend($1, $3);
  2416. }
  2417. ;
  2418. /* beware of emitting non-string list elements here; see commands/define.c */
  2419. copy_generic_opt_arg_list_item:
  2420. opt_boolean_or_string { $$ = (Node *) makeString($1); }
  2421. ;
  2422. /*****************************************************************************
  2423. *
  2424. * QUERY :
  2425. * CREATE TABLE relname
  2426. *
  2427. *****************************************************************************/
  2428. CreateStmt: CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')'
  2429. OptInherit OptWith OnCommitOption OptTableSpace
  2430. {
  2431. CreateStmt *n = makeNode(CreateStmt);
  2432. $4->relpersistence = $2;
  2433. n->relation = $4;
  2434. n->tableElts = $6;
  2435. n->inhRelations = $8;
  2436. n->constraints = NIL;
  2437. n->options = $9;
  2438. n->oncommit = $10;
  2439. n->tablespacename = $11;
  2440. n->if_not_exists = false;
  2441. $$ = (Node *)n;
  2442. }
  2443. | CREATE OptTemp TABLE IF_P NOT EXISTS qualified_name '('
  2444. OptTableElementList ')' OptInherit OptWith OnCommitOption
  2445. OptTableSpace
  2446. {
  2447. CreateStmt *n = makeNode(CreateStmt);
  2448. $7->relpersistence = $2;
  2449. n->relation = $7;
  2450. n->tableElts = $9;
  2451. n->inhRelations = $11;
  2452. n->constraints = NIL;
  2453. n->options = $12;
  2454. n->oncommit = $13;
  2455. n->tablespacename = $14;
  2456. n->if_not_exists = true;
  2457. $$ = (Node *)n;
  2458. }
  2459. | CREATE OptTemp TABLE qualified_name OF any_name
  2460. OptTypedTableElementList OptWith OnCommitOption OptTableSpace
  2461. {
  2462. CreateStmt *n = makeNode(CreateStmt);
  2463. $4->relpersistence = $2;
  2464. n->relation = $4;
  2465. n->tableElts = $7;
  2466. n->ofTypename = makeTypeNameFromNameList($6);
  2467. n->ofTypename->location = @6;
  2468. n->constraints = NIL;
  2469. n->options = $8;
  2470. n->oncommit = $9;
  2471. n->tablespacename = $10;
  2472. n->if_not_exists = false;
  2473. $$ = (Node *)n;
  2474. }
  2475. | CREATE OptTemp TABLE IF_P NOT EXISTS qualified_name OF any_name
  2476. OptTypedTableElementList OptWith OnCommitOption OptTableSpace
  2477. {
  2478. CreateStmt *n = makeNode(CreateStmt);
  2479. $7->relpersistence = $2;
  2480. n->relation = $7;
  2481. n->tableElts = $10;
  2482. n->ofTypename = makeTypeNameFromNameList($9);
  2483. n->ofTypename->location = @9;
  2484. n->constraints = NIL;
  2485. n->options = $11;
  2486. n->oncommit = $12;
  2487. n->tablespacename = $13;
  2488. n->if_not_exists = true;
  2489. $$ = (Node *)n;
  2490. }
  2491. ;
  2492. /*
  2493. * Redundancy here is needed to avoid shift/reduce conflicts,
  2494. * since TEMP is not a reserved word. See also OptTempTableName.
  2495. *
  2496. * NOTE: we accept both GLOBAL and LOCAL options. They currently do nothing,
  2497. * but future versions might consider GLOBAL to request SQL-spec-compliant
  2498. * temp table behavior, so warn about that. Since we have no modules the
  2499. * LOCAL keyword is really meaningless; furthermore, some other products
  2500. * implement LOCAL as meaning the same as our default temp table behavior,
  2501. * so we'll probably continue to treat LOCAL as a noise word.
  2502. */
  2503. OptTemp: TEMPORARY { $$ = RELPERSISTENCE_TEMP; }
  2504. | TEMP { $$ = RELPERSISTENCE_TEMP; }
  2505. | LOCAL TEMPORARY { $$ = RELPERSISTENCE_TEMP; }
  2506. | LOCAL TEMP { $$ = RELPERSISTENCE_TEMP; }
  2507. | GLOBAL TEMPORARY
  2508. {
  2509. ereport(WARNING,
  2510. (errmsg("GLOBAL is deprecated in temporary table creation"),
  2511. parser_errposition(@1)));
  2512. $$ = RELPERSISTENCE_TEMP;
  2513. }
  2514. | GLOBAL TEMP
  2515. {
  2516. ereport(WARNING,
  2517. (errmsg("GLOBAL is deprecated in temporary table creation"),
  2518. parser_errposition(@1)));
  2519. $$ = RELPERSISTENCE_TEMP;
  2520. }
  2521. | UNLOGGED { $$ = RELPERSISTENCE_UNLOGGED; }
  2522. | /*EMPTY*/ { $$ = RELPERSISTENCE_PERMANENT; }
  2523. ;
  2524. OptTableElementList:
  2525. TableElementList { $$ = $1; }
  2526. | /*EMPTY*/ { $$ = NIL; }
  2527. ;
  2528. OptTypedTableElementList:
  2529. '(' TypedTableElementList ')' { $$ = $2; }
  2530. | /*EMPTY*/ { $$ = NIL; }
  2531. ;
  2532. TableElementList:
  2533. TableElement
  2534. {
  2535. $$ = list_make1($1);
  2536. }
  2537. | TableElementList ',' TableElement
  2538. {
  2539. $$ = lappend($1, $3);
  2540. }
  2541. ;
  2542. TypedTableElementList:
  2543. TypedTableElement
  2544. {
  2545. $$ = list_make1($1);
  2546. }
  2547. | TypedTableElementList ',' TypedTableElement
  2548. {
  2549. $$ = lappend($1, $3);
  2550. }
  2551. ;
  2552. TableElement:
  2553. columnDef { $$ = $1; }
  2554. | TableLikeClause { $$ = $1; }
  2555. | TableConstraint { $$ = $1; }
  2556. ;
  2557. TypedTableElement:
  2558. columnOptions { $$ = $1; }
  2559. | TableConstraint { $$ = $1; }
  2560. ;
  2561. columnDef: ColId Typename create_generic_options ColQualList
  2562. {
  2563. ColumnDef *n = makeNode(ColumnDef);
  2564. n->colname = $1;
  2565. n->typeName = $2;
  2566. n->inhcount = 0;
  2567. n->is_local = true;
  2568. n->is_not_null = false;
  2569. n->is_from_type = false;
  2570. n->storage = 0;
  2571. n->raw_default = NULL;
  2572. n->cooked_default = NULL;
  2573. n->collOid = InvalidOid;
  2574. n->fdwoptions = $3;
  2575. SplitColQualList($4, &n->constraints, &n->collClause,
  2576. yyscanner);
  2577. n->location = @1;
  2578. $$ = (Node *)n;
  2579. }
  2580. ;
  2581. columnOptions: ColId WITH OPTIONS ColQualList
  2582. {
  2583. ColumnDef *n = makeNode(ColumnDef);
  2584. n->colname = $1;
  2585. n->typeName = NULL;
  2586. n->inhcount = 0;
  2587. n->is_local = true;
  2588. n->is_not_null = false;
  2589. n->is_from_type = false;
  2590. n->storage = 0;
  2591. n->raw_default = NULL;
  2592. n->cooked_default = NULL;
  2593. n->collOid = InvalidOid;
  2594. SplitColQualList($4, &n->constraints, &n->collClause,
  2595. yyscanner);
  2596. n->location = @1;
  2597. $$ = (Node *)n;
  2598. }
  2599. ;
  2600. ColQualList:
  2601. ColQualList ColConstraint { $$ = lappend($1, $2); }
  2602. | /*EMPTY*/ { $$ = NIL; }
  2603. ;
  2604. ColConstraint:
  2605. CONSTRAINT name ColConstraintElem
  2606. {
  2607. Constraint *n = (Constraint *) $3;
  2608. Assert(IsA(n, Constraint));
  2609. n->conname = $2;
  2610. n->location = @1;
  2611. $$ = (Node *) n;
  2612. }
  2613. | ColConstraintElem { $$ = $1; }
  2614. | ConstraintAttr { $$ = $1; }
  2615. | COLLATE any_name
  2616. {
  2617. /*
  2618. * Note: the CollateClause is momentarily included in
  2619. * the list built by ColQualList, but we split it out
  2620. * again in SplitColQualList.
  2621. */
  2622. CollateClause *n = makeNode(CollateClause);
  2623. n->arg = NULL;
  2624. n->collname = $2;
  2625. n->location = @1;
  2626. $$ = (Node *) n;
  2627. }
  2628. ;
  2629. /* DEFAULT NULL is already the default for Postgres.
  2630. * But define it here and carry it forward into the system
  2631. * to make it explicit.
  2632. * - thomas 1998-09-13
  2633. *
  2634. * WITH NULL and NULL are not SQL-standard syntax elements,
  2635. * so leave them out. Use DEFAULT NULL to explicitly indicate
  2636. * that a column may have that value. WITH NULL leads to
  2637. * shift/reduce conflicts with WITH TIME ZONE anyway.
  2638. * - thomas 1999-01-08
  2639. *
  2640. * DEFAULT expression must be b_expr not a_expr to prevent shift/reduce
  2641. * conflict on NOT (since NOT might start a subsequent NOT NULL constraint,
  2642. * or be part of a_expr NOT LIKE or similar constructs).
  2643. */
  2644. ColConstraintElem:
  2645. NOT NULL_P
  2646. {
  2647. Constraint *n = makeNode(Constraint);
  2648. n->contype = CONSTR_NOTNULL;
  2649. n->location = @1;
  2650. $$ = (Node *)n;
  2651. }
  2652. | NULL_P
  2653. {
  2654. Constraint *n = makeNode(Constraint);
  2655. n->contype = CONSTR_NULL;
  2656. n->location = @1;
  2657. $$ = (Node *)n;
  2658. }
  2659. | UNIQUE opt_definition OptConsTableSpace
  2660. {
  2661. Constraint *n = makeNode(Constraint);
  2662. n->contype = CONSTR_UNIQUE;
  2663. n->location = @1;
  2664. n->keys = NULL;
  2665. n->options = $2;
  2666. n->indexname = NULL;
  2667. n->indexspace = $3;
  2668. $$ = (Node *)n;
  2669. }
  2670. | PRIMARY KEY opt_definition OptConsTableSpace
  2671. {
  2672. Constraint *n = makeNode(Constraint);
  2673. n->contype = CONSTR_PRIMARY;
  2674. n->location = @1;
  2675. n->keys = NULL;
  2676. n->options = $3;
  2677. n->indexname = NULL;
  2678. n->indexspace = $4;
  2679. $$ = (Node *)n;
  2680. }
  2681. | CHECK '(' a_expr ')' opt_no_inherit
  2682. {
  2683. Constraint *n = makeNode(Constraint);
  2684. n->contype = CONSTR_CHECK;
  2685. n->location = @1;
  2686. n->is_no_inherit = $5;
  2687. n->raw_expr = $3;
  2688. n->cooked_expr = NULL;
  2689. $$ = (Node *)n;
  2690. }
  2691. | DEFAULT b_expr
  2692. {
  2693. Constraint *n = makeNode(Constraint);
  2694. n->contype = CONSTR_DEFAULT;
  2695. n->location = @1;
  2696. n->raw_expr = $2;
  2697. n->cooked_expr = NULL;
  2698. $$ = (Node *)n;
  2699. }
  2700. | REFERENCES qualified_name opt_column_list key_match key_actions
  2701. {
  2702. Constraint *n = makeNode(Constraint);
  2703. n->contype = CONSTR_FOREIGN;
  2704. n->location = @1;
  2705. n->pktable = $2;
  2706. n->fk_attrs = NIL;
  2707. n->pk_attrs = $3;
  2708. n->fk_matchtype = $4;
  2709. n->fk_upd_action = (char) ($5 >> 8);
  2710. n->fk_del_action = (char) ($5 & 0xFF);
  2711. n->skip_validation = false;
  2712. n->initially_valid = true;
  2713. $$ = (Node *)n;
  2714. }
  2715. ;
  2716. /*
  2717. * ConstraintAttr represents constraint attributes, which we parse as if
  2718. * they were independent constraint clauses, in order to avoid shift/reduce
  2719. * conflicts (since NOT might start either an independent NOT NULL clause
  2720. * or an attribute). parse_utilcmd.c is responsible for attaching the
  2721. * attribute information to the preceding "real" constraint node, and for
  2722. * complaining if attribute clauses appear in the wrong place or wrong
  2723. * combinations.
  2724. *
  2725. * See also ConstraintAttributeSpec, which can be used in places where
  2726. * there is no parsing conflict. (Note: currently, NOT VALID and NO INHERIT
  2727. * are allowed clauses in ConstraintAttributeSpec, but not here. Someday we
  2728. * might need to allow them here too, but for the moment it doesn't seem
  2729. * useful in the statements that use ConstraintAttr.)
  2730. */
  2731. ConstraintAttr:
  2732. DEFERRABLE
  2733. {
  2734. Constraint *n = makeNode(Constraint);
  2735. n->contype = CONSTR_ATTR_DEFERRABLE;
  2736. n->location = @1;
  2737. $$ = (Node *)n;
  2738. }
  2739. | NOT DEFERRABLE
  2740. {
  2741. Constraint *n = makeNode(Constraint);
  2742. n->contype = CONSTR_ATTR_NOT_DEFERRABLE;
  2743. n->location = @1;
  2744. $$ = (Node *)n;
  2745. }
  2746. | INITIALLY DEFERRED
  2747. {
  2748. Constraint *n = makeNode(Constraint);
  2749. n->contype = CONSTR_ATTR_DEFERRED;
  2750. n->location = @1;
  2751. $$ = (Node *)n;
  2752. }
  2753. | INITIALLY IMMEDIATE
  2754. {
  2755. Constraint *n = makeNode(Constraint);
  2756. n->contype = CONSTR_ATTR_IMMEDIATE;
  2757. n->location = @1;
  2758. $$ = (Node *)n;
  2759. }
  2760. ;
  2761. TableLikeClause:
  2762. LIKE qualified_name TableLikeOptionList
  2763. {
  2764. TableLikeClause *n = makeNode(TableLikeClause);
  2765. n->relation = $2;
  2766. n->options = $3;
  2767. $$ = (Node *)n;
  2768. }
  2769. ;
  2770. TableLikeOptionList:
  2771. TableLikeOptionList INCLUDING TableLikeOption { $$ = $1 | $3; }
  2772. | TableLikeOptionList EXCLUDING TableLikeOption { $$ = $1 & ~$3; }
  2773. | /* EMPTY */ { $$ = 0; }
  2774. ;
  2775. TableLikeOption:
  2776. DEFAULTS { $$ = CREATE_TABLE_LIKE_DEFAULTS; }
  2777. | CONSTRAINTS { $$ = CREATE_TABLE_LIKE_CONSTRAINTS; }
  2778. | INDEXES { $$ = CREATE_TABLE_LIKE_INDEXES; }
  2779. | STORAGE { $$ = CREATE_TABLE_LIKE_STORAGE; }
  2780. | COMMENTS { $$ = CREATE_TABLE_LIKE_COMMENTS; }
  2781. | ALL { $$ = CREATE_TABLE_LIKE_ALL; }
  2782. ;
  2783. /* ConstraintElem specifies constraint syntax which is not embedded into
  2784. * a column definition. ColConstraintElem specifies the embedded form.
  2785. * - thomas 1997-12-03
  2786. */
  2787. TableConstraint:
  2788. CONSTRAINT name ConstraintElem
  2789. {
  2790. Constraint *n = (Constraint *) $3;
  2791. Assert(IsA(n, Constraint));
  2792. n->conname = $2;
  2793. n->location = @1;
  2794. $$ = (Node *) n;
  2795. }
  2796. | ConstraintElem { $$ = $1; }
  2797. ;
  2798. ConstraintElem:
  2799. CHECK '(' a_expr ')' ConstraintAttributeSpec
  2800. {
  2801. Constraint *n = makeNode(Constraint);
  2802. n->contype = CONSTR_CHECK;
  2803. n->location = @1;
  2804. n->raw_expr = $3;
  2805. n->cooked_expr = NULL;
  2806. processCASbits($5, @5, "CHECK",
  2807. NULL, NULL, &n->skip_validation,
  2808. &n->is_no_inherit, yyscanner);
  2809. n->initially_valid = !n->skip_validation;
  2810. $$ = (Node *)n;
  2811. }
  2812. | UNIQUE '(' columnList ')' opt_definition OptConsTableSpace
  2813. ConstraintAttributeSpec
  2814. {
  2815. Constraint *n = makeNode(Constraint);
  2816. n->contype = CONSTR_UNIQUE;
  2817. n->location = @1;
  2818. n->keys = $3;
  2819. n->options = $5;
  2820. n->indexname = NULL;
  2821. n->indexspace = $6;
  2822. processCASbits($7, @7, "UNIQUE",
  2823. &n->deferrable, &n->initdeferred, NULL,
  2824. NULL, yyscanner);
  2825. $$ = (Node *)n;
  2826. }
  2827. | UNIQUE ExistingIndex ConstraintAttributeSpec
  2828. {
  2829. Constraint *n = makeNode(Constraint);
  2830. n->contype = CONSTR_UNIQUE;
  2831. n->location = @1;
  2832. n->keys = NIL;
  2833. n->options = NIL;
  2834. n->indexname = $2;
  2835. n->indexspace = NULL;
  2836. processCASbits($3, @3, "UNIQUE",
  2837. &n->deferrable, &n->initdeferred, NULL,
  2838. NULL, yyscanner);
  2839. $$ = (Node *)n;
  2840. }
  2841. | PRIMARY KEY '(' columnList ')' opt_definition OptConsTableSpace
  2842. ConstraintAttributeSpec
  2843. {
  2844. Constraint *n = makeNode(Constraint);
  2845. n->contype = CONSTR_PRIMARY;
  2846. n->location = @1;
  2847. n->keys = $4;
  2848. n->options = $6;
  2849. n->indexname = NULL;
  2850. n->indexspace = $7;
  2851. processCASbits($8, @8, "PRIMARY KEY",
  2852. &n->deferrable, &n->initdeferred, NULL,
  2853. NULL, yyscanner);
  2854. $$ = (Node *)n;
  2855. }
  2856. | PRIMARY KEY ExistingIndex ConstraintAttributeSpec
  2857. {
  2858. Constraint *n = makeNode(Constraint);
  2859. n->contype = CONSTR_PRIMARY;
  2860. n->location = @1;
  2861. n->keys = NIL;
  2862. n->options = NIL;
  2863. n->indexname = $3;
  2864. n->indexspace = NULL;
  2865. processCASbits($4, @4, "PRIMARY KEY",
  2866. &n->deferrable, &n->initdeferred, NULL,
  2867. NULL, yyscanner);
  2868. $$ = (Node *)n;
  2869. }
  2870. | EXCLUDE access_method_clause '(' ExclusionConstraintList ')'
  2871. opt_definition OptConsTableSpace ExclusionWhereClause
  2872. ConstraintAttributeSpec
  2873. {
  2874. Constraint *n = makeNode(Constraint);
  2875. n->contype = CONSTR_EXCLUSION;
  2876. n->location = @1;
  2877. n->access_method = $2;
  2878. n->exclusions = $4;
  2879. n->options = $6;
  2880. n->indexname = NULL;
  2881. n->indexspace = $7;
  2882. n->where_clause = $8;
  2883. processCASbits($9, @9, "EXCLUDE",
  2884. &n->deferrable, &n->initdeferred, NULL,
  2885. NULL, yyscanner);
  2886. $$ = (Node *)n;
  2887. }
  2888. | FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
  2889. opt_column_list key_match key_actions ConstraintAttributeSpec
  2890. {
  2891. Constraint *n = makeNode(Constraint);
  2892. n->contype = CONSTR_FOREIGN;
  2893. n->location = @1;
  2894. n->pktable = $7;
  2895. n->fk_attrs = $4;
  2896. n->pk_attrs = $8;
  2897. n->fk_matchtype = $9;
  2898. n->fk_upd_action = (char) ($10 >> 8);
  2899. n->fk_del_action = (char) ($10 & 0xFF);
  2900. processCASbits($11, @11, "FOREIGN KEY",
  2901. &n->deferrable, &n->initdeferred,
  2902. &n->skip_validation, NULL,
  2903. yyscanner);
  2904. n->initially_valid = !n->skip_validation;
  2905. $$ = (Node *)n;
  2906. }
  2907. ;
  2908. opt_no_inherit: NO INHERIT { $$ = TRUE; }
  2909. | /* EMPTY */ { $$ = FALSE; }
  2910. ;
  2911. opt_column_list:
  2912. '(' columnList ')' { $$ = $2; }
  2913. | /*EMPTY*/ { $$ = NIL; }
  2914. ;
  2915. columnList:
  2916. columnElem { $$ = list_make1($1); }
  2917. | columnList ',' columnElem { $$ = lappend($1, $3); }
  2918. ;
  2919. columnElem: ColId
  2920. {
  2921. $$ = (Node *) makeString($1);
  2922. }
  2923. ;
  2924. key_match: MATCH FULL
  2925. {
  2926. $$ = FKCONSTR_MATCH_FULL;
  2927. }
  2928. | MATCH PARTIAL
  2929. {
  2930. ereport(ERROR,
  2931. (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
  2932. errmsg("MATCH PARTIAL not yet implemented"),
  2933. parser_errposition(@1)));
  2934. $$ = FKCONSTR_MATCH_PARTIAL;
  2935. }
  2936. | MATCH SIMPLE
  2937. {
  2938. $$ = FKCONSTR_MATCH_SIMPLE;
  2939. }
  2940. | /*EMPTY*/
  2941. {
  2942. $$ = FKCONSTR_MATCH_SIMPLE;
  2943. }
  2944. ;
  2945. ExclusionConstraintList:
  2946. ExclusionConstraintElem { $$ = list_make1($1); }
  2947. | ExclusionConstraintList ',' ExclusionConstraintElem
  2948. { $$ = lappend($1, $3); }
  2949. ;
  2950. ExclusionConstraintElem: index_elem WITH any_operator
  2951. {
  2952. $$ = list_make2($1, $3);
  2953. }
  2954. /* allow OPERATOR() decoration for the benefit of ruleutils.c */
  2955. | index_elem WITH OPERATOR '(' any_operator ')'
  2956. {
  2957. $$ = list_make2($1, $5);
  2958. }
  2959. ;
  2960. ExclusionWhereClause:
  2961. WHERE '(' a_expr ')' { $$ = $3; }
  2962. | /*EMPTY*/ { $$ = NULL; }
  2963. ;
  2964. /*
  2965. * We combine the update and delete actions into one value temporarily
  2966. * for simplicity of parsing, and then break them down again in the
  2967. * calling production. update is in the left 8 bits, delete in the right.
  2968. * Note that NOACTION is the default.
  2969. */
  2970. key_actions:
  2971. key_update
  2972. { $$ = ($1 << 8) | (FKCONSTR_ACTION_NOACTION & 0xFF); }
  2973. | key_delete
  2974. { $$ = (FKCONSTR_ACTION_NOACTION << 8) | ($1 & 0xFF); }
  2975. | key_update key_delete
  2976. { $$ = ($1 << 8) | ($2 & 0xFF); }
  2977. | key_delete key_update
  2978. { $$ = ($2 << 8) | ($1 & 0xFF); }
  2979. | /*EMPTY*/
  2980. { $$ = (FKCONSTR_ACTION_NOACTION << 8) | (FKCONSTR_ACTION_NOACTION & 0xFF); }
  2981. ;
  2982. key_update: ON UPDATE key_action { $$ = $3; }
  2983. ;
  2984. key_delete: ON DELETE_P key_action { $$ = $3; }
  2985. ;
  2986. key_action:
  2987. NO ACTION { $$ = FKCONSTR_ACTION_NOACTION; }
  2988. | RESTRICT { $$ = FKCONSTR_ACTION_RESTRICT; }
  2989. | CASCADE { $$ = FKCONSTR_ACTION_CASCADE; }
  2990. | SET NULL_P { $$ = FKCONSTR_ACTION_SETNULL; }
  2991. | SET DEFAULT { $$ = FKCONSTR_ACTION_SETDEFAULT; }
  2992. ;
  2993. OptInherit: INHERITS '(' qualified_name_list ')' { $$ = $3; }
  2994. | /*EMPTY*/ { $$ = NIL; }
  2995. ;
  2996. /* WITH (options) is preferred, WITH OIDS and WITHOUT OIDS are legacy forms */
  2997. OptWith:
  2998. WITH reloptions { $$ = $2; }
  2999. | WITH OIDS { $$ = list_make1(defWithOids(true)); }
  3000. | WITHOUT OIDS { $$ = list_make1(defWithOids(false)); }
  3001. | /*EMPTY*/ { $$ = NIL; }
  3002. ;
  3003. OnCommitOption: ON COMMIT DROP { $$ = ONCOMMIT_DROP; }
  3004. | ON COMMIT DELETE_P ROWS { $$ = ONCOMMIT_DELETE_ROWS; }
  3005. | ON COMMIT PRESERVE ROWS { $$ = ONCOMMIT_PRESERVE_ROWS; }
  3006. | /*EMPTY*/ { $$ = ONCOMMIT_NOOP; }
  3007. ;
  3008. OptTableSpace: TABLESPACE name { $$ = $2; }
  3009. | /*EMPTY*/ { $$ = NULL; }
  3010. ;
  3011. OptConsTableSpace: USING INDEX TABLESPACE name { $$ = $4; }
  3012. | /*EMPTY*/ { $$ = NULL; }
  3013. ;
  3014. ExistingIndex: USING INDEX index_name { $$ = $3; }
  3015. ;
  3016. /*****************************************************************************
  3017. *
  3018. * QUERY :
  3019. * CREATE TABLE relname AS SelectStmt [ WITH [NO] DATA ]
  3020. *
  3021. *
  3022. * Note: SELECT ... INTO is a now-deprecated alternative for this.
  3023. *
  3024. *****************************************************************************/
  3025. CreateAsStmt:
  3026. CREATE OptTemp TABLE create_as_target AS SelectStmt opt_with_data
  3027. {
  3028. CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt);
  3029. ctas->query = $6;
  3030. ctas->into = $4;
  3031. ctas->relkind = OBJECT_TABLE;
  3032. ctas->is_select_into = false;
  3033. /* cram additional flags into the IntoClause */
  3034. $4->rel->relpersistence = $2;
  3035. $4->skipData = !($7);
  3036. $$ = (Node *) ctas;
  3037. }
  3038. ;
  3039. create_as_target:
  3040. qualified_name opt_column_list OptWith OnCommitOption OptTableSpace
  3041. {
  3042. $$ = makeNode(IntoClause);
  3043. $$->rel = $1;
  3044. $$->colNames = $2;
  3045. $$->options = $3;
  3046. $$->onCommit = $4;
  3047. $$->tableSpaceName = $5;
  3048. $$->viewQuery = NULL;
  3049. $$->skipData = false; /* might get changed later */
  3050. }
  3051. ;
  3052. opt_with_data:
  3053. WITH DATA_P { $$ = TRUE; }
  3054. | WITH NO DATA_P { $$ = FALSE; }
  3055. | /*EMPTY*/ { $$ = TRUE; }
  3056. ;
  3057. /*****************************************************************************
  3058. *
  3059. * QUERY :
  3060. * CREATE MATERIALIZED VIEW relname AS SelectStmt
  3061. *
  3062. *****************************************************************************/
  3063. CreateMatViewStmt:
  3064. CREATE OptNoLog MATERIALIZED VIEW create_mv_target AS SelectStmt opt_with_data
  3065. {
  3066. CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt);
  3067. ctas->query = $7;
  3068. ctas->into = $5;
  3069. ctas->relkind = OBJECT_MATVIEW;
  3070. ctas->is_select_into = false;
  3071. /* cram additional flags into the IntoClause */
  3072. $5->rel->relpersistence = $2;
  3073. $5->skipData = !($8);
  3074. $$ = (Node *) ctas;
  3075. }
  3076. ;
  3077. create_mv_target:
  3078. qualified_name opt_column_list opt_reloptions OptTableSpace
  3079. {
  3080. $$ = makeNode(IntoClause);
  3081. $$->rel = $1;
  3082. $$->colNames = $2;
  3083. $$->options = $3;
  3084. $$->onCommit = ONCOMMIT_NOOP;
  3085. $$->tableSpaceName = $4;
  3086. $$->viewQuery = NULL; /* filled at analysis time */
  3087. $$->skipData = false; /* might get changed later */
  3088. }
  3089. ;
  3090. OptNoLog: UNLOGGED { $$ = RELPERSISTENCE_UNLOGGED; }
  3091. | /*EMPTY*/ { $$ = RELPERSISTENCE_PERMANENT; }
  3092. ;
  3093. /*****************************************************************************
  3094. *
  3095. * QUERY :
  3096. * REFRESH MATERIALIZED VIEW qualified_name
  3097. *
  3098. *****************************************************************************/
  3099. RefreshMatViewStmt:
  3100. REFRESH MATERIALIZED VIEW opt_concurrently qualified_name opt_with_data
  3101. {
  3102. RefreshMatViewStmt *n = makeNode(RefreshMatViewStmt);
  3103. n->concurrent = $4;
  3104. n->relation = $5;
  3105. n->skipData = !($6);
  3106. $$ = (Node *) n;
  3107. }
  3108. ;
  3109. /*****************************************************************************
  3110. *
  3111. * QUERY :
  3112. * CREATE SEQUENCE seqname
  3113. * ALTER SEQUENCE seqname
  3114. *
  3115. *****************************************************************************/
  3116. CreateSeqStmt:
  3117. CREATE OptTemp SEQUENCE qualified_name OptSeqOptList
  3118. {
  3119. CreateSeqStmt *n = makeNode(CreateSeqStmt);
  3120. $4->relpersistence = $2;
  3121. n->sequence = $4;
  3122. n->options = $5;
  3123. n->ownerId = InvalidOid;
  3124. $$ = (Node *)n;
  3125. }
  3126. ;
  3127. AlterSeqStmt:
  3128. ALTER SEQUENCE qualified_name SeqOptList
  3129. {
  3130. AlterSeqStmt *n = makeNode(AlterSeqStmt);
  3131. n->sequence = $3;
  3132. n->options = $4;
  3133. n->missing_ok = false;
  3134. $$ = (Node *)n;
  3135. }
  3136. | ALTER SEQUENCE IF_P EXISTS qualified_name SeqOptList
  3137. {
  3138. AlterSeqStmt *n = makeNode(AlterSeqStmt);
  3139. n->sequence = $5;
  3140. n->options = $6;
  3141. n->missing_ok = true;
  3142. $$ = (Node *)n;
  3143. }
  3144. ;
  3145. OptSeqOptList: SeqOptList { $$ = $1; }
  3146. | /*EMPTY*/ { $$ = NIL; }
  3147. ;
  3148. SeqOptList: SeqOptElem { $$ = list_make1($1); }
  3149. | SeqOptList SeqOptElem { $$ = lappend($1, $2); }
  3150. ;
  3151. SeqOptElem: CACHE NumericOnly
  3152. {
  3153. $$ = makeDefElem("cache", (Node *)$2);
  3154. }
  3155. | CYCLE
  3156. {
  3157. $$ = makeDefElem("cycle", (Node *)makeInteger(TRUE));
  3158. }
  3159. | NO CYCLE
  3160. {
  3161. $$ = makeDefElem("cycle", (Node *)makeInteger(FALSE));
  3162. }
  3163. | INCREMENT opt_by NumericOnly
  3164. {
  3165. $$ = makeDefElem("increment", (Node *)$3);
  3166. }
  3167. | MAXVALUE NumericOnly
  3168. {
  3169. $$ = makeDefElem("maxvalue", (Node *)$2);
  3170. }
  3171. | MINVALUE NumericOnly
  3172. {
  3173. $$ = makeDefElem("minvalue", (Node *)$2);
  3174. }
  3175. | NO MAXVALUE
  3176. {
  3177. $$ = makeDefElem("maxvalue", NULL);
  3178. }
  3179. | NO MINVALUE
  3180. {
  3181. $$ = makeDefElem("minvalue", NULL);
  3182. }
  3183. | OWNED BY any_name
  3184. {
  3185. $$ = makeDefElem("owned_by", (Node *)$3);
  3186. }
  3187. | START opt_with NumericOnly
  3188. {
  3189. $$ = makeDefElem("start", (Node *)$3);
  3190. }
  3191. | RESTART
  3192. {
  3193. $$ = makeDefElem("restart", NULL);
  3194. }
  3195. | RESTART opt_with NumericOnly
  3196. {
  3197. $$ = makeDefElem("restart", (Node *)$3);
  3198. }
  3199. ;
  3200. opt_by: BY {}
  3201. | /* empty */ {}
  3202. ;
  3203. NumericOnly:
  3204. FCONST { $$ = makeFloat($1); }
  3205. | '-' FCONST
  3206. {
  3207. $$ = makeFloat($2);
  3208. doNegateFloat($$);
  3209. }
  3210. | SignedIconst { $$ = makeInteger($1); }
  3211. ;
  3212. NumericOnly_list: NumericOnly { $$ = list_make1($1); }
  3213. | NumericOnly_list ',' NumericOnly { $$ = lappend($1, $3); }
  3214. ;
  3215. /*****************************************************************************
  3216. *
  3217. * QUERIES :
  3218. * CREATE [OR REPLACE] [TRUSTED] [PROCEDURAL] LANGUAGE ...
  3219. * DROP [PROCEDURAL] LANGUAGE ...
  3220. *
  3221. *****************************************************************************/
  3222. CreatePLangStmt:
  3223. CREATE opt_or_replace opt_trusted opt_procedural LANGUAGE NonReservedWord_or_Sconst
  3224. {
  3225. CreatePLangStmt *n = makeNode(CreatePLangStmt);
  3226. n->replace = $2;
  3227. n->plname = $6;
  3228. /* parameters are all to be supplied by system */
  3229. n->plhandler = NIL;
  3230. n->plinline = NIL;
  3231. n->plvalidator = NIL;
  3232. n->pltrusted = false;
  3233. $$ = (Node *)n;
  3234. }
  3235. | CREATE opt_or_replace opt_trusted opt_procedural LANGUAGE NonReservedWord_or_Sconst
  3236. HANDLER handler_name opt_inline_handler opt_validator
  3237. {
  3238. CreatePLangStmt *n = makeNode(CreatePLangStmt);
  3239. n->replace = $2;
  3240. n->plname = $6;
  3241. n->plhandler = $8;
  3242. n->plinline = $9;
  3243. n->plvalidator = $10;
  3244. n->pltrusted = $3;
  3245. $$ = (Node *)n;
  3246. }
  3247. ;
  3248. opt_trusted:
  3249. TRUSTED { $$ = TRUE; }
  3250. | /*EMPTY*/ { $$ = FALSE; }
  3251. ;
  3252. /* This ought to be just func_name, but that causes reduce/reduce conflicts
  3253. * (CREATE LANGUAGE is the only place where func_name isn't followed by '(').
  3254. * Work around by using simple names, instead.
  3255. */
  3256. handler_name:
  3257. name { $$ = list_make1(makeString($1)); }
  3258. | name attrs { $$ = lcons(makeString($1), $2); }
  3259. ;
  3260. opt_inline_handler:
  3261. INLINE_P handler_name { $$ = $2; }
  3262. | /*EMPTY*/ { $$ = NIL; }
  3263. ;
  3264. validator_clause:
  3265. VALIDATOR handler_name { $$ = $2; }
  3266. | NO VALIDATOR { $$ = NIL; }
  3267. ;
  3268. opt_validator:
  3269. validator_clause { $$ = $1; }
  3270. | /*EMPTY*/ { $$ = NIL; }
  3271. ;
  3272. DropPLangStmt:
  3273. DROP opt_procedural LANGUAGE NonReservedWord_or_Sconst opt_drop_behavior
  3274. {
  3275. DropStmt *n = makeNode(DropStmt);
  3276. n->removeType = OBJECT_LANGUAGE;
  3277. n->objects = list_make1(list_make1(makeString($4)));
  3278. n->arguments = NIL;
  3279. n->behavior = $5;
  3280. n->missing_ok = false;
  3281. n->concurrent = false;
  3282. $$ = (Node *)n;
  3283. }
  3284. | DROP opt_procedural LANGUAGE IF_P EXISTS NonReservedWord_or_Sconst opt_drop_behavior
  3285. {
  3286. DropStmt *n = makeNode(DropStmt);
  3287. n->removeType = OBJECT_LANGUAGE;
  3288. n->objects = list_make1(list_make1(makeString($6)));
  3289. n->behavior = $7;
  3290. n->missing_ok = true;
  3291. n->concurrent = false;
  3292. $$ = (Node *)n;
  3293. }
  3294. ;
  3295. opt_procedural:
  3296. PROCEDURAL {}
  3297. | /*EMPTY*/ {}
  3298. ;
  3299. /*****************************************************************************
  3300. *
  3301. * QUERY:
  3302. * CREATE TABLESPACE tablespace LOCATION '/path/to/tablespace/'
  3303. *
  3304. *****************************************************************************/
  3305. CreateTableSpaceStmt: CREATE TABLESPACE name OptTableSpaceOwner LOCATION Sconst opt_reloptions
  3306. {
  3307. CreateTableSpaceStmt *n = makeNode(CreateTableSpaceStmt);
  3308. n->tablespacename = $3;
  3309. n->owner = $4;
  3310. n->location = $6;
  3311. n->options = $7;
  3312. $$ = (Node *) n;
  3313. }
  3314. ;
  3315. OptTableSpaceOwner: OWNER name { $$ = $2; }
  3316. | /*EMPTY */ { $$ = NULL; }
  3317. ;
  3318. /*****************************************************************************
  3319. *
  3320. * QUERY :
  3321. * DROP TABLESPACE <tablespace>
  3322. *
  3323. * No need for drop behaviour as we cannot implement dependencies for
  3324. * objects in other databases; we can only support RESTRICT.
  3325. *
  3326. ****************************************************************************/
  3327. DropTableSpaceStmt: DROP TABLESPACE name
  3328. {
  3329. DropTableSpaceStmt *n = makeNode(DropTableSpaceStmt);
  3330. n->tablespacename = $3;
  3331. n->missing_ok = false;
  3332. $$ = (Node *) n;
  3333. }
  3334. | DROP TABLESPACE IF_P EXISTS name
  3335. {
  3336. DropTableSpaceStmt *n = makeNode(DropTableSpaceStmt);
  3337. n->tablespacename = $5;
  3338. n->missing_ok = true;
  3339. $$ = (Node *) n;
  3340. }
  3341. ;
  3342. /*****************************************************************************
  3343. *
  3344. * QUERY:
  3345. * CREATE EXTENSION extension
  3346. * [ WITH ] [ SCHEMA schema ] [ VERSION version ] [ FROM oldversion ]
  3347. *
  3348. *****************************************************************************/
  3349. CreateExtensionStmt: CREATE EXTENSION name opt_with create_extension_opt_list
  3350. {
  3351. CreateExtensionStmt *n = makeNode(CreateExtensionStmt);
  3352. n->extname = $3;
  3353. n->if_not_exists = false;
  3354. n->options = $5;
  3355. $$ = (Node *) n;
  3356. }
  3357. | CREATE EXTENSION IF_P NOT EXISTS name opt_with create_extension_opt_list
  3358. {
  3359. CreateExtensionStmt *n = makeNode(CreateExtensionStmt);
  3360. n->extname = $6;
  3361. n->if_not_exists = true;
  3362. n->options = $8;
  3363. $$ = (Node *) n;
  3364. }
  3365. ;
  3366. create_extension_opt_list:
  3367. create_extension_opt_list create_extension_opt_item
  3368. { $$ = lappend($1, $2); }
  3369. | /* EMPTY */
  3370. { $$ = NIL; }
  3371. ;
  3372. create_extension_opt_item:
  3373. SCHEMA name
  3374. {
  3375. $$ = makeDefElem("schema", (Node *)makeString($2));
  3376. }
  3377. | VERSION_P NonReservedWord_or_Sconst
  3378. {
  3379. $$ = makeDefElem("new_version", (Node *)makeString($2));
  3380. }
  3381. | FROM NonReservedWord_or_Sconst
  3382. {
  3383. $$ = makeDefElem("old_version", (Node *)makeString($2));
  3384. }
  3385. ;
  3386. /*****************************************************************************
  3387. *
  3388. * ALTER EXTENSION name UPDATE [ TO version ]
  3389. *
  3390. *****************************************************************************/
  3391. AlterExtensionStmt: ALTER EXTENSION name UPDATE alter_extension_opt_list
  3392. {
  3393. AlterExtensionStmt *n = makeNode(AlterExtensionStmt);
  3394. n->extname = $3;
  3395. n->options = $5;
  3396. $$ = (Node *) n;
  3397. }
  3398. ;
  3399. alter_extension_opt_list:
  3400. alter_extension_opt_list alter_extension_opt_item
  3401. { $$ = lappend($1, $2); }
  3402. | /* EMPTY */
  3403. { $$ = NIL; }
  3404. ;
  3405. alter_extension_opt_item:
  3406. TO NonReservedWord_or_Sconst
  3407. {
  3408. $$ = makeDefElem("new_version", (Node *)makeString($2));
  3409. }
  3410. ;
  3411. /*****************************************************************************
  3412. *
  3413. * ALTER EXTENSION name ADD/DROP object-identifier
  3414. *
  3415. *****************************************************************************/
  3416. AlterExtensionContentsStmt:
  3417. ALTER EXTENSION name add_drop AGGREGATE func_name aggr_args
  3418. {
  3419. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3420. n->extname = $3;
  3421. n->action = $4;
  3422. n->objtype = OBJECT_AGGREGATE;
  3423. n->objname = $6;
  3424. n->objargs = extractAggrArgTypes($7);
  3425. $$ = (Node *)n;
  3426. }
  3427. | ALTER EXTENSION name add_drop CAST '(' Typename AS Typename ')'
  3428. {
  3429. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3430. n->extname = $3;
  3431. n->action = $4;
  3432. n->objtype = OBJECT_CAST;
  3433. n->objname = list_make1($7);
  3434. n->objargs = list_make1($9);
  3435. $$ = (Node *) n;
  3436. }
  3437. | ALTER EXTENSION name add_drop COLLATION any_name
  3438. {
  3439. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3440. n->extname = $3;
  3441. n->action = $4;
  3442. n->objtype = OBJECT_COLLATION;
  3443. n->objname = $6;
  3444. $$ = (Node *)n;
  3445. }
  3446. | ALTER EXTENSION name add_drop CONVERSION_P any_name
  3447. {
  3448. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3449. n->extname = $3;
  3450. n->action = $4;
  3451. n->objtype = OBJECT_CONVERSION;
  3452. n->objname = $6;
  3453. $$ = (Node *)n;
  3454. }
  3455. | ALTER EXTENSION name add_drop DOMAIN_P any_name
  3456. {
  3457. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3458. n->extname = $3;
  3459. n->action = $4;
  3460. n->objtype = OBJECT_DOMAIN;
  3461. n->objname = $6;
  3462. $$ = (Node *)n;
  3463. }
  3464. | ALTER EXTENSION name add_drop FUNCTION function_with_argtypes
  3465. {
  3466. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3467. n->extname = $3;
  3468. n->action = $4;
  3469. n->objtype = OBJECT_FUNCTION;
  3470. n->objname = $6->funcname;
  3471. n->objargs = $6->funcargs;
  3472. $$ = (Node *)n;
  3473. }
  3474. | ALTER EXTENSION name add_drop opt_procedural LANGUAGE name
  3475. {
  3476. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3477. n->extname = $3;
  3478. n->action = $4;
  3479. n->objtype = OBJECT_LANGUAGE;
  3480. n->objname = list_make1(makeString($7));
  3481. $$ = (Node *)n;
  3482. }
  3483. | ALTER EXTENSION name add_drop OPERATOR any_operator oper_argtypes
  3484. {
  3485. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3486. n->extname = $3;
  3487. n->action = $4;
  3488. n->objtype = OBJECT_OPERATOR;
  3489. n->objname = $6;
  3490. n->objargs = $7;
  3491. $$ = (Node *)n;
  3492. }
  3493. | ALTER EXTENSION name add_drop OPERATOR CLASS any_name USING access_method
  3494. {
  3495. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3496. n->extname = $3;
  3497. n->action = $4;
  3498. n->objtype = OBJECT_OPCLASS;
  3499. n->objname = $7;
  3500. n->objargs = list_make1(makeString($9));
  3501. $$ = (Node *)n;
  3502. }
  3503. | ALTER EXTENSION name add_drop OPERATOR FAMILY any_name USING access_method
  3504. {
  3505. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3506. n->extname = $3;
  3507. n->action = $4;
  3508. n->objtype = OBJECT_OPFAMILY;
  3509. n->objname = $7;
  3510. n->objargs = list_make1(makeString($9));
  3511. $$ = (Node *)n;
  3512. }
  3513. | ALTER EXTENSION name add_drop SCHEMA name
  3514. {
  3515. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3516. n->extname = $3;
  3517. n->action = $4;
  3518. n->objtype = OBJECT_SCHEMA;
  3519. n->objname = list_make1(makeString($6));
  3520. $$ = (Node *)n;
  3521. }
  3522. | ALTER EXTENSION name add_drop EVENT TRIGGER name
  3523. {
  3524. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3525. n->extname = $3;
  3526. n->action = $4;
  3527. n->objtype = OBJECT_EVENT_TRIGGER;
  3528. n->objname = list_make1(makeString($7));
  3529. $$ = (Node *)n;
  3530. }
  3531. | ALTER EXTENSION name add_drop TABLE any_name
  3532. {
  3533. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3534. n->extname = $3;
  3535. n->action = $4;
  3536. n->objtype = OBJECT_TABLE;
  3537. n->objname = $6;
  3538. $$ = (Node *)n;
  3539. }
  3540. | ALTER EXTENSION name add_drop TEXT_P SEARCH PARSER any_name
  3541. {
  3542. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3543. n->extname = $3;
  3544. n->action = $4;
  3545. n->objtype = OBJECT_TSPARSER;
  3546. n->objname = $8;
  3547. $$ = (Node *)n;
  3548. }
  3549. | ALTER EXTENSION name add_drop TEXT_P SEARCH DICTIONARY any_name
  3550. {
  3551. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3552. n->extname = $3;
  3553. n->action = $4;
  3554. n->objtype = OBJECT_TSDICTIONARY;
  3555. n->objname = $8;
  3556. $$ = (Node *)n;
  3557. }
  3558. | ALTER EXTENSION name add_drop TEXT_P SEARCH TEMPLATE any_name
  3559. {
  3560. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3561. n->extname = $3;
  3562. n->action = $4;
  3563. n->objtype = OBJECT_TSTEMPLATE;
  3564. n->objname = $8;
  3565. $$ = (Node *)n;
  3566. }
  3567. | ALTER EXTENSION name add_drop TEXT_P SEARCH CONFIGURATION any_name
  3568. {
  3569. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3570. n->extname = $3;
  3571. n->action = $4;
  3572. n->objtype = OBJECT_TSCONFIGURATION;
  3573. n->objname = $8;
  3574. $$ = (Node *)n;
  3575. }
  3576. | ALTER EXTENSION name add_drop SEQUENCE any_name
  3577. {
  3578. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3579. n->extname = $3;
  3580. n->action = $4;
  3581. n->objtype = OBJECT_SEQUENCE;
  3582. n->objname = $6;
  3583. $$ = (Node *)n;
  3584. }
  3585. | ALTER EXTENSION name add_drop VIEW any_name
  3586. {
  3587. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3588. n->extname = $3;
  3589. n->action = $4;
  3590. n->objtype = OBJECT_VIEW;
  3591. n->objname = $6;
  3592. $$ = (Node *)n;
  3593. }
  3594. | ALTER EXTENSION name add_drop MATERIALIZED VIEW any_name
  3595. {
  3596. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3597. n->extname = $3;
  3598. n->action = $4;
  3599. n->objtype = OBJECT_MATVIEW;
  3600. n->objname = $7;
  3601. $$ = (Node *)n;
  3602. }
  3603. | ALTER EXTENSION name add_drop FOREIGN TABLE any_name
  3604. {
  3605. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3606. n->extname = $3;
  3607. n->action = $4;
  3608. n->objtype = OBJECT_FOREIGN_TABLE;
  3609. n->objname = $7;
  3610. $$ = (Node *)n;
  3611. }
  3612. | ALTER EXTENSION name add_drop FOREIGN DATA_P WRAPPER name
  3613. {
  3614. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3615. n->extname = $3;
  3616. n->action = $4;
  3617. n->objtype = OBJECT_FDW;
  3618. n->objname = list_make1(makeString($8));
  3619. $$ = (Node *)n;
  3620. }
  3621. | ALTER EXTENSION name add_drop SERVER name
  3622. {
  3623. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3624. n->extname = $3;
  3625. n->action = $4;
  3626. n->objtype = OBJECT_FOREIGN_SERVER;
  3627. n->objname = list_make1(makeString($6));
  3628. $$ = (Node *)n;
  3629. }
  3630. | ALTER EXTENSION name add_drop TYPE_P any_name
  3631. {
  3632. AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  3633. n->extname = $3;
  3634. n->action = $4;
  3635. n->objtype = OBJECT_TYPE;
  3636. n->objname = $6;
  3637. $$ = (Node *)n;
  3638. }
  3639. ;
  3640. /*****************************************************************************
  3641. *
  3642. * QUERY:
  3643. * CREATE FOREIGN DATA WRAPPER name options
  3644. *
  3645. *****************************************************************************/
  3646. CreateFdwStmt: CREATE FOREIGN DATA_P WRAPPER name opt_fdw_options create_generic_options
  3647. {
  3648. CreateFdwStmt *n = makeNode(CreateFdwStmt);
  3649. n->fdwname = $5;
  3650. n->func_options = $6;
  3651. n->options = $7;
  3652. $$ = (Node *) n;
  3653. }
  3654. ;
  3655. fdw_option:
  3656. HANDLER handler_name { $$ = makeDefElem("handler", (Node *)$2); }
  3657. | NO HANDLER { $$ = makeDefElem("handler", NULL); }
  3658. | VALIDATOR handler_name { $$ = makeDefElem("validator", (Node *)$2); }
  3659. | NO VALIDATOR { $$ = makeDefElem("validator", NULL); }
  3660. ;
  3661. fdw_options:
  3662. fdw_option { $$ = list_make1($1); }
  3663. | fdw_options fdw_option { $$ = lappend($1, $2); }
  3664. ;
  3665. opt_fdw_options:
  3666. fdw_options { $$ = $1; }
  3667. | /*EMPTY*/ { $$ = NIL; }
  3668. ;
  3669. /*****************************************************************************
  3670. *
  3671. * QUERY :
  3672. * DROP FOREIGN DATA WRAPPER name
  3673. *
  3674. ****************************************************************************/
  3675. DropFdwStmt: DROP FOREIGN DATA_P WRAPPER name opt_drop_behavior
  3676. {
  3677. DropStmt *n = makeNode(DropStmt);
  3678. n->removeType = OBJECT_FDW;
  3679. n->objects = list_make1(list_make1(makeString($5)));
  3680. n->arguments = NIL;
  3681. n->missing_ok = false;
  3682. n->behavior = $6;
  3683. n->concurrent = false;
  3684. $$ = (Node *) n;
  3685. }
  3686. | DROP FOREIGN DATA_P WRAPPER IF_P EXISTS name opt_drop_behavior
  3687. {
  3688. DropStmt *n = makeNode(DropStmt);
  3689. n->removeType = OBJECT_FDW;
  3690. n->objects = list_make1(list_make1(makeString($7)));
  3691. n->arguments = NIL;
  3692. n->missing_ok = true;
  3693. n->behavior = $8;
  3694. n->concurrent = false;
  3695. $$ = (Node *) n;
  3696. }
  3697. ;
  3698. /*****************************************************************************
  3699. *
  3700. * QUERY :
  3701. * ALTER FOREIGN DATA WRAPPER name options
  3702. *
  3703. ****************************************************************************/
  3704. AlterFdwStmt: ALTER FOREIGN DATA_P WRAPPER name opt_fdw_options alter_generic_options
  3705. {
  3706. AlterFdwStmt *n = makeNode(AlterFdwStmt);
  3707. n->fdwname = $5;
  3708. n->func_options = $6;
  3709. n->options = $7;
  3710. $$ = (Node *) n;
  3711. }
  3712. | ALTER FOREIGN DATA_P WRAPPER name fdw_options
  3713. {
  3714. AlterFdwStmt *n = makeNode(AlterFdwStmt);
  3715. n->fdwname = $5;
  3716. n->func_options = $6;
  3717. n->options = NIL;
  3718. $$ = (Node *) n;
  3719. }
  3720. ;
  3721. /* Options definition for CREATE FDW, SERVER and USER MAPPING */
  3722. create_generic_options:
  3723. OPTIONS '(' generic_option_list ')' { $$ = $3; }
  3724. | /*EMPTY*/ { $$ = NIL; }
  3725. ;
  3726. generic_option_list:
  3727. generic_option_elem
  3728. {
  3729. $$ = list_make1($1);
  3730. }
  3731. | generic_option_list ',' generic_option_elem
  3732. {
  3733. $$ = lappend($1, $3);
  3734. }
  3735. ;
  3736. /* Options definition for ALTER FDW, SERVER and USER MAPPING */
  3737. alter_generic_options:
  3738. OPTIONS '(' alter_generic_option_list ')' { $$ = $3; }
  3739. ;
  3740. alter_generic_option_list:
  3741. alter_generic_option_elem
  3742. {
  3743. $$ = list_make1($1);
  3744. }
  3745. | alter_generic_option_list ',' alter_generic_option_elem
  3746. {
  3747. $$ = lappend($1, $3);
  3748. }
  3749. ;
  3750. alter_generic_option_elem:
  3751. generic_option_elem
  3752. {
  3753. $$ = $1;
  3754. }
  3755. | SET generic_option_elem
  3756. {
  3757. $$ = $2;
  3758. $$->defaction = DEFELEM_SET;
  3759. }
  3760. | ADD_P generic_option_elem
  3761. {
  3762. $$ = $2;
  3763. $$->defaction = DEFELEM_ADD;
  3764. }
  3765. | DROP generic_option_name
  3766. {
  3767. $$ = makeDefElemExtended(NULL, $2, NULL, DEFELEM_DROP);
  3768. }
  3769. ;
  3770. generic_option_elem:
  3771. generic_option_name generic_option_arg
  3772. {
  3773. $$ = makeDefElem($1, $2);
  3774. }
  3775. ;
  3776. generic_option_name:
  3777. ColLabel { $$ = $1; }
  3778. ;
  3779. /* We could use def_arg here, but the spec only requires string literals */
  3780. generic_option_arg:
  3781. Sconst { $$ = (Node *) makeString($1); }
  3782. ;
  3783. /*****************************************************************************
  3784. *
  3785. * QUERY:
  3786. * CREATE SERVER name [TYPE] [VERSION] [OPTIONS]
  3787. *
  3788. *****************************************************************************/
  3789. CreateForeignServerStmt: CREATE SERVER name opt_type opt_foreign_server_version
  3790. FOREIGN DATA_P WRAPPER name create_generic_options
  3791. {
  3792. CreateForeignServerStmt *n = makeNode(CreateForeignServerStmt);
  3793. n->servername = $3;
  3794. n->servertype = $4;
  3795. n->version = $5;
  3796. n->fdwname = $9;
  3797. n->options = $10;
  3798. $$ = (Node *) n;
  3799. }
  3800. ;
  3801. opt_type:
  3802. TYPE_P Sconst { $$ = $2; }
  3803. | /*EMPTY*/ { $$ = NULL; }
  3804. ;
  3805. foreign_server_version:
  3806. VERSION_P Sconst { $$ = $2; }
  3807. | VERSION_P NULL_P { $$ = NULL; }
  3808. ;
  3809. opt_foreign_server_version:
  3810. foreign_server_version { $$ = $1; }
  3811. | /*EMPTY*/ { $$ = NULL; }
  3812. ;
  3813. /*****************************************************************************
  3814. *
  3815. * QUERY :
  3816. * DROP SERVER name
  3817. *
  3818. ****************************************************************************/
  3819. DropForeignServerStmt: DROP SERVER name opt_drop_behavior
  3820. {
  3821. DropStmt *n = makeNode(DropStmt);
  3822. n->removeType = OBJECT_FOREIGN_SERVER;
  3823. n->objects = list_make1(list_make1(makeString($3)));
  3824. n->arguments = NIL;
  3825. n->missing_ok = false;
  3826. n->behavior = $4;
  3827. n->concurrent = false;
  3828. $$ = (Node *) n;
  3829. }
  3830. | DROP SERVER IF_P EXISTS name opt_drop_behavior
  3831. {
  3832. DropStmt *n = makeNode(DropStmt);
  3833. n->removeType = OBJECT_FOREIGN_SERVER;
  3834. n->objects = list_make1(list_make1(makeString($5)));
  3835. n->arguments = NIL;
  3836. n->missing_ok = true;
  3837. n->behavior = $6;
  3838. n->concurrent = false;
  3839. $$ = (Node *) n;
  3840. }
  3841. ;
  3842. /*****************************************************************************
  3843. *
  3844. * QUERY :
  3845. * ALTER SERVER name [VERSION] [OPTIONS]
  3846. *
  3847. ****************************************************************************/
  3848. AlterForeignServerStmt: ALTER SERVER name foreign_server_version alter_generic_options
  3849. {
  3850. AlterForeignServerStmt *n = makeNode(AlterForeignServerStmt);
  3851. n->servername = $3;
  3852. n->version = $4;
  3853. n->options = $5;
  3854. n->has_version = true;
  3855. $$ = (Node *) n;
  3856. }
  3857. | ALTER SERVER name foreign_server_version
  3858. {
  3859. AlterForeignServerStmt *n = makeNode(AlterForeignServerStmt);
  3860. n->servername = $3;
  3861. n->version = $4;
  3862. n->has_version = true;
  3863. $$ = (Node *) n;
  3864. }
  3865. | ALTER SERVER name alter_generic_options
  3866. {
  3867. AlterForeignServerStmt *n = makeNode(AlterForeignServerStmt);
  3868. n->servername = $3;
  3869. n->options = $4;
  3870. $$ = (Node *) n;
  3871. }
  3872. ;
  3873. /*****************************************************************************
  3874. *
  3875. * QUERY:
  3876. * CREATE FOREIGN TABLE relname (...) SERVER name (...)
  3877. *
  3878. *****************************************************************************/
  3879. CreateForeignTableStmt:
  3880. CREATE FOREIGN TABLE qualified_name
  3881. '(' OptTableElementList ')'
  3882. SERVER name create_generic_options
  3883. {
  3884. CreateForeignTableStmt *n = makeNode(CreateForeignTableStmt);
  3885. $4->relpersistence = RELPERSISTENCE_PERMANENT;
  3886. n->base.relation = $4;
  3887. n->base.tableElts = $6;
  3888. n->base.inhRelations = NIL;
  3889. n->base.if_not_exists = false;
  3890. /* FDW-specific data */
  3891. n->servername = $9;
  3892. n->options = $10;
  3893. $$ = (Node *) n;
  3894. }
  3895. | CREATE FOREIGN TABLE IF_P NOT EXISTS qualified_name
  3896. '(' OptTableElementList ')'
  3897. SERVER name create_generic_options
  3898. {
  3899. CreateForeignTableStmt *n = makeNode(CreateForeignTableStmt);
  3900. $7->relpersistence = RELPERSISTENCE_PERMANENT;
  3901. n->base.relation = $7;
  3902. n->base.tableElts = $9;
  3903. n->base.inhRelations = NIL;
  3904. n->base.if_not_exists = true;
  3905. /* FDW-specific data */
  3906. n->servername = $12;
  3907. n->options = $13;
  3908. $$ = (Node *) n;
  3909. }
  3910. ;
  3911. /*****************************************************************************
  3912. *
  3913. * QUERY:
  3914. * ALTER FOREIGN TABLE relname [...]
  3915. *
  3916. *****************************************************************************/
  3917. AlterForeignTableStmt:
  3918. ALTER FOREIGN TABLE relation_expr alter_table_cmds
  3919. {
  3920. AlterTableStmt *n = makeNode(AlterTableStmt);
  3921. n->relation = $4;
  3922. n->cmds = $5;
  3923. n->relkind = OBJECT_FOREIGN_TABLE;
  3924. n->missing_ok = false;
  3925. $$ = (Node *)n;
  3926. }
  3927. | ALTER FOREIGN TABLE IF_P EXISTS relation_expr alter_table_cmds
  3928. {
  3929. AlterTableStmt *n = makeNode(AlterTableStmt);
  3930. n->relation = $6;
  3931. n->cmds = $7;
  3932. n->relkind = OBJECT_FOREIGN_TABLE;
  3933. n->missing_ok = true;
  3934. $$ = (Node *)n;
  3935. }
  3936. ;
  3937. /*****************************************************************************
  3938. *
  3939. * QUERY:
  3940. * CREATE USER MAPPING FOR auth_ident SERVER name [OPTIONS]
  3941. *
  3942. *****************************************************************************/
  3943. CreateUserMappingStmt: CREATE USER MAPPING FOR auth_ident SERVER name create_generic_options
  3944. {
  3945. CreateUserMappingStmt *n = makeNode(CreateUserMappingStmt);
  3946. n->username = $5;
  3947. n->servername = $7;
  3948. n->options = $8;
  3949. $$ = (Node *) n;
  3950. }
  3951. ;
  3952. /* User mapping authorization identifier */
  3953. auth_ident:
  3954. CURRENT_USER { $$ = "current_user"; }
  3955. | USER { $$ = "current_user"; }
  3956. | RoleId { $$ = (strcmp($1, "public") == 0) ? NULL : $1; }
  3957. ;
  3958. /*****************************************************************************
  3959. *
  3960. * QUERY :
  3961. * DROP USER MAPPING FOR auth_ident SERVER name
  3962. *
  3963. ****************************************************************************/
  3964. DropUserMappingStmt: DROP USER MAPPING FOR auth_ident SERVER name
  3965. {
  3966. DropUserMappingStmt *n = makeNode(DropUserMappingStmt);
  3967. n->username = $5;
  3968. n->servername = $7;
  3969. n->missing_ok = false;
  3970. $$ = (Node *) n;
  3971. }
  3972. | DROP USER MAPPING IF_P EXISTS FOR auth_ident SERVER name
  3973. {
  3974. DropUserMappingStmt *n = makeNode(DropUserMappingStmt);
  3975. n->username = $7;
  3976. n->servername = $9;
  3977. n->missing_ok = true;
  3978. $$ = (Node *) n;
  3979. }
  3980. ;
  3981. /*****************************************************************************
  3982. *
  3983. * QUERY :
  3984. * ALTER USER MAPPING FOR auth_ident SERVER name OPTIONS
  3985. *
  3986. ****************************************************************************/
  3987. AlterUserMappingStmt: ALTER USER MAPPING FOR auth_ident SERVER name alter_generic_options
  3988. {
  3989. AlterUserMappingStmt *n = makeNode(AlterUserMappingStmt);
  3990. n->username = $5;
  3991. n->servername = $7;
  3992. n->options = $8;
  3993. $$ = (Node *) n;
  3994. }
  3995. ;
  3996. /*****************************************************************************
  3997. *
  3998. * QUERIES :
  3999. * CREATE TRIGGER ...
  4000. * DROP TRIGGER ...
  4001. *
  4002. *****************************************************************************/
  4003. CreateTrigStmt:
  4004. CREATE TRIGGER name TriggerActionTime TriggerEvents ON
  4005. qualified_name TriggerForSpec TriggerWhen
  4006. EXECUTE PROCEDURE func_name '(' TriggerFuncArgs ')'
  4007. {
  4008. CreateTrigStmt *n = makeNode(CreateTrigStmt);
  4009. n->trigname = $3;
  4010. n->relation = $7;
  4011. n->funcname = $12;
  4012. n->args = $14;
  4013. n->row = $8;
  4014. n->timing = $4;
  4015. n->events = intVal(linitial($5));
  4016. n->columns = (List *) lsecond($5);
  4017. n->whenClause = $9;
  4018. n->isconstraint = FALSE;
  4019. n->deferrable = FALSE;
  4020. n->initdeferred = FALSE;
  4021. n->constrrel = NULL;
  4022. $$ = (Node *)n;
  4023. }
  4024. | CREATE CONSTRAINT TRIGGER name AFTER TriggerEvents ON
  4025. qualified_name OptConstrFromTable ConstraintAttributeSpec
  4026. FOR EACH ROW TriggerWhen
  4027. EXECUTE PROCEDURE func_name '(' TriggerFuncArgs ')'
  4028. {
  4029. CreateTrigStmt *n = makeNode(CreateTrigStmt);
  4030. n->trigname = $4;
  4031. n->relation = $8;
  4032. n->funcname = $17;
  4033. n->args = $19;
  4034. n->row = TRUE;
  4035. n->timing = TRIGGER_TYPE_AFTER;
  4036. n->events = intVal(linitial($6));
  4037. n->columns = (List *) lsecond($6);
  4038. n->whenClause = $14;
  4039. n->isconstraint = TRUE;
  4040. processCASbits($10, @10, "TRIGGER",
  4041. &n->deferrable, &n->initdeferred, NULL,
  4042. NULL, yyscanner);
  4043. n->constrrel = $9;
  4044. $$ = (Node *)n;
  4045. }
  4046. ;
  4047. TriggerActionTime:
  4048. BEFORE { $$ = TRIGGER_TYPE_BEFORE; }
  4049. | AFTER { $$ = TRIGGER_TYPE_AFTER; }
  4050. | INSTEAD OF { $$ = TRIGGER_TYPE_INSTEAD; }
  4051. ;
  4052. TriggerEvents:
  4053. TriggerOneEvent
  4054. { $$ = $1; }
  4055. | TriggerEvents OR TriggerOneEvent
  4056. {
  4057. int events1 = intVal(linitial($1));
  4058. int events2 = intVal(linitial($3));
  4059. List *columns1 = (List *) lsecond($1);
  4060. List *columns2 = (List *) lsecond($3);
  4061. if (events1 & events2)
  4062. parser_yyerror("duplicate trigger events specified");
  4063. /*
  4064. * concat'ing the columns lists loses information about
  4065. * which columns went with which event, but so long as
  4066. * only UPDATE carries columns and we disallow multiple
  4067. * UPDATE items, it doesn't matter. Command execution
  4068. * should just ignore the columns for non-UPDATE events.
  4069. */
  4070. $$ = list_make2(makeInteger(events1 | events2),
  4071. list_concat(columns1, columns2));
  4072. }
  4073. ;
  4074. TriggerOneEvent:
  4075. INSERT
  4076. { $$ = list_make2(makeInteger(TRIGGER_TYPE_INSERT), NIL); }
  4077. | DELETE_P
  4078. { $$ = list_make2(makeInteger(TRIGGER_TYPE_DELETE), NIL); }
  4079. | UPDATE
  4080. { $$ = list_make2(makeInteger(TRIGGER_TYPE_UPDATE), NIL); }
  4081. | UPDATE OF columnList
  4082. { $$ = list_make2(makeInteger(TRIGGER_TYPE_UPDATE), $3); }
  4083. | TRUNCATE
  4084. { $$ = list_make2(makeInteger(TRIGGER_TYPE_TRUNCATE), NIL); }
  4085. ;
  4086. TriggerForSpec:
  4087. FOR TriggerForOptEach TriggerForType
  4088. {
  4089. $$ = $3;
  4090. }
  4091. | /* EMPTY */
  4092. {
  4093. /*
  4094. * If ROW/STATEMENT not specified, default to
  4095. * STATEMENT, per SQL
  4096. */
  4097. $$ = FALSE;
  4098. }
  4099. ;
  4100. TriggerForOptEach:
  4101. EACH {}
  4102. | /*EMPTY*/ {}
  4103. ;
  4104. TriggerForType:
  4105. ROW { $$ = TRUE; }
  4106. | STATEMENT { $$ = FALSE; }
  4107. ;
  4108. TriggerWhen:
  4109. WHEN '(' a_expr ')' { $$ = $3; }
  4110. | /*EMPTY*/ { $$ = NULL; }
  4111. ;
  4112. TriggerFuncArgs:
  4113. TriggerFuncArg { $$ = list_make1($1); }
  4114. | TriggerFuncArgs ',' TriggerFuncArg { $$ = lappend($1, $3); }
  4115. | /*EMPTY*/ { $$ = NIL; }
  4116. ;
  4117. TriggerFuncArg:
  4118. Iconst
  4119. {
  4120. char buf[64];
  4121. snprintf(buf, sizeof(buf), "%d", $1);
  4122. $$ = makeString(pstrdup(buf));
  4123. }
  4124. | FCONST { $$ = makeString($1); }
  4125. | Sconst { $$ = makeString($1); }
  4126. | ColLabel { $$ = makeString($1); }
  4127. ;
  4128. OptConstrFromTable:
  4129. FROM qualified_name { $$ = $2; }
  4130. | /*EMPTY*/ { $$ = NULL; }
  4131. ;
  4132. ConstraintAttributeSpec:
  4133. /*EMPTY*/
  4134. { $$ = 0; }
  4135. | ConstraintAttributeSpec ConstraintAttributeElem
  4136. {
  4137. /*
  4138. * We must complain about conflicting options.
  4139. * We could, but choose not to, complain about redundant
  4140. * options (ie, where $2's bit is already set in $1).
  4141. */
  4142. int newspec = $1 | $2;
  4143. /* special message for this case */
  4144. if ((newspec & (CAS_NOT_DEFERRABLE | CAS_INITIALLY_DEFERRED)) == (CAS_NOT_DEFERRABLE | CAS_INITIALLY_DEFERRED))
  4145. ereport(ERROR,
  4146. (errcode(ERRCODE_SYNTAX_ERROR),
  4147. errmsg("constraint declared INITIALLY DEFERRED must be DEFERRABLE"),
  4148. parser_errposition(@2)));
  4149. /* generic message for other conflicts */
  4150. if ((newspec & (CAS_NOT_DEFERRABLE | CAS_DEFERRABLE)) == (CAS_NOT_DEFERRABLE | CAS_DEFERRABLE) ||
  4151. (newspec & (CAS_INITIALLY_IMMEDIATE | CAS_INITIALLY_DEFERRED)) == (CAS_INITIALLY_IMMEDIATE | CAS_INITIALLY_DEFERRED))
  4152. ereport(ERROR,
  4153. (errcode(ERRCODE_SYNTAX_ERROR),
  4154. errmsg("conflicting constraint properties"),
  4155. parser_errposition(@2)));
  4156. $$ = newspec;
  4157. }
  4158. ;
  4159. ConstraintAttributeElem:
  4160. NOT DEFERRABLE { $$ = CAS_NOT_DEFERRABLE; }
  4161. | DEFERRABLE { $$ = CAS_DEFERRABLE; }
  4162. | INITIALLY IMMEDIATE { $$ = CAS_INITIALLY_IMMEDIATE; }
  4163. | INITIALLY DEFERRED { $$ = CAS_INITIALLY_DEFERRED; }
  4164. | NOT VALID { $$ = CAS_NOT_VALID; }
  4165. | NO INHERIT { $$ = CAS_NO_INHERIT; }
  4166. ;
  4167. DropTrigStmt:
  4168. DROP TRIGGER name ON any_name opt_drop_behavior
  4169. {
  4170. DropStmt *n = makeNode(DropStmt);
  4171. n->removeType = OBJECT_TRIGGER;
  4172. n->objects = list_make1(lappend($5, makeString($3)));
  4173. n->arguments = NIL;
  4174. n->behavior = $6;
  4175. n->missing_ok = false;
  4176. n->concurrent = false;
  4177. $$ = (Node *) n;
  4178. }
  4179. | DROP TRIGGER IF_P EXISTS name ON any_name opt_drop_behavior
  4180. {
  4181. DropStmt *n = makeNode(DropStmt);
  4182. n->removeType = OBJECT_TRIGGER;
  4183. n->objects = list_make1(lappend($7, makeString($5)));
  4184. n->arguments = NIL;
  4185. n->behavior = $8;
  4186. n->missing_ok = true;
  4187. n->concurrent = false;
  4188. $$ = (Node *) n;
  4189. }
  4190. ;
  4191. /*****************************************************************************
  4192. *
  4193. * QUERIES :
  4194. * CREATE EVENT TRIGGER ...
  4195. * ALTER EVENT TRIGGER ...
  4196. *
  4197. *****************************************************************************/
  4198. CreateEventTrigStmt:
  4199. CREATE EVENT TRIGGER name ON ColLabel
  4200. EXECUTE PROCEDURE func_name '(' ')'
  4201. {
  4202. CreateEventTrigStmt *n = makeNode(CreateEventTrigStmt);
  4203. n->trigname = $4;
  4204. n->eventname = $6;
  4205. n->whenclause = NULL;
  4206. n->funcname = $9;
  4207. $$ = (Node *)n;
  4208. }
  4209. | CREATE EVENT TRIGGER name ON ColLabel
  4210. WHEN event_trigger_when_list
  4211. EXECUTE PROCEDURE func_name '(' ')'
  4212. {
  4213. CreateEventTrigStmt *n = makeNode(CreateEventTrigStmt);
  4214. n->trigname = $4;
  4215. n->eventname = $6;
  4216. n->whenclause = $8;
  4217. n->funcname = $11;
  4218. $$ = (Node *)n;
  4219. }
  4220. ;
  4221. event_trigger_when_list:
  4222. event_trigger_when_item
  4223. { $$ = list_make1($1); }
  4224. | event_trigger_when_list AND event_trigger_when_item
  4225. { $$ = lappend($1, $3); }
  4226. ;
  4227. event_trigger_when_item:
  4228. ColId IN_P '(' event_trigger_value_list ')'
  4229. { $$ = makeDefElem($1, (Node *) $4); }
  4230. ;
  4231. event_trigger_value_list:
  4232. SCONST
  4233. { $$ = list_make1(makeString($1)); }
  4234. | event_trigger_value_list ',' SCONST
  4235. { $$ = lappend($1, makeString($3)); }
  4236. ;
  4237. AlterEventTrigStmt:
  4238. ALTER EVENT TRIGGER name enable_trigger
  4239. {
  4240. AlterEventTrigStmt *n = makeNode(AlterEventTrigStmt);
  4241. n->trigname = $4;
  4242. n->tgenabled = $5;
  4243. $$ = (Node *) n;
  4244. }
  4245. ;
  4246. enable_trigger:
  4247. ENABLE_P { $$ = TRIGGER_FIRES_ON_ORIGIN; }
  4248. | ENABLE_P REPLICA { $$ = TRIGGER_FIRES_ON_REPLICA; }
  4249. | ENABLE_P ALWAYS { $$ = TRIGGER_FIRES_ALWAYS; }
  4250. | DISABLE_P { $$ = TRIGGER_DISABLED; }
  4251. ;
  4252. /*****************************************************************************
  4253. *
  4254. * QUERIES :
  4255. * CREATE ASSERTION ...
  4256. * DROP ASSERTION ...
  4257. *
  4258. *****************************************************************************/
  4259. CreateAssertStmt:
  4260. CREATE ASSERTION name CHECK '(' a_expr ')'
  4261. ConstraintAttributeSpec
  4262. {
  4263. CreateTrigStmt *n = makeNode(CreateTrigStmt);
  4264. n->trigname = $3;
  4265. n->args = list_make1($6);
  4266. n->isconstraint = TRUE;
  4267. processCASbits($8, @8, "ASSERTION",
  4268. &n->deferrable, &n->initdeferred, NULL,
  4269. NULL, yyscanner);
  4270. ereport(ERROR,
  4271. (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
  4272. errmsg("CREATE ASSERTION is not yet implemented")));
  4273. $$ = (Node *)n;
  4274. }
  4275. ;
  4276. DropAssertStmt:
  4277. DROP ASSERTION name opt_drop_behavior
  4278. {
  4279. DropStmt *n = makeNode(DropStmt);
  4280. n->objects = NIL;
  4281. n->arguments = NIL;
  4282. n->behavior = $4;
  4283. n->removeType = OBJECT_TRIGGER; /* XXX */
  4284. ereport(ERROR,
  4285. (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
  4286. errmsg("DROP ASSERTION is not yet implemented")));
  4287. $$ = (Node *) n;
  4288. }
  4289. ;
  4290. /*****************************************************************************
  4291. *
  4292. * QUERY :
  4293. * define (aggregate,operator,type)
  4294. *
  4295. *****************************************************************************/
  4296. DefineStmt:
  4297. CREATE AGGREGATE func_name aggr_args definition
  4298. {
  4299. DefineStmt *n = makeNode(DefineStmt);
  4300. n->kind = OBJECT_AGGREGATE;
  4301. n->oldstyle = false;
  4302. n->defnames = $3;
  4303. n->args = $4;
  4304. n->definition = $5;
  4305. $$ = (Node *)n;
  4306. }
  4307. | CREATE AGGREGATE func_name old_aggr_definition
  4308. {
  4309. /* old-style (pre-8.2) syntax for CREATE AGGREGATE */
  4310. DefineStmt *n = makeNode(DefineStmt);
  4311. n->kind = OBJECT_AGGREGATE;
  4312. n->oldstyle = true;
  4313. n->defnames = $3;
  4314. n->args = NIL;
  4315. n->definition = $4;
  4316. $$ = (Node *)n;
  4317. }
  4318. | CREATE OPERATOR any_operator definition
  4319. {
  4320. DefineStmt *n = makeNode(DefineStmt);
  4321. n->kind = OBJECT_OPERATOR;
  4322. n->oldstyle = false;
  4323. n->defnames = $3;
  4324. n->args = NIL;
  4325. n->definition = $4;
  4326. $$ = (Node *)n;
  4327. }
  4328. | CREATE TYPE_P any_name definition
  4329. {
  4330. DefineStmt *n = makeNode(DefineStmt);
  4331. n->kind = OBJECT_TYPE;
  4332. n->oldstyle = false;
  4333. n->defnames = $3;
  4334. n->args = NIL;
  4335. n->definition = $4;
  4336. $$ = (Node *)n;
  4337. }
  4338. | CREATE TYPE_P any_name
  4339. {
  4340. /* Shell type (identified by lack of definition) */
  4341. DefineStmt *n = makeNode(DefineStmt);
  4342. n->kind = OBJECT_TYPE;
  4343. n->oldstyle = false;
  4344. n->defnames = $3;
  4345. n->args = NIL;
  4346. n->definition = NIL;
  4347. $$ = (Node *)n;
  4348. }
  4349. | CREATE TYPE_P any_name AS '(' OptTableFuncElementList ')'
  4350. {
  4351. CompositeTypeStmt *n = makeNode(CompositeTypeStmt);
  4352. /* can't use qualified_name, sigh */
  4353. n->typevar = makeRangeVarFromAnyName($3, @3, yyscanner);
  4354. n->coldeflist = $6;
  4355. $$ = (Node *)n;
  4356. }
  4357. | CREATE TYPE_P any_name AS ENUM_P '(' opt_enum_val_list ')'
  4358. {
  4359. CreateEnumStmt *n = makeNode(CreateEnumStmt);
  4360. n->typeName = $3;
  4361. n->vals = $7;
  4362. $$ = (Node *)n;
  4363. }
  4364. | CREATE TYPE_P any_name AS RANGE definition
  4365. {
  4366. CreateRangeStmt *n = makeNode(CreateRangeStmt);
  4367. n->typeName = $3;
  4368. n->params = $6;
  4369. $$ = (Node *)n;
  4370. }
  4371. | CREATE TEXT_P SEARCH PARSER any_name definition
  4372. {
  4373. DefineStmt *n = makeNode(DefineStmt);
  4374. n->kind = OBJECT_TSPARSER;
  4375. n->args = NIL;
  4376. n->defnames = $5;
  4377. n->definition = $6;
  4378. $$ = (Node *)n;
  4379. }
  4380. | CREATE TEXT_P SEARCH DICTIONARY any_name definition
  4381. {
  4382. DefineStmt *n = makeNode(DefineStmt);
  4383. n->kind = OBJECT_TSDICTIONARY;
  4384. n->args = NIL;
  4385. n->defnames = $5;
  4386. n->definition = $6;
  4387. $$ = (Node *)n;
  4388. }
  4389. | CREATE TEXT_P SEARCH TEMPLATE any_name definition
  4390. {
  4391. DefineStmt *n = makeNode(DefineStmt);
  4392. n->kind = OBJECT_TSTEMPLATE;
  4393. n->args = NIL;
  4394. n->defnames = $5;
  4395. n->definition = $6;
  4396. $$ = (Node *)n;
  4397. }
  4398. | CREATE TEXT_P SEARCH CONFIGURATION any_name definition
  4399. {
  4400. DefineStmt *n = makeNode(DefineStmt);
  4401. n->kind = OBJECT_TSCONFIGURATION;
  4402. n->args = NIL;
  4403. n->defnames = $5;
  4404. n->definition = $6;
  4405. $$ = (Node *)n;
  4406. }
  4407. | CREATE COLLATION any_name definition
  4408. {
  4409. DefineStmt *n = makeNode(DefineStmt);
  4410. n->kind = OBJECT_COLLATION;
  4411. n->args = NIL;
  4412. n->defnames = $3;
  4413. n->definition = $4;
  4414. $$ = (Node *)n;
  4415. }
  4416. | CREATE COLLATION any_name FROM any_name
  4417. {
  4418. DefineStmt *n = makeNode(DefineStmt);
  4419. n->kind = OBJECT_COLLATION;
  4420. n->args = NIL;
  4421. n->defnames = $3;
  4422. n->definition = list_make1(makeDefElem("from", (Node *) $5));
  4423. $$ = (Node *)n;
  4424. }
  4425. ;
  4426. definition: '(' def_list ')' { $$ = $2; }
  4427. ;
  4428. def_list: def_elem { $$ = list_make1($1); }
  4429. | def_list ',' def_elem { $$ = lappend($1, $3); }
  4430. ;
  4431. def_elem: ColLabel '=' def_arg
  4432. {
  4433. $$ = makeDefElem($1, (Node *) $3);
  4434. }
  4435. | ColLabel
  4436. {
  4437. $$ = makeDefElem($1, NULL);
  4438. }
  4439. ;
  4440. /* Note: any simple identifier will be returned as a type name! */
  4441. def_arg: func_type { $$ = (Node *)$1; }
  4442. | reserved_keyword { $$ = (Node *)makeString(pstrdup($1)); }
  4443. | qual_all_Op { $$ = (Node *)$1; }
  4444. | NumericOnly { $$ = (Node *)$1; }
  4445. | Sconst { $$ = (Node *)makeString($1); }
  4446. ;
  4447. old_aggr_definition: '(' old_aggr_list ')' { $$ = $2; }
  4448. ;
  4449. old_aggr_list: old_aggr_elem { $$ = list_make1($1); }
  4450. | old_aggr_list ',' old_aggr_elem { $$ = lappend($1, $3); }
  4451. ;
  4452. /*
  4453. * Must use IDENT here to avoid reduce/reduce conflicts; fortunately none of
  4454. * the item names needed in old aggregate definitions are likely to become
  4455. * SQL keywords.
  4456. */
  4457. old_aggr_elem: IDENT '=' def_arg
  4458. {
  4459. $$ = makeDefElem($1, (Node *)$3);
  4460. }
  4461. ;
  4462. opt_enum_val_list:
  4463. enum_val_list { $$ = $1; }
  4464. | /*EMPTY*/ { $$ = NIL; }
  4465. ;
  4466. enum_val_list: Sconst
  4467. { $$ = list_make1(makeString($1)); }
  4468. | enum_val_list ',' Sconst
  4469. { $$ = lappend($1, makeString($3)); }
  4470. ;
  4471. /*****************************************************************************
  4472. *
  4473. * ALTER TYPE enumtype ADD ...
  4474. *
  4475. *****************************************************************************/
  4476. AlterEnumStmt:
  4477. ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists Sconst
  4478. {
  4479. AlterEnumStmt *n = makeNode(AlterEnumStmt);
  4480. n->typeName = $3;
  4481. n->newVal = $7;
  4482. n->newValNeighbor = NULL;
  4483. n->newValIsAfter = true;
  4484. n->skipIfExists = $6;
  4485. $$ = (Node *) n;
  4486. }
  4487. | ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists Sconst BEFORE Sconst
  4488. {
  4489. AlterEnumStmt *n = makeNode(AlterEnumStmt);
  4490. n->typeName = $3;
  4491. n->newVal = $7;
  4492. n->newValNeighbor = $9;
  4493. n->newValIsAfter = false;
  4494. n->skipIfExists = $6;
  4495. $$ = (Node *) n;
  4496. }
  4497. | ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists Sconst AFTER Sconst
  4498. {
  4499. AlterEnumStmt *n = makeNode(AlterEnumStmt);
  4500. n->typeName = $3;
  4501. n->newVal = $7;
  4502. n->newValNeighbor = $9;
  4503. n->newValIsAfter = true;
  4504. n->skipIfExists = $6;
  4505. $$ = (Node *) n;
  4506. }
  4507. ;
  4508. opt_if_not_exists: IF_P NOT EXISTS { $$ = true; }
  4509. | /* empty */ { $$ = false; }
  4510. ;
  4511. /*****************************************************************************
  4512. *
  4513. * QUERIES :
  4514. * CREATE OPERATOR CLASS ...
  4515. * CREATE OPERATOR FAMILY ...
  4516. * ALTER OPERATOR FAMILY ...
  4517. * DROP OPERATOR CLASS ...
  4518. * DROP OPERATOR FAMILY ...
  4519. *
  4520. *****************************************************************************/
  4521. CreateOpClassStmt:
  4522. CREATE OPERATOR CLASS any_name opt_default FOR TYPE_P Typename
  4523. USING access_method opt_opfamily AS opclass_item_list
  4524. {
  4525. CreateOpClassStmt *n = makeNode(CreateOpClassStmt);
  4526. n->opclassname = $4;
  4527. n->isDefault = $5;
  4528. n->datatype = $8;
  4529. n->amname = $10;
  4530. n->opfamilyname = $11;
  4531. n->items = $13;
  4532. $$ = (Node *) n;
  4533. }
  4534. ;
  4535. opclass_item_list:
  4536. opclass_item { $$ = list_make1($1); }
  4537. | opclass_item_list ',' opclass_item { $$ = lappend($1, $3); }
  4538. ;
  4539. opclass_item:
  4540. OPERATOR Iconst any_operator opclass_purpose opt_recheck
  4541. {
  4542. CreateOpClassItem *n = makeNode(CreateOpClassItem);
  4543. n->itemtype = OPCLASS_ITEM_OPERATOR;
  4544. n->name = $3;
  4545. n->args = NIL;
  4546. n->number = $2;
  4547. n->order_family = $4;
  4548. $$ = (Node *) n;
  4549. }
  4550. | OPERATOR Iconst any_operator oper_argtypes opclass_purpose
  4551. opt_recheck
  4552. {
  4553. CreateOpClassItem *n = makeNode(CreateOpClassItem);
  4554. n->itemtype = OPCLASS_ITEM_OPERATOR;
  4555. n->name = $3;
  4556. n->args = $4;
  4557. n->number = $2;
  4558. n->order_family = $5;
  4559. $$ = (Node *) n;
  4560. }
  4561. | FUNCTION Iconst func_name func_args
  4562. {
  4563. CreateOpClassItem *n = makeNode(CreateOpClassItem);
  4564. n->itemtype = OPCLASS_ITEM_FUNCTION;
  4565. n->name = $3;
  4566. n->args = extractArgTypes($4);
  4567. n->number = $2;
  4568. $$ = (Node *) n;
  4569. }
  4570. | FUNCTION Iconst '(' type_list ')' func_name func_args
  4571. {
  4572. CreateOpClassItem *n = makeNode(CreateOpClassItem);
  4573. n->itemtype = OPCLASS_ITEM_FUNCTION;
  4574. n->name = $6;
  4575. n->args = extractArgTypes($7);
  4576. n->number = $2;
  4577. n->class_args = $4;
  4578. $$ = (Node *) n;
  4579. }
  4580. | STORAGE Typename
  4581. {
  4582. CreateOpClassItem *n = makeNode(CreateOpClassItem);
  4583. n->itemtype = OPCLASS_ITEM_STORAGETYPE;
  4584. n->storedtype = $2;
  4585. $$ = (Node *) n;
  4586. }
  4587. ;
  4588. opt_default: DEFAULT { $$ = TRUE; }
  4589. | /*EMPTY*/ { $$ = FALSE; }
  4590. ;
  4591. opt_opfamily: FAMILY any_name { $$ = $2; }
  4592. | /*EMPTY*/ { $$ = NIL; }
  4593. ;
  4594. opclass_purpose: FOR SEARCH { $$ = NIL; }
  4595. | FOR ORDER BY any_name { $$ = $4; }
  4596. | /*EMPTY*/ { $$ = NIL; }
  4597. ;
  4598. opt_recheck: RECHECK
  4599. {
  4600. /*
  4601. * RECHECK no longer does anything in opclass definitions,
  4602. * but we still accept it to ease porting of old database
  4603. * dumps.
  4604. */
  4605. ereport(NOTICE,
  4606. (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
  4607. errmsg("RECHECK is no longer required"),
  4608. errhint("Update your data type."),
  4609. parser_errposition(@1)));
  4610. $$ = TRUE;
  4611. }
  4612. | /*EMPTY*/ { $$ = FALSE; }
  4613. ;
  4614. CreateOpFamilyStmt:
  4615. CREATE OPERATOR FAMILY any_name USING access_method
  4616. {
  4617. CreateOpFamilyStmt *n = makeNode(CreateOpFamilyStmt);
  4618. n->opfamilyname = $4;
  4619. n->amname = $6;
  4620. $$ = (Node *) n;
  4621. }
  4622. ;
  4623. AlterOpFamilyStmt:
  4624. ALTER OPERATOR FAMILY any_name USING access_method ADD_P opclass_item_list
  4625. {
  4626. AlterOpFamilyStmt *n = makeNode(AlterOpFamilyStmt);
  4627. n->opfamilyname = $4;
  4628. n->amname = $6;
  4629. n->isDrop = false;
  4630. n->items = $8;
  4631. $$ = (Node *) n;
  4632. }
  4633. | ALTER OPERATOR FAMILY any_name USING access_method DROP opclass_drop_list
  4634. {
  4635. AlterOpFamilyStmt *n = makeNode(AlterOpFamilyStmt);
  4636. n->opfamilyname = $4;
  4637. n->amname = $6;
  4638. n->isDrop = true;
  4639. n->items = $8;
  4640. $$ = (Node *) n;
  4641. }
  4642. ;
  4643. opclass_drop_list:
  4644. opclass_drop { $$ = list_make1($1); }
  4645. | opclass_drop_list ',' opclass_drop { $$ = lappend($1, $3); }
  4646. ;
  4647. opclass_drop:
  4648. OPERATOR Iconst '(' type_list ')'
  4649. {
  4650. CreateOpClassItem *n = makeNode(CreateOpClassItem);
  4651. n->itemtype = OPCLASS_ITEM_OPERATOR;
  4652. n->number = $2;
  4653. n->args = $4;
  4654. $$ = (Node *) n;
  4655. }
  4656. | FUNCTION Iconst '(' type_list ')'
  4657. {
  4658. CreateOpClassItem *n = makeNode(CreateOpClassItem);
  4659. n->itemtype = OPCLASS_ITEM_FUNCTION;
  4660. n->number = $2;
  4661. n->args = $4;
  4662. $$ = (Node *) n;
  4663. }
  4664. ;
  4665. DropOpClassStmt:
  4666. DROP OPERATOR CLASS any_name USING access_method opt_drop_behavior
  4667. {
  4668. DropStmt *n = makeNode(DropStmt);
  4669. n->objects = list_make1($4);
  4670. n->arguments = list_make1(list_make1(makeString($6)));
  4671. n->removeType = OBJECT_OPCLASS;
  4672. n->behavior = $7;
  4673. n->missing_ok = false;
  4674. n->concurrent = false;
  4675. $$ = (Node *) n;
  4676. }
  4677. | DROP OPERATOR CLASS IF_P EXISTS any_name USING access_method opt_drop_behavior
  4678. {
  4679. DropStmt *n = makeNode(DropStmt);
  4680. n->objects = list_make1($6);
  4681. n->arguments = list_make1(list_make1(makeString($8)));
  4682. n->removeType = OBJECT_OPCLASS;
  4683. n->behavior = $9;
  4684. n->missing_ok = true;
  4685. n->concurrent = false;
  4686. $$ = (Node *) n;
  4687. }
  4688. ;
  4689. DropOpFamilyStmt:
  4690. DROP OPERATOR FAMILY any_name USING access_method opt_drop_behavior
  4691. {
  4692. DropStmt *n = makeNode(DropStmt);
  4693. n->objects = list_make1($4);
  4694. n->arguments = list_make1(list_make1(makeString($6)));
  4695. n->removeType = OBJECT_OPFAMILY;
  4696. n->behavior = $7;
  4697. n->missing_ok = false;
  4698. n->concurrent = false;
  4699. $$ = (Node *) n;
  4700. }
  4701. | DROP OPERATOR FAMILY IF_P EXISTS any_name USING access_method opt_drop_behavior
  4702. {
  4703. DropStmt *n = makeNode(DropStmt);
  4704. n->objects = list_make1($6);
  4705. n->arguments = list_make1(list_make1(makeString($8)));
  4706. n->removeType = OBJECT_OPFAMILY;
  4707. n->behavior = $9;
  4708. n->missing_ok = true;
  4709. n->concurrent = false;
  4710. $$ = (Node *) n;
  4711. }
  4712. ;
  4713. /*****************************************************************************
  4714. *
  4715. * QUERY:
  4716. *
  4717. * DROP OWNED BY username [, username ...] [ RESTRICT | CASCADE ]
  4718. * REASSIGN OWNED BY username [, username ...] TO username
  4719. *
  4720. *****************************************************************************/
  4721. DropOwnedStmt:
  4722. DROP OWNED BY role_list opt_drop_behavior
  4723. {
  4724. DropOwnedStmt *n = makeNode(DropOwnedStmt);
  4725. n->roles = $4;
  4726. n->behavior = $5;
  4727. $$ = (Node *)n;
  4728. }
  4729. ;
  4730. ReassignOwnedStmt:
  4731. REASSIGN OWNED BY role_list TO name
  4732. {
  4733. ReassignOwnedStmt *n = makeNode(ReassignOwnedStmt);
  4734. n->roles = $4;
  4735. n->newrole = $6;
  4736. $$ = (Node *)n;
  4737. }
  4738. ;
  4739. /*****************************************************************************
  4740. *
  4741. * QUERY:
  4742. *
  4743. * DROP itemtype [ IF EXISTS ] itemname [, itemname ...]
  4744. * [ RESTRICT | CASCADE ]
  4745. *
  4746. *****************************************************************************/
  4747. DropStmt: DROP drop_type IF_P EXISTS any_name_list opt_drop_behavior
  4748. {
  4749. DropStmt *n = makeNode(DropStmt);
  4750. n->removeType = $2;
  4751. n->missing_ok = TRUE;
  4752. n->objects = $5;
  4753. n->arguments = NIL;
  4754. n->behavior = $6;
  4755. n->concurrent = false;
  4756. $$ = (Node *)n;
  4757. }
  4758. | DROP drop_type any_name_list opt_drop_behavior
  4759. {
  4760. DropStmt *n = makeNode(DropStmt);
  4761. n->removeType = $2;
  4762. n->missing_ok = FALSE;
  4763. n->objects = $3;
  4764. n->arguments = NIL;
  4765. n->behavior = $4;
  4766. n->concurrent = false;
  4767. $$ = (Node *)n;
  4768. }
  4769. | DROP INDEX CONCURRENTLY any_name_list opt_drop_behavior
  4770. {
  4771. DropStmt *n = makeNode(DropStmt);
  4772. n->removeType = OBJECT_INDEX;
  4773. n->missing_ok = FALSE;
  4774. n->objects = $4;
  4775. n->arguments = NIL;
  4776. n->behavior = $5;
  4777. n->concurrent = true;
  4778. $$ = (Node *)n;
  4779. }
  4780. | DROP INDEX CONCURRENTLY IF_P EXISTS any_name_list opt_drop_behavior
  4781. {
  4782. DropStmt *n = makeNode(DropStmt);
  4783. n->removeType = OBJECT_INDEX;
  4784. n->missing_ok = TRUE;
  4785. n->objects = $6;
  4786. n->arguments = NIL;
  4787. n->behavior = $7;
  4788. n->concurrent = true;
  4789. $$ = (Node *)n;
  4790. }
  4791. ;
  4792. drop_type: TABLE { $$ = OBJECT_TABLE; }
  4793. | SEQUENCE { $$ = OBJECT_SEQUENCE; }
  4794. | VIEW { $$ = OBJECT_VIEW; }
  4795. | MATERIALIZED VIEW { $$ = OBJECT_MATVIEW; }
  4796. | INDEX { $$ = OBJECT_INDEX; }
  4797. | FOREIGN TABLE { $$ = OBJECT_FOREIGN_TABLE; }
  4798. | EVENT TRIGGER { $$ = OBJECT_EVENT_TRIGGER; }
  4799. | TYPE_P { $$ = OBJECT_TYPE; }
  4800. | DOMAIN_P { $$ = OBJECT_DOMAIN; }
  4801. | COLLATION { $$ = OBJECT_COLLATION; }
  4802. | CONVERSION_P { $$ = OBJECT_CONVERSION; }
  4803. | SCHEMA { $$ = OBJECT_SCHEMA; }
  4804. | EXTENSION { $$ = OBJECT_EXTENSION; }
  4805. | TEXT_P SEARCH PARSER { $$ = OBJECT_TSPARSER; }
  4806. | TEXT_P SEARCH DICTIONARY { $$ = OBJECT_TSDICTIONARY; }
  4807. | TEXT_P SEARCH TEMPLATE { $$ = OBJECT_TSTEMPLATE; }
  4808. | TEXT_P SEARCH CONFIGURATION { $$ = OBJECT_TSCONFIGURATION; }
  4809. ;
  4810. any_name_list:
  4811. any_name { $$ = list_make1($1); }
  4812. | any_name_list ',' any_name { $$ = lappend($1, $3); }
  4813. ;
  4814. any_name: ColId { $$ = list_make1(makeString($1)); }
  4815. | ColId attrs { $$ = lcons(makeString($1), $2); }
  4816. ;
  4817. attrs: '.' attr_name
  4818. { $$ = list_make1(makeString($2)); }
  4819. | attrs '.' attr_name
  4820. { $$ = lappend($1, makeString($3)); }
  4821. ;
  4822. /*****************************************************************************
  4823. *
  4824. * QUERY:
  4825. * truncate table relname1, relname2, ...
  4826. *
  4827. *****************************************************************************/
  4828. TruncateStmt:
  4829. TRUNCATE opt_table relation_expr_list opt_restart_seqs opt_drop_behavior
  4830. {
  4831. TruncateStmt *n = makeNode(TruncateStmt);
  4832. n->relations = $3;
  4833. n->restart_seqs = $4;
  4834. n->behavior = $5;
  4835. $$ = (Node *)n;
  4836. }
  4837. ;
  4838. opt_restart_seqs:
  4839. CONTINUE_P IDENTITY_P { $$ = false; }
  4840. | RESTART IDENTITY_P { $$ = true; }
  4841. | /* EMPTY */ { $$ = false; }
  4842. ;
  4843. /*****************************************************************************
  4844. *
  4845. * The COMMENT ON statement can take different forms based upon the type of
  4846. * the object associated with the comment. The form of the statement is:
  4847. *
  4848. * COMMENT ON [ [ CONVERSION | COLLATION | DATABASE | DOMAIN |
  4849. * EXTENSION | EVENT TRIGGER | FOREIGN DATA WRAPPER |
  4850. * FOREIGN TABLE | INDEX | [PROCEDURAL] LANGUAGE |
  4851. * MATERIALIZED VIEW | ROLE | SCHEMA | SEQUENCE |
  4852. * SERVER | TABLE | TABLESPACE |
  4853. * TEXT SEARCH CONFIGURATION | TEXT SEARCH DICTIONARY |
  4854. * TEXT SEARCH PARSER | TEXT SEARCH TEMPLATE | TYPE |
  4855. * VIEW] <objname> |
  4856. * AGGREGATE <aggname> (arg1, ...) |
  4857. * CAST (<src type> AS <dst type>) |
  4858. * COLUMN <relname>.<colname> |
  4859. * CONSTRAINT <constraintname> ON <relname> |
  4860. * FUNCTION <funcname> (arg1, arg2, ...) |
  4861. * LARGE OBJECT <oid> |
  4862. * OPERATOR <op> (leftoperand_typ, rightoperand_typ) |
  4863. * OPERATOR CLASS <name> USING <access-method> |
  4864. * OPERATOR FAMILY <name> USING <access-method> |
  4865. * RULE <rulename> ON <relname> |
  4866. * TRIGGER <triggername> ON <relname> ]
  4867. * IS 'text'
  4868. *
  4869. *****************************************************************************/
  4870. CommentStmt:
  4871. COMMENT ON comment_type any_name IS comment_text
  4872. {
  4873. CommentStmt *n = makeNode(CommentStmt);
  4874. n->objtype = $3;
  4875. n->objname = $4;
  4876. n->objargs = NIL;
  4877. n->comment = $6;
  4878. $$ = (Node *) n;
  4879. }
  4880. | COMMENT ON AGGREGATE func_name aggr_args IS comment_text
  4881. {
  4882. CommentStmt *n = makeNode(CommentStmt);
  4883. n->objtype = OBJECT_AGGREGATE;
  4884. n->objname = $4;
  4885. n->objargs = extractAggrArgTypes($5);
  4886. n->comment = $7;
  4887. $$ = (Node *) n;
  4888. }
  4889. | COMMENT ON FUNCTION func_name func_args IS comment_text
  4890. {
  4891. CommentStmt *n = makeNode(CommentStmt);
  4892. n->objtype = OBJECT_FUNCTION;
  4893. n->objname = $4;
  4894. n->objargs = extractArgTypes($5);
  4895. n->comment = $7;
  4896. $$ = (Node *) n;
  4897. }
  4898. | COMMENT ON OPERATOR any_operator oper_argtypes IS comment_text
  4899. {
  4900. CommentStmt *n = makeNode(CommentStmt);
  4901. n->objtype = OBJECT_OPERATOR;
  4902. n->objname = $4;
  4903. n->objargs = $5;
  4904. n->comment = $7;
  4905. $$ = (Node *) n;
  4906. }
  4907. | COMMENT ON CONSTRAINT name ON any_name IS comment_text
  4908. {
  4909. CommentStmt *n = makeNode(CommentStmt);
  4910. n->objtype = OBJECT_CONSTRAINT;
  4911. n->objname = lappend($6, makeString($4));
  4912. n->objargs = NIL;
  4913. n->comment = $8;
  4914. $$ = (Node *) n;
  4915. }
  4916. | COMMENT ON RULE name ON any_name IS comment_text
  4917. {
  4918. CommentStmt *n = makeNode(CommentStmt);
  4919. n->objtype = OBJECT_RULE;
  4920. n->objname = lappend($6, makeString($4));
  4921. n->objargs = NIL;
  4922. n->comment = $8;
  4923. $$ = (Node *) n;
  4924. }
  4925. | COMMENT ON RULE name IS comment_text
  4926. {
  4927. /* Obsolete syntax supported for awhile for compatibility */
  4928. CommentStmt *n = makeNode(CommentStmt);
  4929. n->objtype = OBJECT_RULE;
  4930. n->objname = list_make1(makeString($4));
  4931. n->objargs = NIL;
  4932. n->comment = $6;
  4933. $$ = (Node *) n;
  4934. }
  4935. | COMMENT ON TRIGGER name ON any_name IS comment_text
  4936. {
  4937. CommentStmt *n = makeNode(CommentStmt);
  4938. n->objtype = OBJECT_TRIGGER;
  4939. n->objname = lappend($6, makeString($4));
  4940. n->objargs = NIL;
  4941. n->comment = $8;
  4942. $$ = (Node *) n;
  4943. }
  4944. | COMMENT ON OPERATOR CLASS any_name USING access_method IS comment_text
  4945. {
  4946. CommentStmt *n = makeNode(CommentStmt);
  4947. n->objtype = OBJECT_OPCLASS;
  4948. n->objname = $5;
  4949. n->objargs = list_make1(makeString($7));
  4950. n->comment = $9;
  4951. $$ = (Node *) n;
  4952. }
  4953. | COMMENT ON OPERATOR FAMILY any_name USING access_method IS comment_text
  4954. {
  4955. CommentStmt *n = makeNode(CommentStmt);
  4956. n->objtype = OBJECT_OPFAMILY;
  4957. n->objname = $5;
  4958. n->objargs = list_make1(makeString($7));
  4959. n->comment = $9;
  4960. $$ = (Node *) n;
  4961. }
  4962. | COMMENT ON LARGE_P OBJECT_P NumericOnly IS comment_text
  4963. {
  4964. CommentStmt *n = makeNode(CommentStmt);
  4965. n->objtype = OBJECT_LARGEOBJECT;
  4966. n->objname = list_make1($5);
  4967. n->objargs = NIL;
  4968. n->comment = $7;
  4969. $$ = (Node *) n;
  4970. }
  4971. | COMMENT ON CAST '(' Typename AS Typename ')' IS comment_text
  4972. {
  4973. CommentStmt *n = makeNode(CommentStmt);
  4974. n->objtype = OBJECT_CAST;
  4975. n->objname = list_make1($5);
  4976. n->objargs = list_make1($7);
  4977. n->comment = $10;
  4978. $$ = (Node *) n;
  4979. }
  4980. | COMMENT ON opt_procedural LANGUAGE any_name IS comment_text
  4981. {
  4982. CommentStmt *n = makeNode(CommentStmt);
  4983. n->objtype = OBJECT_LANGUAGE;
  4984. n->objname = $5;
  4985. n->objargs = NIL;
  4986. n->comment = $7;
  4987. $$ = (Node *) n;
  4988. }
  4989. ;
  4990. comment_type:
  4991. COLUMN { $$ = OBJECT_COLUMN; }
  4992. | DATABASE { $$ = OBJECT_DATABASE; }
  4993. | SCHEMA { $$ = OBJECT_SCHEMA; }
  4994. | INDEX { $$ = OBJECT_INDEX; }
  4995. | SEQUENCE { $$ = OBJECT_SEQUENCE; }
  4996. | TABLE { $$ = OBJECT_TABLE; }
  4997. | DOMAIN_P { $$ = OBJECT_DOMAIN; }
  4998. | TYPE_P { $$ = OBJECT_TYPE; }
  4999. | VIEW { $$ = OBJECT_VIEW; }
  5000. | MATERIALIZED VIEW { $$ = OBJECT_MATVIEW; }
  5001. | COLLATION { $$ = OBJECT_COLLATION; }
  5002. | CONVERSION_P { $$ = OBJECT_CONVERSION; }
  5003. | TABLESPACE { $$ = OBJECT_TABLESPACE; }
  5004. | EXTENSION { $$ = OBJECT_EXTENSION; }
  5005. | ROLE { $$ = OBJECT_ROLE; }
  5006. | FOREIGN TABLE { $$ = OBJECT_FOREIGN_TABLE; }
  5007. | SERVER { $$ = OBJECT_FOREIGN_SERVER; }
  5008. | FOREIGN DATA_P WRAPPER { $$ = OBJECT_FDW; }
  5009. | EVENT TRIGGER { $$ = OBJECT_EVENT_TRIGGER; }
  5010. | TEXT_P SEARCH CONFIGURATION { $$ = OBJECT_TSCONFIGURATION; }
  5011. | TEXT_P SEARCH DICTIONARY { $$ = OBJECT_TSDICTIONARY; }
  5012. | TEXT_P SEARCH PARSER { $$ = OBJECT_TSPARSER; }
  5013. | TEXT_P SEARCH TEMPLATE { $$ = OBJECT_TSTEMPLATE; }
  5014. ;
  5015. comment_text:
  5016. Sconst { $$ = $1; }
  5017. | NULL_P { $$ = NULL; }
  5018. ;
  5019. /*****************************************************************************
  5020. *
  5021. * SECURITY LABEL [FOR <provider>] ON <object> IS <label>
  5022. *
  5023. * As with COMMENT ON, <object> can refer to various types of database
  5024. * objects (e.g. TABLE, COLUMN, etc.).
  5025. *
  5026. *****************************************************************************/
  5027. SecLabelStmt:
  5028. SECURITY LABEL opt_provider ON security_label_type any_name
  5029. IS security_label
  5030. {
  5031. SecLabelStmt *n = makeNode(SecLabelStmt);
  5032. n->provider = $3;
  5033. n->objtype = $5;
  5034. n->objname = $6;
  5035. n->objargs = NIL;
  5036. n->label = $8;
  5037. $$ = (Node *) n;
  5038. }
  5039. | SECURITY LABEL opt_provider ON AGGREGATE func_name aggr_args
  5040. IS security_label
  5041. {
  5042. SecLabelStmt *n = makeNode(SecLabelStmt);
  5043. n->provider = $3;
  5044. n->objtype = OBJECT_AGGREGATE;
  5045. n->objname = $6;
  5046. n->objargs = extractAggrArgTypes($7);
  5047. n->label = $9;
  5048. $$ = (Node *) n;
  5049. }
  5050. | SECURITY LABEL opt_provider ON FUNCTION func_name func_args
  5051. IS security_label
  5052. {
  5053. SecLabelStmt *n = makeNode(SecLabelStmt);
  5054. n->provider = $3;
  5055. n->objtype = OBJECT_FUNCTION;
  5056. n->objname = $6;
  5057. n->objargs = extractArgTypes($7);
  5058. n->label = $9;
  5059. $$ = (Node *) n;
  5060. }
  5061. | SECURITY LABEL opt_provider ON LARGE_P OBJECT_P NumericOnly
  5062. IS security_label
  5063. {
  5064. SecLabelStmt *n = makeNode(SecLabelStmt);
  5065. n->provider = $3;
  5066. n->objtype = OBJECT_LARGEOBJECT;
  5067. n->objname = list_make1($7);
  5068. n->objargs = NIL;
  5069. n->label = $9;
  5070. $$ = (Node *) n;
  5071. }
  5072. | SECURITY LABEL opt_provider ON opt_procedural LANGUAGE any_name
  5073. IS security_label
  5074. {
  5075. SecLabelStmt *n = makeNode(SecLabelStmt);
  5076. n->provider = $3;
  5077. n->objtype = OBJECT_LANGUAGE;
  5078. n->objname = $7;
  5079. n->objargs = NIL;
  5080. n->label = $9;
  5081. $$ = (Node *) n;
  5082. }
  5083. ;
  5084. opt_provider: FOR NonReservedWord_or_Sconst { $$ = $2; }
  5085. | /* empty */ { $$ = NULL; }
  5086. ;
  5087. security_label_type:
  5088. COLUMN { $$ = OBJECT_COLUMN; }
  5089. | DATABASE { $$ = OBJECT_DATABASE; }
  5090. | EVENT TRIGGER { $$ = OBJECT_EVENT_TRIGGER; }
  5091. | FOREIGN TABLE { $$ = OBJECT_FOREIGN_TABLE; }
  5092. | SCHEMA { $$ = OBJECT_SCHEMA; }
  5093. | SEQUENCE { $$ = OBJECT_SEQUENCE; }
  5094. | TABLE { $$ = OBJECT_TABLE; }
  5095. | DOMAIN_P { $$ = OBJECT_TYPE; }
  5096. | ROLE { $$ = OBJECT_ROLE; }
  5097. | TABLESPACE { $$ = OBJECT_TABLESPACE; }
  5098. | TYPE_P { $$ = OBJECT_TYPE; }
  5099. | VIEW { $$ = OBJECT_VIEW; }
  5100. | MATERIALIZED VIEW { $$ = OBJECT_MATVIEW; }
  5101. ;
  5102. security_label: Sconst { $$ = $1; }
  5103. | NULL_P { $$ = NULL; }
  5104. ;
  5105. /*****************************************************************************
  5106. *
  5107. * QUERY:
  5108. * fetch/move
  5109. *
  5110. *****************************************************************************/
  5111. FetchStmt: FETCH fetch_args
  5112. {
  5113. FetchStmt *n = (FetchStmt *) $2;
  5114. n->ismove = FALSE;
  5115. $$ = (Node *)n;
  5116. }
  5117. | MOVE fetch_args
  5118. {
  5119. FetchStmt *n = (FetchStmt *) $2;
  5120. n->ismove = TRUE;
  5121. $$ = (Node *)n;
  5122. }
  5123. ;
  5124. fetch_args: cursor_name
  5125. {
  5126. FetchStmt *n = makeNode(FetchStmt);
  5127. n->portalname = $1;
  5128. n->direction = FETCH_FORWARD;
  5129. n->howMany = 1;
  5130. $$ = (Node *)n;
  5131. }
  5132. | from_in cursor_name
  5133. {
  5134. FetchStmt *n = makeNode(FetchStmt);
  5135. n->portalname = $2;
  5136. n->direction = FETCH_FORWARD;
  5137. n->howMany = 1;
  5138. $$ = (Node *)n;
  5139. }
  5140. | NEXT opt_from_in cursor_name
  5141. {
  5142. FetchStmt *n = makeNode(FetchStmt);
  5143. n->portalname = $3;
  5144. n->direction = FETCH_FORWARD;
  5145. n->howMany = 1;
  5146. $$ = (Node *)n;
  5147. }
  5148. | PRIOR opt_from_in cursor_name
  5149. {
  5150. FetchStmt *n = makeNode(FetchStmt);
  5151. n->portalname = $3;
  5152. n->direction = FETCH_BACKWARD;
  5153. n->howMany = 1;
  5154. $$ = (Node *)n;
  5155. }
  5156. | FIRST_P opt_from_in cursor_name
  5157. {
  5158. FetchStmt *n = makeNode(FetchStmt);
  5159. n->portalname = $3;
  5160. n->direction = FETCH_ABSOLUTE;
  5161. n->howMany = 1;
  5162. $$ = (Node *)n;
  5163. }
  5164. | LAST_P opt_from_in cursor_name
  5165. {
  5166. FetchStmt *n = makeNode(FetchStmt);
  5167. n->portalname = $3;
  5168. n->direction = FETCH_ABSOLUTE;
  5169. n->howMany = -1;
  5170. $$ = (Node *)n;
  5171. }
  5172. | ABSOLUTE_P SignedIconst opt_from_in cursor_name
  5173. {
  5174. FetchStmt *n = makeNode(FetchStmt);
  5175. n->portalname = $4;
  5176. n->direction = FETCH_ABSOLUTE;
  5177. n->howMany = $2;
  5178. $$ = (Node *)n;
  5179. }
  5180. | RELATIVE_P SignedIconst opt_from_in cursor_name
  5181. {
  5182. FetchStmt *n = makeNode(FetchStmt);
  5183. n->portalname = $4;
  5184. n->direction = FETCH_RELATIVE;
  5185. n->howMany = $2;
  5186. $$ = (Node *)n;
  5187. }
  5188. | SignedIconst opt_from_in cursor_name
  5189. {
  5190. FetchStmt *n = makeNode(FetchStmt);
  5191. n->portalname = $3;
  5192. n->direction = FETCH_FORWARD;
  5193. n->howMany = $1;
  5194. $$ = (Node *)n;
  5195. }
  5196. | ALL opt_from_in cursor_name
  5197. {
  5198. FetchStmt *n = makeNode(FetchStmt);
  5199. n->portalname = $3;
  5200. n->direction = FETCH_FORWARD;
  5201. n->howMany = FETCH_ALL;
  5202. $$ = (Node *)n;
  5203. }
  5204. | FORWARD opt_from_in cursor_name
  5205. {
  5206. FetchStmt *n = makeNode(FetchStmt);
  5207. n->portalname = $3;
  5208. n->direction = FETCH_FORWARD;
  5209. n->howMany = 1;
  5210. $$ = (Node *)n;
  5211. }
  5212. | FORWARD SignedIconst opt_from_in cursor_name
  5213. {
  5214. FetchStmt *n = makeNode(FetchStmt);
  5215. n->portalname = $4;
  5216. n->direction = FETCH_FORWARD;
  5217. n->howMany = $2;
  5218. $$ = (Node *)n;
  5219. }
  5220. | FORWARD ALL opt_from_in cursor_name
  5221. {
  5222. FetchStmt *n = makeNode(FetchStmt);
  5223. n->portalname = $4;
  5224. n->direction = FETCH_FORWARD;
  5225. n->howMany = FETCH_ALL;
  5226. $$ = (Node *)n;
  5227. }
  5228. | BACKWARD opt_from_in cursor_name
  5229. {
  5230. FetchStmt *n = makeNode(FetchStmt);
  5231. n->portalname = $3;
  5232. n->direction = FETCH_BACKWARD;
  5233. n->howMany = 1;
  5234. $$ = (Node *)n;
  5235. }
  5236. | BACKWARD SignedIconst opt_from_in cursor_name
  5237. {
  5238. FetchStmt *n = makeNode(FetchStmt);
  5239. n->portalname = $4;
  5240. n->direction = FETCH_BACKWARD;
  5241. n->howMany = $2;
  5242. $$ = (Node *)n;
  5243. }
  5244. | BACKWARD ALL opt_from_in cursor_name
  5245. {
  5246. FetchStmt *n = makeNode(FetchStmt);
  5247. n->portalname = $4;
  5248. n->direction = FETCH_BACKWARD;
  5249. n->howMany = FETCH_ALL;
  5250. $$ = (Node *)n;
  5251. }
  5252. ;
  5253. from_in: FROM {}
  5254. | IN_P {}
  5255. ;
  5256. opt_from_in: from_in {}
  5257. | /* EMPTY */ {}
  5258. ;
  5259. /*****************************************************************************
  5260. *
  5261. * GRANT and REVOKE statements
  5262. *
  5263. *****************************************************************************/
  5264. GrantStmt: GRANT privileges ON privilege_target TO grantee_list
  5265. opt_grant_grant_option
  5266. {
  5267. GrantStmt *n = makeNode(GrantStmt);
  5268. n->is_grant = true;
  5269. n->privileges = $2;
  5270. n->targtype = ($4)->targtype;
  5271. n->objtype = ($4)->objtype;
  5272. n->objects = ($4)->objs;
  5273. n->grantees = $6;
  5274. n->grant_option = $7;
  5275. $$ = (Node*)n;
  5276. }
  5277. ;
  5278. RevokeStmt:
  5279. REVOKE privileges ON privilege_target
  5280. FROM grantee_list opt_drop_behavior
  5281. {
  5282. GrantStmt *n = makeNode(GrantStmt);
  5283. n->is_grant = false;
  5284. n->grant_option = false;
  5285. n->privileges = $2;
  5286. n->targtype = ($4)->targtype;
  5287. n->objtype = ($4)->objtype;
  5288. n->objects = ($4)->objs;
  5289. n->grantees = $6;
  5290. n->behavior = $7;
  5291. $$ = (Node *)n;
  5292. }
  5293. | REVOKE GRANT OPTION FOR privileges ON privilege_target
  5294. FROM grantee_list opt_drop_behavior
  5295. {
  5296. GrantStmt *n = makeNode(GrantStmt);
  5297. n->is_grant = false;
  5298. n->grant_option = true;
  5299. n->privileges = $5;
  5300. n->targtype = ($7)->targtype;
  5301. n->objtype = ($7)->objtype;
  5302. n->objects = ($7)->objs;
  5303. n->grantees = $9;
  5304. n->behavior = $10;
  5305. $$ = (Node *)n;
  5306. }
  5307. ;
  5308. /*
  5309. * Privilege names are represented as strings; the validity of the privilege
  5310. * names gets checked at execution. This is a bit annoying but we have little
  5311. * choice because of the syntactic conflict with lists of role names in
  5312. * GRANT/REVOKE. What's more, we have to call out in the "privilege"
  5313. * production any reserved keywords that need to be usable as privilege names.
  5314. */
  5315. /* either ALL [PRIVILEGES] or a list of individual privileges */
  5316. privileges: privilege_list
  5317. { $$ = $1; }
  5318. | ALL
  5319. { $$ = NIL; }
  5320. | ALL PRIVILEGES
  5321. { $$ = NIL; }
  5322. | ALL '(' columnList ')'
  5323. {
  5324. AccessPriv *n = makeNode(AccessPriv);
  5325. n->priv_name = NULL;
  5326. n->cols = $3;
  5327. $$ = list_make1(n);
  5328. }
  5329. | ALL PRIVILEGES '(' columnList ')'
  5330. {
  5331. AccessPriv *n = makeNode(AccessPriv);
  5332. n->priv_name = NULL;
  5333. n->cols = $4;
  5334. $$ = list_make1(n);
  5335. }
  5336. ;
  5337. privilege_list: privilege { $$ = list_make1($1); }
  5338. | privilege_list ',' privilege { $$ = lappend($1, $3); }
  5339. ;
  5340. privilege: SELECT opt_column_list
  5341. {
  5342. AccessPriv *n = makeNode(AccessPriv);
  5343. n->priv_name = pstrdup($1);
  5344. n->cols = $2;
  5345. $$ = n;
  5346. }
  5347. | REFERENCES opt_column_list
  5348. {
  5349. AccessPriv *n = makeNode(AccessPriv);
  5350. n->priv_name = pstrdup($1);
  5351. n->cols = $2;
  5352. $$ = n;
  5353. }
  5354. | CREATE opt_column_list
  5355. {
  5356. AccessPriv *n = makeNode(AccessPriv);
  5357. n->priv_name = pstrdup($1);
  5358. n->cols = $2;
  5359. $$ = n;
  5360. }
  5361. | ColId opt_column_list
  5362. {
  5363. AccessPriv *n = makeNode(AccessPriv);
  5364. n->priv_name = $1;
  5365. n->cols = $2;
  5366. $$ = n;
  5367. }
  5368. ;
  5369. /* Don't bother trying to fold the first two rules into one using
  5370. * opt_table. You're going to get conflicts.
  5371. */
  5372. privilege_target:
  5373. qualified_name_list
  5374. {
  5375. PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  5376. n->targtype = ACL_TARGET_OBJECT;
  5377. n->objtype = ACL_OBJECT_RELATION;
  5378. n->objs = $1;
  5379. $$ = n;
  5380. }
  5381. | TABLE qualified_name_list
  5382. {
  5383. PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  5384. n->targtype = ACL_TARGET_OBJECT;
  5385. n->objtype = ACL_OBJECT_RELATION;
  5386. n->objs = $2;
  5387. $$ = n;
  5388. }
  5389. | SEQUENCE qualified_name_list
  5390. {
  5391. PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  5392. n->targtype = ACL_TARGET_OBJECT;
  5393. n->objtype = ACL_OBJECT_SEQUENCE;
  5394. n->objs = $2;
  5395. $$ = n;
  5396. }
  5397. | FOREIGN DATA_P WRAPPER name_list
  5398. {
  5399. PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  5400. n->targtype = ACL_TARGET_OBJECT;
  5401. n->objtype = ACL_OBJECT_FDW;
  5402. n->objs = $4;
  5403. $$ = n;
  5404. }
  5405. | FOREIGN SERVER name_list
  5406. {
  5407. PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  5408. n->targtype = ACL_TARGET_OBJECT;
  5409. n->objtype = ACL_OBJECT_FOREIGN_SERVER;
  5410. n->objs = $3;
  5411. $$ = n;
  5412. }
  5413. | FUNCTION function_with_argtypes_list
  5414. {
  5415. PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  5416. n->targtype = ACL_TARGET_OBJECT;
  5417. n->objtype = ACL_OBJECT_FUNCTION;
  5418. n->objs = $2;
  5419. $$ = n;
  5420. }
  5421. | DATABASE name_list
  5422. {
  5423. PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  5424. n->targtype = ACL_TARGET_OBJECT;
  5425. n->objtype = ACL_OBJECT_DATABASE;
  5426. n->objs = $2;
  5427. $$ = n;
  5428. }
  5429. | DOMAIN_P any_name_list
  5430. {
  5431. PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  5432. n->targtype = ACL_TARGET_OBJECT;
  5433. n->objtype = ACL_OBJECT_DOMAIN;
  5434. n->objs = $2;
  5435. $$ = n;
  5436. }
  5437. | LANGUAGE name_list
  5438. {
  5439. PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  5440. n->targtype = ACL_TARGET_OBJECT;
  5441. n->objtype = ACL_OBJECT_LANGUAGE;
  5442. n->objs = $2;
  5443. $$ = n;
  5444. }
  5445. | LARGE_P OBJECT_P NumericOnly_list
  5446. {
  5447. PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  5448. n->targtype = ACL_TARGET_OBJECT;
  5449. n->objtype = ACL_OBJECT_LARGEOBJECT;
  5450. n->objs = $3;
  5451. $$ = n;
  5452. }
  5453. | SCHEMA name_list
  5454. {
  5455. PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  5456. n->targtype = ACL_TARGET_OBJECT;
  5457. n->objtype = ACL_OBJECT_NAMESPACE;
  5458. n->objs = $2;
  5459. $$ = n;
  5460. }
  5461. | TABLESPACE name_list
  5462. {
  5463. PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  5464. n->targtype = ACL_TARGET_OBJECT;
  5465. n->objtype = ACL_OBJECT_TABLESPACE;
  5466. n->objs = $2;
  5467. $$ = n;
  5468. }
  5469. | TYPE_P any_name_list
  5470. {
  5471. PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  5472. n->targtype = ACL_TARGET_OBJECT;
  5473. n->objtype = ACL_OBJECT_TYPE;
  5474. n->objs = $2;
  5475. $$ = n;
  5476. }
  5477. | ALL TABLES IN_P SCHEMA name_list
  5478. {
  5479. PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  5480. n->targtype = ACL_TARGET_ALL_IN_SCHEMA;
  5481. n->objtype = ACL_OBJECT_RELATION;
  5482. n->objs = $5;
  5483. $$ = n;
  5484. }
  5485. | ALL SEQUENCES IN_P SCHEMA name_list
  5486. {
  5487. PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  5488. n->targtype = ACL_TARGET_ALL_IN_SCHEMA;
  5489. n->objtype = ACL_OBJECT_SEQUENCE;
  5490. n->objs = $5;
  5491. $$ = n;
  5492. }
  5493. | ALL FUNCTIONS IN_P SCHEMA name_list
  5494. {
  5495. PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  5496. n->targtype = ACL_TARGET_ALL_IN_SCHEMA;
  5497. n->objtype = ACL_OBJECT_FUNCTION;
  5498. n->objs = $5;
  5499. $$ = n;
  5500. }
  5501. ;
  5502. grantee_list:
  5503. grantee { $$ = list_make1($1); }
  5504. | grantee_list ',' grantee { $$ = lappend($1, $3); }
  5505. ;
  5506. grantee: RoleId
  5507. {
  5508. PrivGrantee *n = makeNode(PrivGrantee);
  5509. /* This hack lets us avoid reserving PUBLIC as a keyword*/
  5510. if (strcmp($1, "public") == 0)
  5511. n->rolname = NULL;
  5512. else
  5513. n->rolname = $1;
  5514. $$ = (Node *)n;
  5515. }
  5516. | GROUP_P RoleId
  5517. {
  5518. PrivGrantee *n = makeNode(PrivGrantee);
  5519. /* Treat GROUP PUBLIC as a synonym for PUBLIC */
  5520. if (strcmp($2, "public") == 0)
  5521. n->rolname = NULL;
  5522. else
  5523. n->rolname = $2;
  5524. $$ = (Node *)n;
  5525. }
  5526. ;
  5527. opt_grant_grant_option:
  5528. WITH GRANT OPTION { $$ = TRUE; }
  5529. | /*EMPTY*/ { $$ = FALSE; }
  5530. ;
  5531. function_with_argtypes_list:
  5532. function_with_argtypes { $$ = list_make1($1); }
  5533. | function_with_argtypes_list ',' function_with_argtypes
  5534. { $$ = lappend($1, $3); }
  5535. ;
  5536. function_with_argtypes:
  5537. func_name func_args
  5538. {
  5539. FuncWithArgs *n = makeNode(FuncWithArgs);
  5540. n->funcname = $1;
  5541. n->funcargs = extractArgTypes($2);
  5542. $$ = n;
  5543. }
  5544. ;
  5545. /*****************************************************************************
  5546. *
  5547. * GRANT and REVOKE ROLE statements
  5548. *
  5549. *****************************************************************************/
  5550. GrantRoleStmt:
  5551. GRANT privilege_list TO role_list opt_grant_admin_option opt_granted_by
  5552. {
  5553. GrantRoleStmt *n = makeNode(GrantRoleStmt);
  5554. n->is_grant = true;
  5555. n->granted_roles = $2;
  5556. n->grantee_roles = $4;
  5557. n->admin_opt = $5;
  5558. n->grantor = $6;
  5559. $$ = (Node*)n;
  5560. }
  5561. ;
  5562. RevokeRoleStmt:
  5563. REVOKE privilege_list FROM role_list opt_granted_by opt_drop_behavior
  5564. {
  5565. GrantRoleStmt *n = makeNode(GrantRoleStmt);
  5566. n->is_grant = false;
  5567. n->admin_opt = false;
  5568. n->granted_roles = $2;
  5569. n->grantee_roles = $4;
  5570. n->behavior = $6;
  5571. $$ = (Node*)n;
  5572. }
  5573. | REVOKE ADMIN OPTION FOR privilege_list FROM role_list opt_granted_by opt_drop_behavior
  5574. {
  5575. GrantRoleStmt *n = makeNode(GrantRoleStmt);
  5576. n->is_grant = false;
  5577. n->admin_opt = true;
  5578. n->granted_roles = $5;
  5579. n->grantee_roles = $7;
  5580. n->behavior = $9;
  5581. $$ = (Node*)n;
  5582. }
  5583. ;
  5584. opt_grant_admin_option: WITH ADMIN OPTION { $$ = TRUE; }
  5585. | /*EMPTY*/ { $$ = FALSE; }
  5586. ;
  5587. opt_granted_by: GRANTED BY RoleId { $$ = $3; }
  5588. | /*EMPTY*/ { $$ = NULL; }
  5589. ;
  5590. /*****************************************************************************
  5591. *
  5592. * ALTER DEFAULT PRIVILEGES statement
  5593. *
  5594. *****************************************************************************/
  5595. AlterDefaultPrivilegesStmt:
  5596. ALTER DEFAULT PRIVILEGES DefACLOptionList DefACLAction
  5597. {
  5598. AlterDefaultPrivilegesStmt *n = makeNode(AlterDefaultPrivilegesStmt);
  5599. n->options = $4;
  5600. n->action = (GrantStmt *) $5;
  5601. $$ = (Node*)n;
  5602. }
  5603. ;
  5604. DefACLOptionList:
  5605. DefACLOptionList DefACLOption { $$ = lappend($1, $2); }
  5606. | /* EMPTY */ { $$ = NIL; }
  5607. ;
  5608. DefACLOption:
  5609. IN_P SCHEMA name_list
  5610. {
  5611. $$ = makeDefElem("schemas", (Node *)$3);
  5612. }
  5613. | FOR ROLE role_list
  5614. {
  5615. $$ = makeDefElem("roles", (Node *)$3);
  5616. }
  5617. | FOR USER role_list
  5618. {
  5619. $$ = makeDefElem("roles", (Node *)$3);
  5620. }
  5621. ;
  5622. /*
  5623. * This should match GRANT/REVOKE, except that individual target objects
  5624. * are not mentioned and we only allow a subset of object types.
  5625. */
  5626. DefACLAction:
  5627. GRANT privileges ON defacl_privilege_target TO grantee_list
  5628. opt_grant_grant_option
  5629. {
  5630. GrantStmt *n = makeNode(GrantStmt);
  5631. n->is_grant = true;
  5632. n->privileges = $2;
  5633. n->targtype = ACL_TARGET_DEFAULTS;
  5634. n->objtype = $4;
  5635. n->objects = NIL;
  5636. n->grantees = $6;
  5637. n->grant_option = $7;
  5638. $$ = (Node*)n;
  5639. }
  5640. | REVOKE privileges ON defacl_privilege_target
  5641. FROM grantee_list opt_drop_behavior
  5642. {
  5643. GrantStmt *n = makeNode(GrantStmt);
  5644. n->is_grant = false;
  5645. n->grant_option = false;
  5646. n->privileges = $2;
  5647. n->targtype = ACL_TARGET_DEFAULTS;
  5648. n->objtype = $4;
  5649. n->objects = NIL;
  5650. n->grantees = $6;
  5651. n->behavior = $7;
  5652. $$ = (Node *)n;
  5653. }
  5654. | REVOKE GRANT OPTION FOR privileges ON defacl_privilege_target
  5655. FROM grantee_list opt_drop_behavior
  5656. {
  5657. GrantStmt *n = makeNode(GrantStmt);
  5658. n->is_grant = false;
  5659. n->grant_option = true;
  5660. n->privileges = $5;
  5661. n->targtype = ACL_TARGET_DEFAULTS;
  5662. n->objtype = $7;
  5663. n->objects = NIL;
  5664. n->grantees = $9;
  5665. n->behavior = $10;
  5666. $$ = (Node *)n;
  5667. }
  5668. ;
  5669. defacl_privilege_target:
  5670. TABLES { $$ = ACL_OBJECT_RELATION; }
  5671. | FUNCTIONS { $$ = ACL_OBJECT_FUNCTION; }
  5672. | SEQUENCES { $$ = ACL_OBJECT_SEQUENCE; }
  5673. | TYPES_P { $$ = ACL_OBJECT_TYPE; }
  5674. ;
  5675. /*****************************************************************************
  5676. *
  5677. * QUERY: CREATE INDEX
  5678. *
  5679. * Note: we cannot put TABLESPACE clause after WHERE clause unless we are
  5680. * willing to make TABLESPACE a fully reserved word.
  5681. *****************************************************************************/
  5682. IndexStmt: CREATE opt_unique INDEX opt_concurrently opt_index_name
  5683. ON qualified_name access_method_clause '(' index_params ')'
  5684. opt_reloptions OptTableSpace where_clause
  5685. {
  5686. IndexStmt *n = makeNode(IndexStmt);
  5687. n->unique = $2;
  5688. n->concurrent = $4;
  5689. n->idxname = $5;
  5690. n->relation = $7;
  5691. n->accessMethod = $8;
  5692. n->indexParams = $10;
  5693. n->options = $12;
  5694. n->tableSpace = $13;
  5695. n->whereClause = $14;
  5696. n->excludeOpNames = NIL;
  5697. n->idxcomment = NULL;
  5698. n->indexOid = InvalidOid;
  5699. n->oldNode = InvalidOid;
  5700. n->primary = false;
  5701. n->isconstraint = false;
  5702. n->deferrable = false;
  5703. n->initdeferred = false;
  5704. $$ = (Node *)n;
  5705. }
  5706. ;
  5707. opt_unique:
  5708. UNIQUE { $$ = TRUE; }
  5709. | /*EMPTY*/ { $$ = FALSE; }
  5710. ;
  5711. opt_concurrently:
  5712. CONCURRENTLY { $$ = TRUE; }
  5713. | /*EMPTY*/ { $$ = FALSE; }
  5714. ;
  5715. opt_index_name:
  5716. index_name { $$ = $1; }
  5717. | /*EMPTY*/ { $$ = NULL; }
  5718. ;
  5719. access_method_clause:
  5720. USING access_method { $$ = $2; }
  5721. | /*EMPTY*/ { $$ = DEFAULT_INDEX_TYPE; }
  5722. ;
  5723. index_params: index_elem { $$ = list_make1($1); }
  5724. | index_params ',' index_elem { $$ = lappend($1, $3); }
  5725. ;
  5726. /*
  5727. * Index attributes can be either simple column references, or arbitrary
  5728. * expressions in parens. For backwards-compatibility reasons, we allow
  5729. * an expression that's just a function call to be written without parens.
  5730. */
  5731. index_elem: ColId opt_collate opt_class opt_asc_desc opt_nulls_order
  5732. {
  5733. $$ = makeNode(IndexElem);
  5734. $$->name = $1;
  5735. $$->expr = NULL;
  5736. $$->indexcolname = NULL;
  5737. $$->collation = $2;
  5738. $$->opclass = $3;
  5739. $$->ordering = $4;
  5740. $$->nulls_ordering = $5;
  5741. }
  5742. | func_expr_windowless opt_collate opt_class opt_asc_desc opt_nulls_order
  5743. {
  5744. $$ = makeNode(IndexElem);
  5745. $$->name = NULL;
  5746. $$->expr = $1;
  5747. $$->indexcolname = NULL;
  5748. $$->collation = $2;
  5749. $$->opclass = $3;
  5750. $$->ordering = $4;
  5751. $$->nulls_ordering = $5;
  5752. }
  5753. | '(' a_expr ')' opt_collate opt_class opt_asc_desc opt_nulls_order
  5754. {
  5755. $$ = makeNode(IndexElem);
  5756. $$->name = NULL;
  5757. $$->expr = $2;
  5758. $$->indexcolname = NULL;
  5759. $$->collation = $4;
  5760. $$->opclass = $5;
  5761. $$->ordering = $6;
  5762. $$->nulls_ordering = $7;
  5763. }
  5764. ;
  5765. opt_collate: COLLATE any_name { $$ = $2; }
  5766. | /*EMPTY*/ { $$ = NIL; }
  5767. ;
  5768. opt_class: any_name { $$ = $1; }
  5769. | USING any_name { $$ = $2; }
  5770. | /*EMPTY*/ { $$ = NIL; }
  5771. ;
  5772. opt_asc_desc: ASC { $$ = SORTBY_ASC; }
  5773. | DESC { $$ = SORTBY_DESC; }
  5774. | /*EMPTY*/ { $$ = SORTBY_DEFAULT; }
  5775. ;
  5776. opt_nulls_order: NULLS_FIRST { $$ = SORTBY_NULLS_FIRST; }
  5777. | NULLS_LAST { $$ = SORTBY_NULLS_LAST; }
  5778. | /*EMPTY*/ { $$ = SORTBY_NULLS_DEFAULT; }
  5779. ;
  5780. /*****************************************************************************
  5781. *
  5782. * QUERY:
  5783. * create [or replace] function <fname>
  5784. * [(<type-1> { , <type-n>})]
  5785. * returns <type-r>
  5786. * as <filename or code in language as appropriate>
  5787. * language <lang> [with parameters]
  5788. *
  5789. *****************************************************************************/
  5790. CreateFunctionStmt:
  5791. CREATE opt_or_replace FUNCTION func_name func_args_with_defaults
  5792. RETURNS func_return createfunc_opt_list opt_definition
  5793. {
  5794. CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
  5795. n->replace = $2;
  5796. n->funcname = $4;
  5797. n->parameters = $5;
  5798. n->returnType = $7;
  5799. n->options = $8;
  5800. n->withClause = $9;
  5801. $$ = (Node *)n;
  5802. }
  5803. | CREATE opt_or_replace FUNCTION func_name func_args_with_defaults
  5804. RETURNS TABLE '(' table_func_column_list ')' createfunc_opt_list opt_definition
  5805. {
  5806. CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
  5807. n->replace = $2;
  5808. n->funcname = $4;
  5809. n->parameters = mergeTableFuncParameters($5, $9);
  5810. n->returnType = TableFuncTypeName($9);
  5811. n->returnType->location = @7;
  5812. n->options = $11;
  5813. n->withClause = $12;
  5814. $$ = (Node *)n;
  5815. }
  5816. | CREATE opt_or_replace FUNCTION func_name func_args_with_defaults
  5817. createfunc_opt_list opt_definition
  5818. {
  5819. CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
  5820. n->replace = $2;
  5821. n->funcname = $4;
  5822. n->parameters = $5;
  5823. n->returnType = NULL;
  5824. n->options = $6;
  5825. n->withClause = $7;
  5826. $$ = (Node *)n;
  5827. }
  5828. ;
  5829. opt_or_replace:
  5830. OR REPLACE { $$ = TRUE; }
  5831. | /*EMPTY*/ { $$ = FALSE; }
  5832. ;
  5833. func_args: '(' func_args_list ')' { $$ = $2; }
  5834. | '(' ')' { $$ = NIL; }
  5835. ;
  5836. func_args_list:
  5837. func_arg { $$ = list_make1($1); }
  5838. | func_args_list ',' func_arg { $$ = lappend($1, $3); }
  5839. ;
  5840. /*
  5841. * func_args_with_defaults is separate because we only want to accept
  5842. * defaults in CREATE FUNCTION, not in ALTER etc.
  5843. */
  5844. func_args_with_defaults:
  5845. '(' func_args_with_defaults_list ')' { $$ = $2; }
  5846. | '(' ')' { $$ = NIL; }
  5847. ;
  5848. func_args_with_defaults_list:
  5849. func_arg_with_default { $$ = list_make1($1); }
  5850. | func_args_with_defaults_list ',' func_arg_with_default
  5851. { $$ = lappend($1, $3); }
  5852. ;
  5853. /*
  5854. * The style with arg_class first is SQL99 standard, but Oracle puts
  5855. * param_name first; accept both since it's likely people will try both
  5856. * anyway. Don't bother trying to save productions by letting arg_class
  5857. * have an empty alternative ... you'll get shift/reduce conflicts.
  5858. *
  5859. * We can catch over-specified arguments here if we want to,
  5860. * but for now better to silently swallow typmod, etc.
  5861. * - thomas 2000-03-22
  5862. */
  5863. func_arg:
  5864. arg_class param_name func_type
  5865. {
  5866. FunctionParameter *n = makeNode(FunctionParameter);
  5867. n->name = $2;
  5868. n->argType = $3;
  5869. n->mode = $1;
  5870. n->defexpr = NULL;
  5871. $$ = n;
  5872. }
  5873. | param_name arg_class func_type
  5874. {
  5875. FunctionParameter *n = makeNode(FunctionParameter);
  5876. n->name = $1;
  5877. n->argType = $3;
  5878. n->mode = $2;
  5879. n->defexpr = NULL;
  5880. $$ = n;
  5881. }
  5882. | param_name func_type
  5883. {
  5884. FunctionParameter *n = makeNode(FunctionParameter);
  5885. n->name = $1;
  5886. n->argType = $2;
  5887. n->mode = FUNC_PARAM_IN;
  5888. n->defexpr = NULL;
  5889. $$ = n;
  5890. }
  5891. | arg_class func_type
  5892. {
  5893. FunctionParameter *n = makeNode(FunctionParameter);
  5894. n->name = NULL;
  5895. n->argType = $2;
  5896. n->mode = $1;
  5897. n->defexpr = NULL;
  5898. $$ = n;
  5899. }
  5900. | func_type
  5901. {
  5902. FunctionParameter *n = makeNode(FunctionParameter);
  5903. n->name = NULL;
  5904. n->argType = $1;
  5905. n->mode = FUNC_PARAM_IN;
  5906. n->defexpr = NULL;
  5907. $$ = n;
  5908. }
  5909. ;
  5910. /* INOUT is SQL99 standard, IN OUT is for Oracle compatibility */
  5911. arg_class: IN_P { $$ = FUNC_PARAM_IN; }
  5912. | OUT_P { $$ = FUNC_PARAM_OUT; }
  5913. | INOUT { $$ = FUNC_PARAM_INOUT; }
  5914. | IN_P OUT_P { $$ = FUNC_PARAM_INOUT; }
  5915. | VARIADIC { $$ = FUNC_PARAM_VARIADIC; }
  5916. ;
  5917. /*
  5918. * Ideally param_name should be ColId, but that causes too many conflicts.
  5919. */
  5920. param_name: type_function_name
  5921. ;
  5922. func_return:
  5923. func_type
  5924. {
  5925. /* We can catch over-specified results here if we want to,
  5926. * but for now better to silently swallow typmod, etc.
  5927. * - thomas 2000-03-22
  5928. */
  5929. $$ = $1;
  5930. }
  5931. ;
  5932. /*
  5933. * We would like to make the %TYPE productions here be ColId attrs etc,
  5934. * but that causes reduce/reduce conflicts. type_function_name
  5935. * is next best choice.
  5936. */
  5937. func_type: Typename { $$ = $1; }
  5938. | type_function_name attrs '%' TYPE_P
  5939. {
  5940. $$ = makeTypeNameFromNameList(lcons(makeString($1), $2));
  5941. $$->pct_type = true;
  5942. $$->location = @1;
  5943. }
  5944. | SETOF type_function_name attrs '%' TYPE_P
  5945. {
  5946. $$ = makeTypeNameFromNameList(lcons(makeString($2), $3));
  5947. $$->pct_type = true;
  5948. $$->setof = TRUE;
  5949. $$->location = @2;
  5950. }
  5951. ;
  5952. func_arg_with_default:
  5953. func_arg
  5954. {
  5955. $$ = $1;
  5956. }
  5957. | func_arg DEFAULT a_expr
  5958. {
  5959. $$ = $1;
  5960. $$->defexpr = $3;
  5961. }
  5962. | func_arg '=' a_expr
  5963. {
  5964. $$ = $1;
  5965. $$->defexpr = $3;
  5966. }
  5967. ;
  5968. /* Aggregate args can be most things that function args can be */
  5969. aggr_arg: func_arg
  5970. {
  5971. if (!($1->mode == FUNC_PARAM_IN ||
  5972. $1->mode == FUNC_PARAM_VARIADIC))
  5973. ereport(ERROR,
  5974. (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
  5975. errmsg("aggregates cannot have output arguments"),
  5976. parser_errposition(@1)));
  5977. $$ = $1;
  5978. }
  5979. ;
  5980. /*
  5981. * The SQL standard offers no guidance on how to declare aggregate argument
  5982. * lists, since it doesn't have CREATE AGGREGATE etc. We accept these cases:
  5983. *
  5984. * (*) - normal agg with no args
  5985. * (aggr_arg,...) - normal agg with args
  5986. * (ORDER BY aggr_arg,...) - ordered-set agg with no direct args
  5987. * (aggr_arg,... ORDER BY aggr_arg,...) - ordered-set agg with direct args
  5988. *
  5989. * The zero-argument case is spelled with '*' for consistency with COUNT(*).
  5990. *
  5991. * An additional restriction is that if the direct-args list ends in a
  5992. * VARIADIC item, the ordered-args list must contain exactly one item that
  5993. * is also VARIADIC with the same type. This allows us to collapse the two
  5994. * VARIADIC items into one, which is necessary to represent the aggregate in
  5995. * pg_proc. We check this at the grammar stage so that we can return a list
  5996. * in which the second VARIADIC item is already discarded, avoiding extra work
  5997. * in cases such as DROP AGGREGATE.
  5998. *
  5999. * The return value of this production is a two-element list, in which the
  6000. * first item is a sublist of FunctionParameter nodes (with any duplicate
  6001. * VARIADIC item already dropped, as per above) and the second is an integer
  6002. * Value node, containing -1 if there was no ORDER BY and otherwise the number
  6003. * of argument declarations before the ORDER BY. (If this number is equal
  6004. * to the first sublist's length, then we dropped a duplicate VARIADIC item.)
  6005. * This representation is passed as-is to CREATE AGGREGATE; for operations
  6006. * on existing aggregates, we can just apply extractArgTypes to the first
  6007. * sublist.
  6008. */
  6009. aggr_args: '(' '*' ')'
  6010. {
  6011. $$ = list_make2(NIL, makeInteger(-1));
  6012. }
  6013. | '(' aggr_args_list ')'
  6014. {
  6015. $$ = list_make2($2, makeInteger(-1));
  6016. }
  6017. | '(' ORDER BY aggr_args_list ')'
  6018. {
  6019. $$ = list_make2($4, makeInteger(0));
  6020. }
  6021. | '(' aggr_args_list ORDER BY aggr_args_list ')'
  6022. {
  6023. /* this is the only case requiring consistency checking */
  6024. $$ = makeOrderedSetArgs($2, $5, yyscanner);
  6025. }
  6026. ;
  6027. aggr_args_list:
  6028. aggr_arg { $$ = list_make1($1); }
  6029. | aggr_args_list ',' aggr_arg { $$ = lappend($1, $3); }
  6030. ;
  6031. createfunc_opt_list:
  6032. /* Must be at least one to prevent conflict */
  6033. createfunc_opt_item { $$ = list_make1($1); }
  6034. | createfunc_opt_list createfunc_opt_item { $$ = lappend($1, $2); }
  6035. ;
  6036. /*
  6037. * Options common to both CREATE FUNCTION and ALTER FUNCTION
  6038. */
  6039. common_func_opt_item:
  6040. CALLED ON NULL_P INPUT_P
  6041. {
  6042. $$ = makeDefElem("strict", (Node *)makeInteger(FALSE));
  6043. }
  6044. | RETURNS NULL_P ON NULL_P INPUT_P
  6045. {
  6046. $$ = makeDefElem("strict", (Node *)makeInteger(TRUE));
  6047. }
  6048. | STRICT_P
  6049. {
  6050. $$ = makeDefElem("strict", (Node *)makeInteger(TRUE));
  6051. }
  6052. | IMMUTABLE
  6053. {
  6054. $$ = makeDefElem("volatility", (Node *)makeString("immutable"));
  6055. }
  6056. | STABLE
  6057. {
  6058. $$ = makeDefElem("volatility", (Node *)makeString("stable"));
  6059. }
  6060. | VOLATILE
  6061. {
  6062. $$ = makeDefElem("volatility", (Node *)makeString("volatile"));
  6063. }
  6064. | EXTERNAL SECURITY DEFINER
  6065. {
  6066. $$ = makeDefElem("security", (Node *)makeInteger(TRUE));
  6067. }
  6068. | EXTERNAL SECURITY INVOKER
  6069. {
  6070. $$ = makeDefElem("security", (Node *)makeInteger(FALSE));
  6071. }
  6072. | SECURITY DEFINER
  6073. {
  6074. $$ = makeDefElem("security", (Node *)makeInteger(TRUE));
  6075. }
  6076. | SECURITY INVOKER
  6077. {
  6078. $$ = makeDefElem("security", (Node *)makeInteger(FALSE));
  6079. }
  6080. | LEAKPROOF
  6081. {
  6082. $$ = makeDefElem("leakproof", (Node *)makeInteger(TRUE));
  6083. }
  6084. | NOT LEAKPROOF
  6085. {
  6086. $$ = makeDefElem("leakproof", (Node *)makeInteger(FALSE));
  6087. }
  6088. | COST NumericOnly
  6089. {
  6090. $$ = makeDefElem("cost", (Node *)$2);
  6091. }
  6092. | ROWS NumericOnly
  6093. {
  6094. $$ = makeDefElem("rows", (Node *)$2);
  6095. }
  6096. | FunctionSetResetClause
  6097. {
  6098. /* we abuse the normal content of a DefElem here */
  6099. $$ = makeDefElem("set", (Node *)$1);
  6100. }
  6101. ;
  6102. createfunc_opt_item:
  6103. AS func_as
  6104. {
  6105. $$ = makeDefElem("as", (Node *)$2);
  6106. }
  6107. | LANGUAGE NonReservedWord_or_Sconst
  6108. {
  6109. $$ = makeDefElem("language", (Node *)makeString($2));
  6110. }
  6111. | WINDOW
  6112. {
  6113. $$ = makeDefElem("window", (Node *)makeInteger(TRUE));
  6114. }
  6115. | common_func_opt_item
  6116. {
  6117. $$ = $1;
  6118. }
  6119. ;
  6120. func_as: Sconst { $$ = list_make1(makeString($1)); }
  6121. | Sconst ',' Sconst
  6122. {
  6123. $$ = list_make2(makeString($1), makeString($3));
  6124. }
  6125. ;
  6126. opt_definition:
  6127. WITH definition { $$ = $2; }
  6128. | /*EMPTY*/ { $$ = NIL; }
  6129. ;
  6130. table_func_column: param_name func_type
  6131. {
  6132. FunctionParameter *n = makeNode(FunctionParameter);
  6133. n->name = $1;
  6134. n->argType = $2;
  6135. n->mode = FUNC_PARAM_TABLE;
  6136. n->defexpr = NULL;
  6137. $$ = n;
  6138. }
  6139. ;
  6140. table_func_column_list:
  6141. table_func_column
  6142. {
  6143. $$ = list_make1($1);
  6144. }
  6145. | table_func_column_list ',' table_func_column
  6146. {
  6147. $$ = lappend($1, $3);
  6148. }
  6149. ;
  6150. /*****************************************************************************
  6151. * ALTER FUNCTION
  6152. *
  6153. * RENAME and OWNER subcommands are already provided by the generic
  6154. * ALTER infrastructure, here we just specify alterations that can
  6155. * only be applied to functions.
  6156. *
  6157. *****************************************************************************/
  6158. AlterFunctionStmt:
  6159. ALTER FUNCTION function_with_argtypes alterfunc_opt_list opt_restrict
  6160. {
  6161. AlterFunctionStmt *n = makeNode(AlterFunctionStmt);
  6162. n->func = $3;
  6163. n->actions = $4;
  6164. $$ = (Node *) n;
  6165. }
  6166. ;
  6167. alterfunc_opt_list:
  6168. /* At least one option must be specified */
  6169. common_func_opt_item { $$ = list_make1($1); }
  6170. | alterfunc_opt_list common_func_opt_item { $$ = lappend($1, $2); }
  6171. ;
  6172. /* Ignored, merely for SQL compliance */
  6173. opt_restrict:
  6174. RESTRICT
  6175. | /* EMPTY */
  6176. ;
  6177. /*****************************************************************************
  6178. *
  6179. * QUERY:
  6180. *
  6181. * DROP FUNCTION funcname (arg1, arg2, ...) [ RESTRICT | CASCADE ]
  6182. * DROP AGGREGATE aggname (arg1, ...) [ RESTRICT | CASCADE ]
  6183. * DROP OPERATOR opname (leftoperand_typ, rightoperand_typ) [ RESTRICT | CASCADE ]
  6184. *
  6185. *****************************************************************************/
  6186. RemoveFuncStmt:
  6187. DROP FUNCTION func_name func_args opt_drop_behavior
  6188. {
  6189. DropStmt *n = makeNode(DropStmt);
  6190. n->removeType = OBJECT_FUNCTION;
  6191. n->objects = list_make1($3);
  6192. n->arguments = list_make1(extractArgTypes($4));
  6193. n->behavior = $5;
  6194. n->missing_ok = false;
  6195. n->concurrent = false;
  6196. $$ = (Node *)n;
  6197. }
  6198. | DROP FUNCTION IF_P EXISTS func_name func_args opt_drop_behavior
  6199. {
  6200. DropStmt *n = makeNode(DropStmt);
  6201. n->removeType = OBJECT_FUNCTION;
  6202. n->objects = list_make1($5);
  6203. n->arguments = list_make1(extractArgTypes($6));
  6204. n->behavior = $7;
  6205. n->missing_ok = true;
  6206. n->concurrent = false;
  6207. $$ = (Node *)n;
  6208. }
  6209. ;
  6210. RemoveAggrStmt:
  6211. DROP AGGREGATE func_name aggr_args opt_drop_behavior
  6212. {
  6213. DropStmt *n = makeNode(DropStmt);
  6214. n->removeType = OBJECT_AGGREGATE;
  6215. n->objects = list_make1($3);
  6216. n->arguments = list_make1(extractAggrArgTypes($4));
  6217. n->behavior = $5;
  6218. n->missing_ok = false;
  6219. n->concurrent = false;
  6220. $$ = (Node *)n;
  6221. }
  6222. | DROP AGGREGATE IF_P EXISTS func_name aggr_args opt_drop_behavior
  6223. {
  6224. DropStmt *n = makeNode(DropStmt);
  6225. n->removeType = OBJECT_AGGREGATE;
  6226. n->objects = list_make1($5);
  6227. n->arguments = list_make1(extractAggrArgTypes($6));
  6228. n->behavior = $7;
  6229. n->missing_ok = true;
  6230. n->concurrent = false;
  6231. $$ = (Node *)n;
  6232. }
  6233. ;
  6234. RemoveOperStmt:
  6235. DROP OPERATOR any_operator oper_argtypes opt_drop_behavior
  6236. {
  6237. DropStmt *n = makeNode(DropStmt);
  6238. n->removeType = OBJECT_OPERATOR;
  6239. n->objects = list_make1($3);
  6240. n->arguments = list_make1($4);
  6241. n->behavior = $5;
  6242. n->missing_ok = false;
  6243. n->concurrent = false;
  6244. $$ = (Node *)n;
  6245. }
  6246. | DROP OPERATOR IF_P EXISTS any_operator oper_argtypes opt_drop_behavior
  6247. {
  6248. DropStmt *n = makeNode(DropStmt);
  6249. n->removeType = OBJECT_OPERATOR;
  6250. n->objects = list_make1($5);
  6251. n->arguments = list_make1($6);
  6252. n->behavior = $7;
  6253. n->missing_ok = true;
  6254. n->concurrent = false;
  6255. $$ = (Node *)n;
  6256. }
  6257. ;
  6258. oper_argtypes:
  6259. '(' Typename ')'
  6260. {
  6261. ereport(ERROR,
  6262. (errcode(ERRCODE_SYNTAX_ERROR),
  6263. errmsg("missing argument"),
  6264. errhint("Use NONE to denote the missing argument of a unary operator."),
  6265. parser_errposition(@3)));
  6266. }
  6267. | '(' Typename ',' Typename ')'
  6268. { $$ = list_make2($2, $4); }
  6269. | '(' NONE ',' Typename ')' /* left unary */
  6270. { $$ = list_make2(NULL, $4); }
  6271. | '(' Typename ',' NONE ')' /* right unary */
  6272. { $$ = list_make2($2, NULL); }
  6273. ;
  6274. any_operator:
  6275. all_Op
  6276. { $$ = list_make1(makeString($1)); }
  6277. | ColId '.' any_operator
  6278. { $$ = lcons(makeString($1), $3); }
  6279. ;
  6280. /*****************************************************************************
  6281. *
  6282. * DO <anonymous code block> [ LANGUAGE language ]
  6283. *
  6284. * We use a DefElem list for future extensibility, and to allow flexibility
  6285. * in the clause order.
  6286. *
  6287. *****************************************************************************/
  6288. DoStmt: DO dostmt_opt_list
  6289. {
  6290. DoStmt *n = makeNode(DoStmt);
  6291. n->args = $2;
  6292. $$ = (Node *)n;
  6293. }
  6294. ;
  6295. dostmt_opt_list:
  6296. dostmt_opt_item { $$ = list_make1($1); }
  6297. | dostmt_opt_list dostmt_opt_item { $$ = lappend($1, $2); }
  6298. ;
  6299. dostmt_opt_item:
  6300. Sconst
  6301. {
  6302. $$ = makeDefElem("as", (Node *)makeString($1));
  6303. }
  6304. | LANGUAGE NonReservedWord_or_Sconst
  6305. {
  6306. $$ = makeDefElem("language", (Node *)makeString($2));
  6307. }
  6308. ;
  6309. /*****************************************************************************
  6310. *
  6311. * CREATE CAST / DROP CAST
  6312. *
  6313. *****************************************************************************/
  6314. CreateCastStmt: CREATE CAST '(' Typename AS Typename ')'
  6315. WITH FUNCTION function_with_argtypes cast_context
  6316. {
  6317. CreateCastStmt *n = makeNode(CreateCastStmt);
  6318. n->sourcetype = $4;
  6319. n->targettype = $6;
  6320. n->func = $10;
  6321. n->context = (CoercionContext) $11;
  6322. n->inout = false;
  6323. $$ = (Node *)n;
  6324. }
  6325. | CREATE CAST '(' Typename AS Typename ')'
  6326. WITHOUT FUNCTION cast_context
  6327. {
  6328. CreateCastStmt *n = makeNode(CreateCastStmt);
  6329. n->sourcetype = $4;
  6330. n->targettype = $6;
  6331. n->func = NULL;
  6332. n->context = (CoercionContext) $10;
  6333. n->inout = false;
  6334. $$ = (Node *)n;
  6335. }
  6336. | CREATE CAST '(' Typename AS Typename ')'
  6337. WITH INOUT cast_context
  6338. {
  6339. CreateCastStmt *n = makeNode(CreateCastStmt);
  6340. n->sourcetype = $4;
  6341. n->targettype = $6;
  6342. n->func = NULL;
  6343. n->context = (CoercionContext) $10;
  6344. n->inout = true;
  6345. $$ = (Node *)n;
  6346. }
  6347. ;
  6348. cast_context: AS IMPLICIT_P { $$ = COERCION_IMPLICIT; }
  6349. | AS ASSIGNMENT { $$ = COERCION_ASSIGNMENT; }
  6350. | /*EMPTY*/ { $$ = COERCION_EXPLICIT; }
  6351. ;
  6352. DropCastStmt: DROP CAST opt_if_exists '(' Typename AS Typename ')' opt_drop_behavior
  6353. {
  6354. DropStmt *n = makeNode(DropStmt);
  6355. n->removeType = OBJECT_CAST;
  6356. n->objects = list_make1(list_make1($5));
  6357. n->arguments = list_make1(list_make1($7));
  6358. n->behavior = $9;
  6359. n->missing_ok = $3;
  6360. n->concurrent = false;
  6361. $$ = (Node *)n;
  6362. }
  6363. ;
  6364. opt_if_exists: IF_P EXISTS { $$ = TRUE; }
  6365. | /*EMPTY*/ { $$ = FALSE; }
  6366. ;
  6367. /*****************************************************************************
  6368. *
  6369. * QUERY:
  6370. *
  6371. * REINDEX type <name> [FORCE]
  6372. *
  6373. * FORCE no longer does anything, but we accept it for backwards compatibility
  6374. *****************************************************************************/
  6375. ReindexStmt:
  6376. REINDEX reindex_type qualified_name opt_force
  6377. {
  6378. ReindexStmt *n = makeNode(ReindexStmt);
  6379. n->kind = $2;
  6380. n->relation = $3;
  6381. n->name = NULL;
  6382. $$ = (Node *)n;
  6383. }
  6384. | REINDEX SYSTEM_P name opt_force
  6385. {
  6386. ReindexStmt *n = makeNode(ReindexStmt);
  6387. n->kind = OBJECT_DATABASE;
  6388. n->name = $3;
  6389. n->relation = NULL;
  6390. n->do_system = true;
  6391. n->do_user = false;
  6392. $$ = (Node *)n;
  6393. }
  6394. | REINDEX DATABASE name opt_force
  6395. {
  6396. ReindexStmt *n = makeNode(ReindexStmt);
  6397. n->kind = OBJECT_DATABASE;
  6398. n->name = $3;
  6399. n->relation = NULL;
  6400. n->do_system = true;
  6401. n->do_user = true;
  6402. $$ = (Node *)n;
  6403. }
  6404. ;
  6405. reindex_type:
  6406. INDEX { $$ = OBJECT_INDEX; }
  6407. | TABLE { $$ = OBJECT_TABLE; }
  6408. ;
  6409. opt_force: FORCE { $$ = TRUE; }
  6410. | /* EMPTY */ { $$ = FALSE; }
  6411. ;
  6412. /*****************************************************************************
  6413. *
  6414. * ALTER THING name RENAME TO newname
  6415. *
  6416. *****************************************************************************/
  6417. RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name
  6418. {
  6419. RenameStmt *n = makeNode(RenameStmt);
  6420. n->renameType = OBJECT_AGGREGATE;
  6421. n->object = $3;
  6422. n->objarg = extractAggrArgTypes($4);
  6423. n->newname = $7;
  6424. n->missing_ok = false;
  6425. $$ = (Node *)n;
  6426. }
  6427. | ALTER COLLATION any_name RENAME TO name
  6428. {
  6429. RenameStmt *n = makeNode(RenameStmt);
  6430. n->renameType = OBJECT_COLLATION;
  6431. n->object = $3;
  6432. n->newname = $6;
  6433. n->missing_ok = false;
  6434. $$ = (Node *)n;
  6435. }
  6436. | ALTER CONVERSION_P any_name RENAME TO name
  6437. {
  6438. RenameStmt *n = makeNode(RenameStmt);
  6439. n->renameType = OBJECT_CONVERSION;
  6440. n->object = $3;
  6441. n->newname = $6;
  6442. n->missing_ok = false;
  6443. $$ = (Node *)n;
  6444. }
  6445. | ALTER DATABASE database_name RENAME TO database_name
  6446. {
  6447. RenameStmt *n = makeNode(RenameStmt);
  6448. n->renameType = OBJECT_DATABASE;
  6449. n->subname = $3;
  6450. n->newname = $6;
  6451. n->missing_ok = false;
  6452. $$ = (Node *)n;
  6453. }
  6454. | ALTER DOMAIN_P any_name RENAME TO name
  6455. {
  6456. RenameStmt *n = makeNode(RenameStmt);
  6457. n->renameType = OBJECT_DOMAIN;
  6458. n->object = $3;
  6459. n->newname = $6;
  6460. n->missing_ok = false;
  6461. $$ = (Node *)n;
  6462. }
  6463. | ALTER DOMAIN_P any_name RENAME CONSTRAINT name TO name
  6464. {
  6465. RenameStmt *n = makeNode(RenameStmt);
  6466. n->renameType = OBJECT_CONSTRAINT;
  6467. n->relationType = OBJECT_DOMAIN;
  6468. n->object = $3;
  6469. n->subname = $6;
  6470. n->newname = $8;
  6471. $$ = (Node *)n;
  6472. }
  6473. | ALTER FOREIGN DATA_P WRAPPER name RENAME TO name
  6474. {
  6475. RenameStmt *n = makeNode(RenameStmt);
  6476. n->renameType = OBJECT_FDW;
  6477. n->object = list_make1(makeString($5));
  6478. n->newname = $8;
  6479. n->missing_ok = false;
  6480. $$ = (Node *)n;
  6481. }
  6482. | ALTER FUNCTION function_with_argtypes RENAME TO name
  6483. {
  6484. RenameStmt *n = makeNode(RenameStmt);
  6485. n->renameType = OBJECT_FUNCTION;
  6486. n->object = $3->funcname;
  6487. n->objarg = $3->funcargs;
  6488. n->newname = $6;
  6489. n->missing_ok = false;
  6490. $$ = (Node *)n;
  6491. }
  6492. | ALTER GROUP_P RoleId RENAME TO RoleId
  6493. {
  6494. RenameStmt *n = makeNode(RenameStmt);
  6495. n->renameType = OBJECT_ROLE;
  6496. n->subname = $3;
  6497. n->newname = $6;
  6498. n->missing_ok = false;
  6499. $$ = (Node *)n;
  6500. }
  6501. | ALTER opt_procedural LANGUAGE name RENAME TO name
  6502. {
  6503. RenameStmt *n = makeNode(RenameStmt);
  6504. n->renameType = OBJECT_LANGUAGE;
  6505. n->object = list_make1(makeString($4));
  6506. n->newname = $7;
  6507. n->missing_ok = false;
  6508. $$ = (Node *)n;
  6509. }
  6510. | ALTER OPERATOR CLASS any_name USING access_method RENAME TO name
  6511. {
  6512. RenameStmt *n = makeNode(RenameStmt);
  6513. n->renameType = OBJECT_OPCLASS;
  6514. n->object = $4;
  6515. n->objarg = list_make1(makeString($6));
  6516. n->newname = $9;
  6517. n->missing_ok = false;
  6518. $$ = (Node *)n;
  6519. }
  6520. | ALTER OPERATOR FAMILY any_name USING access_method RENAME TO name
  6521. {
  6522. RenameStmt *n = makeNode(RenameStmt);
  6523. n->renameType = OBJECT_OPFAMILY;
  6524. n->object = $4;
  6525. n->objarg = list_make1(makeString($6));
  6526. n->newname = $9;
  6527. n->missing_ok = false;
  6528. $$ = (Node *)n;
  6529. }
  6530. | ALTER SCHEMA name RENAME TO name
  6531. {
  6532. RenameStmt *n = makeNode(RenameStmt);
  6533. n->renameType = OBJECT_SCHEMA;
  6534. n->subname = $3;
  6535. n->newname = $6;
  6536. n->missing_ok = false;
  6537. $$ = (Node *)n;
  6538. }
  6539. | ALTER SERVER name RENAME TO name
  6540. {
  6541. RenameStmt *n = makeNode(RenameStmt);
  6542. n->renameType = OBJECT_FOREIGN_SERVER;
  6543. n->object = list_make1(makeString($3));
  6544. n->newname = $6;
  6545. n->missing_ok = false;
  6546. $$ = (Node *)n;
  6547. }
  6548. | ALTER TABLE relation_expr RENAME TO name
  6549. {
  6550. RenameStmt *n = makeNode(RenameStmt);
  6551. n->renameType = OBJECT_TABLE;
  6552. n->relation = $3;
  6553. n->subname = NULL;
  6554. n->newname = $6;
  6555. n->missing_ok = false;
  6556. $$ = (Node *)n;
  6557. }
  6558. | ALTER TABLE IF_P EXISTS relation_expr RENAME TO name
  6559. {
  6560. RenameStmt *n = makeNode(RenameStmt);
  6561. n->renameType = OBJECT_TABLE;
  6562. n->relation = $5;
  6563. n->subname = NULL;
  6564. n->newname = $8;
  6565. n->missing_ok = true;
  6566. $$ = (Node *)n;
  6567. }
  6568. | ALTER SEQUENCE qualified_name RENAME TO name
  6569. {
  6570. RenameStmt *n = makeNode(RenameStmt);
  6571. n->renameType = OBJECT_SEQUENCE;
  6572. n->relation = $3;
  6573. n->subname = NULL;
  6574. n->newname = $6;
  6575. n->missing_ok = false;
  6576. $$ = (Node *)n;
  6577. }
  6578. | ALTER SEQUENCE IF_P EXISTS qualified_name RENAME TO name
  6579. {
  6580. RenameStmt *n = makeNode(RenameStmt);
  6581. n->renameType = OBJECT_SEQUENCE;
  6582. n->relation = $5;
  6583. n->subname = NULL;
  6584. n->newname = $8;
  6585. n->missing_ok = true;
  6586. $$ = (Node *)n;
  6587. }
  6588. | ALTER VIEW qualified_name RENAME TO name
  6589. {
  6590. RenameStmt *n = makeNode(RenameStmt);
  6591. n->renameType = OBJECT_VIEW;
  6592. n->relation = $3;
  6593. n->subname = NULL;
  6594. n->newname = $6;
  6595. n->missing_ok = false;
  6596. $$ = (Node *)n;
  6597. }
  6598. | ALTER VIEW IF_P EXISTS qualified_name RENAME TO name
  6599. {
  6600. RenameStmt *n = makeNode(RenameStmt);
  6601. n->renameType = OBJECT_VIEW;
  6602. n->relation = $5;
  6603. n->subname = NULL;
  6604. n->newname = $8;
  6605. n->missing_ok = true;
  6606. $$ = (Node *)n;
  6607. }
  6608. | ALTER MATERIALIZED VIEW qualified_name RENAME TO name
  6609. {
  6610. RenameStmt *n = makeNode(RenameStmt);
  6611. n->renameType = OBJECT_MATVIEW;
  6612. n->relation = $4;
  6613. n->subname = NULL;
  6614. n->newname = $7;
  6615. n->missing_ok = false;
  6616. $$ = (Node *)n;
  6617. }
  6618. | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name RENAME TO name
  6619. {
  6620. RenameStmt *n = makeNode(RenameStmt);
  6621. n->renameType = OBJECT_MATVIEW;
  6622. n->relation = $6;
  6623. n->subname = NULL;
  6624. n->newname = $9;
  6625. n->missing_ok = true;
  6626. $$ = (Node *)n;
  6627. }
  6628. | ALTER INDEX qualified_name RENAME TO name
  6629. {
  6630. RenameStmt *n = makeNode(RenameStmt);
  6631. n->renameType = OBJECT_INDEX;
  6632. n->relation = $3;
  6633. n->subname = NULL;
  6634. n->newname = $6;
  6635. n->missing_ok = false;
  6636. $$ = (Node *)n;
  6637. }
  6638. | ALTER INDEX IF_P EXISTS qualified_name RENAME TO name
  6639. {
  6640. RenameStmt *n = makeNode(RenameStmt);
  6641. n->renameType = OBJECT_INDEX;
  6642. n->relation = $5;
  6643. n->subname = NULL;
  6644. n->newname = $8;
  6645. n->missing_ok = true;
  6646. $$ = (Node *)n;
  6647. }
  6648. | ALTER FOREIGN TABLE relation_expr RENAME TO name
  6649. {
  6650. RenameStmt *n = makeNode(RenameStmt);
  6651. n->renameType = OBJECT_FOREIGN_TABLE;
  6652. n->relation = $4;
  6653. n->subname = NULL;
  6654. n->newname = $7;
  6655. n->missing_ok = false;
  6656. $$ = (Node *)n;
  6657. }
  6658. | ALTER FOREIGN TABLE IF_P EXISTS relation_expr RENAME TO name
  6659. {
  6660. RenameStmt *n = makeNode(RenameStmt);
  6661. n->renameType = OBJECT_FOREIGN_TABLE;
  6662. n->relation = $6;
  6663. n->subname = NULL;
  6664. n->newname = $9;
  6665. n->missing_ok = true;
  6666. $$ = (Node *)n;
  6667. }
  6668. | ALTER TABLE relation_expr RENAME opt_column name TO name
  6669. {
  6670. RenameStmt *n = makeNode(RenameStmt);
  6671. n->renameType = OBJECT_COLUMN;
  6672. n->relationType = OBJECT_TABLE;
  6673. n->relation = $3;
  6674. n->subname = $6;
  6675. n->newname = $8;
  6676. n->missing_ok = false;
  6677. $$ = (Node *)n;
  6678. }
  6679. | ALTER TABLE IF_P EXISTS relation_expr RENAME opt_column name TO name
  6680. {
  6681. RenameStmt *n = makeNode(RenameStmt);
  6682. n->renameType = OBJECT_COLUMN;
  6683. n->relationType = OBJECT_TABLE;
  6684. n->relation = $5;
  6685. n->subname = $8;
  6686. n->newname = $10;
  6687. n->missing_ok = true;
  6688. $$ = (Node *)n;
  6689. }
  6690. | ALTER MATERIALIZED VIEW qualified_name RENAME opt_column name TO name
  6691. {
  6692. RenameStmt *n = makeNode(RenameStmt);
  6693. n->renameType = OBJECT_COLUMN;
  6694. n->relationType = OBJECT_MATVIEW;
  6695. n->relation = $4;
  6696. n->subname = $7;
  6697. n->newname = $9;
  6698. n->missing_ok = false;
  6699. $$ = (Node *)n;
  6700. }
  6701. | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name RENAME opt_column name TO name
  6702. {
  6703. RenameStmt *n = makeNode(RenameStmt);
  6704. n->renameType = OBJECT_COLUMN;
  6705. n->relationType = OBJECT_MATVIEW;
  6706. n->relation = $6;
  6707. n->subname = $9;
  6708. n->newname = $11;
  6709. n->missing_ok = true;
  6710. $$ = (Node *)n;
  6711. }
  6712. | ALTER TABLE relation_expr RENAME CONSTRAINT name TO name
  6713. {
  6714. RenameStmt *n = makeNode(RenameStmt);
  6715. n->renameType = OBJECT_CONSTRAINT;
  6716. n->relationType = OBJECT_TABLE;
  6717. n->relation = $3;
  6718. n->subname = $6;
  6719. n->newname = $8;
  6720. $$ = (Node *)n;
  6721. }
  6722. | ALTER FOREIGN TABLE relation_expr RENAME opt_column name TO name
  6723. {
  6724. RenameStmt *n = makeNode(RenameStmt);
  6725. n->renameType = OBJECT_COLUMN;
  6726. n->relationType = OBJECT_FOREIGN_TABLE;
  6727. n->relation = $4;
  6728. n->subname = $7;
  6729. n->newname = $9;
  6730. n->missing_ok = false;
  6731. $$ = (Node *)n;
  6732. }
  6733. | ALTER FOREIGN TABLE IF_P EXISTS relation_expr RENAME opt_column name TO name
  6734. {
  6735. RenameStmt *n = makeNode(RenameStmt);
  6736. n->renameType = OBJECT_COLUMN;
  6737. n->relationType = OBJECT_FOREIGN_TABLE;
  6738. n->relation = $6;
  6739. n->subname = $9;
  6740. n->newname = $11;
  6741. n->missing_ok = true;
  6742. $$ = (Node *)n;
  6743. }
  6744. | ALTER RULE name ON qualified_name RENAME TO name
  6745. {
  6746. RenameStmt *n = makeNode(RenameStmt);
  6747. n->renameType = OBJECT_RULE;
  6748. n->relation = $5;
  6749. n->subname = $3;
  6750. n->newname = $8;
  6751. n->missing_ok = false;
  6752. $$ = (Node *)n;
  6753. }
  6754. | ALTER TRIGGER name ON qualified_name RENAME TO name
  6755. {
  6756. RenameStmt *n = makeNode(RenameStmt);
  6757. n->renameType = OBJECT_TRIGGER;
  6758. n->relation = $5;
  6759. n->subname = $3;
  6760. n->newname = $8;
  6761. n->missing_ok = false;
  6762. $$ = (Node *)n;
  6763. }
  6764. | ALTER EVENT TRIGGER name RENAME TO name
  6765. {
  6766. RenameStmt *n = makeNode(RenameStmt);
  6767. n->renameType = OBJECT_EVENT_TRIGGER;
  6768. n->object = list_make1(makeString($4));
  6769. n->newname = $7;
  6770. $$ = (Node *)n;
  6771. }
  6772. | ALTER ROLE RoleId RENAME TO RoleId
  6773. {
  6774. RenameStmt *n = makeNode(RenameStmt);
  6775. n->renameType = OBJECT_ROLE;
  6776. n->subname = $3;
  6777. n->newname = $6;
  6778. n->missing_ok = false;
  6779. $$ = (Node *)n;
  6780. }
  6781. | ALTER USER RoleId RENAME TO RoleId
  6782. {
  6783. RenameStmt *n = makeNode(RenameStmt);
  6784. n->renameType = OBJECT_ROLE;
  6785. n->subname = $3;
  6786. n->newname = $6;
  6787. n->missing_ok = false;
  6788. $$ = (Node *)n;
  6789. }
  6790. | ALTER TABLESPACE name RENAME TO name
  6791. {
  6792. RenameStmt *n = makeNode(RenameStmt);
  6793. n->renameType = OBJECT_TABLESPACE;
  6794. n->subname = $3;
  6795. n->newname = $6;
  6796. n->missing_ok = false;
  6797. $$ = (Node *)n;
  6798. }
  6799. | ALTER TABLESPACE name MOVE ALL TO name opt_nowait
  6800. {
  6801. AlterTableSpaceMoveStmt *n =
  6802. makeNode(AlterTableSpaceMoveStmt);
  6803. n->orig_tablespacename = $3;
  6804. n->objtype = -1;
  6805. n->move_all = true;
  6806. n->roles = NIL;
  6807. n->new_tablespacename = $7;
  6808. n->nowait = $8;
  6809. $$ = (Node *)n;
  6810. }
  6811. | ALTER TABLESPACE name MOVE TABLES TO name opt_nowait
  6812. {
  6813. AlterTableSpaceMoveStmt *n =
  6814. makeNode(AlterTableSpaceMoveStmt);
  6815. n->orig_tablespacename = $3;
  6816. n->objtype = OBJECT_TABLE;
  6817. n->move_all = false;
  6818. n->roles = NIL;
  6819. n->new_tablespacename = $7;
  6820. n->nowait = $8;
  6821. $$ = (Node *)n;
  6822. }
  6823. | ALTER TABLESPACE name MOVE INDEXES TO name opt_nowait
  6824. {
  6825. AlterTableSpaceMoveStmt *n =
  6826. makeNode(AlterTableSpaceMoveStmt);
  6827. n->orig_tablespacename = $3;
  6828. n->objtype = OBJECT_INDEX;
  6829. n->move_all = false;
  6830. n->roles = NIL;
  6831. n->new_tablespacename = $7;
  6832. n->nowait = $8;
  6833. $$ = (Node *)n;
  6834. }
  6835. | ALTER TABLESPACE name MOVE MATERIALIZED VIEWS TO name opt_nowait
  6836. {
  6837. AlterTableSpaceMoveStmt *n =
  6838. makeNode(AlterTableSpaceMoveStmt);
  6839. n->orig_tablespacename = $3;
  6840. n->objtype = OBJECT_MATVIEW;
  6841. n->move_all = false;
  6842. n->roles = NIL;
  6843. n->new_tablespacename = $8;
  6844. n->nowait = $9;
  6845. $$ = (Node *)n;
  6846. }
  6847. | ALTER TABLESPACE name MOVE ALL OWNED BY role_list TO name opt_nowait
  6848. {
  6849. AlterTableSpaceMoveStmt *n =
  6850. makeNode(AlterTableSpaceMoveStmt);
  6851. n->orig_tablespacename = $3;
  6852. n->objtype = -1;
  6853. n->move_all = true;
  6854. n->roles = $8;
  6855. n->new_tablespacename = $10;
  6856. n->nowait = $11;
  6857. $$ = (Node *)n;
  6858. }
  6859. | ALTER TABLESPACE name MOVE TABLES OWNED BY role_list TO name opt_nowait
  6860. {
  6861. AlterTableSpaceMoveStmt *n =
  6862. makeNode(AlterTableSpaceMoveStmt);
  6863. n->orig_tablespacename = $3;
  6864. n->objtype = OBJECT_TABLE;
  6865. n->move_all = false;
  6866. n->roles = $8;
  6867. n->new_tablespacename = $10;
  6868. n->nowait = $11;
  6869. $$ = (Node *)n;
  6870. }
  6871. | ALTER TABLESPACE name MOVE INDEXES OWNED BY role_list TO name opt_nowait
  6872. {
  6873. AlterTableSpaceMoveStmt *n =
  6874. makeNode(AlterTableSpaceMoveStmt);
  6875. n->orig_tablespacename = $3;
  6876. n->objtype = OBJECT_INDEX;
  6877. n->move_all = false;
  6878. n->roles = $8;
  6879. n->new_tablespacename = $10;
  6880. n->nowait = $11;
  6881. $$ = (Node *)n;
  6882. }
  6883. | ALTER TABLESPACE name MOVE MATERIALIZED VIEWS OWNED BY role_list TO name opt_nowait
  6884. {
  6885. AlterTableSpaceMoveStmt *n =
  6886. makeNode(AlterTableSpaceMoveStmt);
  6887. n->orig_tablespacename = $3;
  6888. n->objtype = OBJECT_MATVIEW;
  6889. n->move_all = false;
  6890. n->roles = $9;
  6891. n->new_tablespacename = $11;
  6892. n->nowait = $12;
  6893. $$ = (Node *)n;
  6894. }
  6895. | ALTER TABLESPACE name SET reloptions
  6896. {
  6897. AlterTableSpaceOptionsStmt *n =
  6898. makeNode(AlterTableSpaceOptionsStmt);
  6899. n->tablespacename = $3;
  6900. n->options = $5;
  6901. n->isReset = FALSE;
  6902. $$ = (Node *)n;
  6903. }
  6904. | ALTER TABLESPACE name RESET reloptions
  6905. {
  6906. AlterTableSpaceOptionsStmt *n =
  6907. makeNode(AlterTableSpaceOptionsStmt);
  6908. n->tablespacename = $3;
  6909. n->options = $5;
  6910. n->isReset = TRUE;
  6911. $$ = (Node *)n;
  6912. }
  6913. | ALTER TEXT_P SEARCH PARSER any_name RENAME TO name
  6914. {
  6915. RenameStmt *n = makeNode(RenameStmt);
  6916. n->renameType = OBJECT_TSPARSER;
  6917. n->object = $5;
  6918. n->newname = $8;
  6919. n->missing_ok = false;
  6920. $$ = (Node *)n;
  6921. }
  6922. | ALTER TEXT_P SEARCH DICTIONARY any_name RENAME TO name
  6923. {
  6924. RenameStmt *n = makeNode(RenameStmt);
  6925. n->renameType = OBJECT_TSDICTIONARY;
  6926. n->object = $5;
  6927. n->newname = $8;
  6928. n->missing_ok = false;
  6929. $$ = (Node *)n;
  6930. }
  6931. | ALTER TEXT_P SEARCH TEMPLATE any_name RENAME TO name
  6932. {
  6933. RenameStmt *n = makeNode(RenameStmt);
  6934. n->renameType = OBJECT_TSTEMPLATE;
  6935. n->object = $5;
  6936. n->newname = $8;
  6937. n->missing_ok = false;
  6938. $$ = (Node *)n;
  6939. }
  6940. | ALTER TEXT_P SEARCH CONFIGURATION any_name RENAME TO name
  6941. {
  6942. RenameStmt *n = makeNode(RenameStmt);
  6943. n->renameType = OBJECT_TSCONFIGURATION;
  6944. n->object = $5;
  6945. n->newname = $8;
  6946. n->missing_ok = false;
  6947. $$ = (Node *)n;
  6948. }
  6949. | ALTER TYPE_P any_name RENAME TO name
  6950. {
  6951. RenameStmt *n = makeNode(RenameStmt);
  6952. n->renameType = OBJECT_TYPE;
  6953. n->object = $3;
  6954. n->newname = $6;
  6955. n->missing_ok = false;
  6956. $$ = (Node *)n;
  6957. }
  6958. | ALTER TYPE_P any_name RENAME ATTRIBUTE name TO name opt_drop_behavior
  6959. {
  6960. RenameStmt *n = makeNode(RenameStmt);
  6961. n->renameType = OBJECT_ATTRIBUTE;
  6962. n->relationType = OBJECT_TYPE;
  6963. n->relation = makeRangeVarFromAnyName($3, @3, yyscanner);
  6964. n->subname = $6;
  6965. n->newname = $8;
  6966. n->behavior = $9;
  6967. n->missing_ok = false;
  6968. $$ = (Node *)n;
  6969. }
  6970. ;
  6971. opt_column: COLUMN { $$ = COLUMN; }
  6972. | /*EMPTY*/ { $$ = 0; }
  6973. ;
  6974. opt_set_data: SET DATA_P { $$ = 1; }
  6975. | /*EMPTY*/ { $$ = 0; }
  6976. ;
  6977. /*****************************************************************************
  6978. *
  6979. * ALTER THING name SET SCHEMA name
  6980. *
  6981. *****************************************************************************/
  6982. AlterObjectSchemaStmt:
  6983. ALTER AGGREGATE func_name aggr_args SET SCHEMA name
  6984. {
  6985. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  6986. n->objectType = OBJECT_AGGREGATE;
  6987. n->object = $3;
  6988. n->objarg = extractAggrArgTypes($4);
  6989. n->newschema = $7;
  6990. n->missing_ok = false;
  6991. $$ = (Node *)n;
  6992. }
  6993. | ALTER COLLATION any_name SET SCHEMA name
  6994. {
  6995. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  6996. n->objectType = OBJECT_COLLATION;
  6997. n->object = $3;
  6998. n->newschema = $6;
  6999. n->missing_ok = false;
  7000. $$ = (Node *)n;
  7001. }
  7002. | ALTER CONVERSION_P any_name SET SCHEMA name
  7003. {
  7004. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  7005. n->objectType = OBJECT_CONVERSION;
  7006. n->object = $3;
  7007. n->newschema = $6;
  7008. n->missing_ok = false;
  7009. $$ = (Node *)n;
  7010. }
  7011. | ALTER DOMAIN_P any_name SET SCHEMA name
  7012. {
  7013. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  7014. n->objectType = OBJECT_DOMAIN;
  7015. n->object = $3;
  7016. n->newschema = $6;
  7017. n->missing_ok = false;
  7018. $$ = (Node *)n;
  7019. }
  7020. | ALTER EXTENSION any_name SET SCHEMA name
  7021. {
  7022. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  7023. n->objectType = OBJECT_EXTENSION;
  7024. n->object = $3;
  7025. n->newschema = $6;
  7026. n->missing_ok = false;
  7027. $$ = (Node *)n;
  7028. }
  7029. | ALTER FUNCTION function_with_argtypes SET SCHEMA name
  7030. {
  7031. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  7032. n->objectType = OBJECT_FUNCTION;
  7033. n->object = $3->funcname;
  7034. n->objarg = $3->funcargs;
  7035. n->newschema = $6;
  7036. n->missing_ok = false;
  7037. $$ = (Node *)n;
  7038. }
  7039. | ALTER OPERATOR any_operator oper_argtypes SET SCHEMA name
  7040. {
  7041. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  7042. n->objectType = OBJECT_OPERATOR;
  7043. n->object = $3;
  7044. n->objarg = $4;
  7045. n->newschema = $7;
  7046. n->missing_ok = false;
  7047. $$ = (Node *)n;
  7048. }
  7049. | ALTER OPERATOR CLASS any_name USING access_method SET SCHEMA name
  7050. {
  7051. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  7052. n->objectType = OBJECT_OPCLASS;
  7053. n->object = $4;
  7054. n->objarg = list_make1(makeString($6));
  7055. n->newschema = $9;
  7056. n->missing_ok = false;
  7057. $$ = (Node *)n;
  7058. }
  7059. | ALTER OPERATOR FAMILY any_name USING access_method SET SCHEMA name
  7060. {
  7061. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  7062. n->objectType = OBJECT_OPFAMILY;
  7063. n->object = $4;
  7064. n->objarg = list_make1(makeString($6));
  7065. n->newschema = $9;
  7066. n->missing_ok = false;
  7067. $$ = (Node *)n;
  7068. }
  7069. | ALTER TABLE relation_expr SET SCHEMA name
  7070. {
  7071. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  7072. n->objectType = OBJECT_TABLE;
  7073. n->relation = $3;
  7074. n->newschema = $6;
  7075. n->missing_ok = false;
  7076. $$ = (Node *)n;
  7077. }
  7078. | ALTER TABLE IF_P EXISTS relation_expr SET SCHEMA name
  7079. {
  7080. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  7081. n->objectType = OBJECT_TABLE;
  7082. n->relation = $5;
  7083. n->newschema = $8;
  7084. n->missing_ok = true;
  7085. $$ = (Node *)n;
  7086. }
  7087. | ALTER TEXT_P SEARCH PARSER any_name SET SCHEMA name
  7088. {
  7089. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  7090. n->objectType = OBJECT_TSPARSER;
  7091. n->object = $5;
  7092. n->newschema = $8;
  7093. n->missing_ok = false;
  7094. $$ = (Node *)n;
  7095. }
  7096. | ALTER TEXT_P SEARCH DICTIONARY any_name SET SCHEMA name
  7097. {
  7098. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  7099. n->objectType = OBJECT_TSDICTIONARY;
  7100. n->object = $5;
  7101. n->newschema = $8;
  7102. n->missing_ok = false;
  7103. $$ = (Node *)n;
  7104. }
  7105. | ALTER TEXT_P SEARCH TEMPLATE any_name SET SCHEMA name
  7106. {
  7107. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  7108. n->objectType = OBJECT_TSTEMPLATE;
  7109. n->object = $5;
  7110. n->newschema = $8;
  7111. n->missing_ok = false;
  7112. $$ = (Node *)n;
  7113. }
  7114. | ALTER TEXT_P SEARCH CONFIGURATION any_name SET SCHEMA name
  7115. {
  7116. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  7117. n->objectType = OBJECT_TSCONFIGURATION;
  7118. n->object = $5;
  7119. n->newschema = $8;
  7120. n->missing_ok = false;
  7121. $$ = (Node *)n;
  7122. }
  7123. | ALTER SEQUENCE qualified_name SET SCHEMA name
  7124. {
  7125. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  7126. n->objectType = OBJECT_SEQUENCE;
  7127. n->relation = $3;
  7128. n->newschema = $6;
  7129. n->missing_ok = false;
  7130. $$ = (Node *)n;
  7131. }
  7132. | ALTER SEQUENCE IF_P EXISTS qualified_name SET SCHEMA name
  7133. {
  7134. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  7135. n->objectType = OBJECT_SEQUENCE;
  7136. n->relation = $5;
  7137. n->newschema = $8;
  7138. n->missing_ok = true;
  7139. $$ = (Node *)n;
  7140. }
  7141. | ALTER VIEW qualified_name SET SCHEMA name
  7142. {
  7143. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  7144. n->objectType = OBJECT_VIEW;
  7145. n->relation = $3;
  7146. n->newschema = $6;
  7147. n->missing_ok = false;
  7148. $$ = (Node *)n;
  7149. }
  7150. | ALTER VIEW IF_P EXISTS qualified_name SET SCHEMA name
  7151. {
  7152. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  7153. n->objectType = OBJECT_VIEW;
  7154. n->relation = $5;
  7155. n->newschema = $8;
  7156. n->missing_ok = true;
  7157. $$ = (Node *)n;
  7158. }
  7159. | ALTER MATERIALIZED VIEW qualified_name SET SCHEMA name
  7160. {
  7161. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  7162. n->objectType = OBJECT_MATVIEW;
  7163. n->relation = $4;
  7164. n->newschema = $7;
  7165. n->missing_ok = false;
  7166. $$ = (Node *)n;
  7167. }
  7168. | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name SET SCHEMA name
  7169. {
  7170. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  7171. n->objectType = OBJECT_MATVIEW;
  7172. n->relation = $6;
  7173. n->newschema = $9;
  7174. n->missing_ok = true;
  7175. $$ = (Node *)n;
  7176. }
  7177. | ALTER FOREIGN TABLE relation_expr SET SCHEMA name
  7178. {
  7179. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  7180. n->objectType = OBJECT_FOREIGN_TABLE;
  7181. n->relation = $4;
  7182. n->newschema = $7;
  7183. n->missing_ok = false;
  7184. $$ = (Node *)n;
  7185. }
  7186. | ALTER FOREIGN TABLE IF_P EXISTS relation_expr SET SCHEMA name
  7187. {
  7188. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  7189. n->objectType = OBJECT_FOREIGN_TABLE;
  7190. n->relation = $6;
  7191. n->newschema = $9;
  7192. n->missing_ok = true;
  7193. $$ = (Node *)n;
  7194. }
  7195. | ALTER TYPE_P any_name SET SCHEMA name
  7196. {
  7197. AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  7198. n->objectType = OBJECT_TYPE;
  7199. n->object = $3;
  7200. n->newschema = $6;
  7201. n->missing_ok = false;
  7202. $$ = (Node *)n;
  7203. }
  7204. ;
  7205. /*****************************************************************************
  7206. *
  7207. * ALTER THING name OWNER TO newname
  7208. *
  7209. *****************************************************************************/
  7210. AlterOwnerStmt: ALTER AGGREGATE func_name aggr_args OWNER TO RoleId
  7211. {
  7212. AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  7213. n->objectType = OBJECT_AGGREGATE;
  7214. n->object = $3;
  7215. n->objarg = extractAggrArgTypes($4);
  7216. n->newowner = $7;
  7217. $$ = (Node *)n;
  7218. }
  7219. | ALTER COLLATION any_name OWNER TO RoleId
  7220. {
  7221. AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  7222. n->objectType = OBJECT_COLLATION;
  7223. n->object = $3;
  7224. n->newowner = $6;
  7225. $$ = (Node *)n;
  7226. }
  7227. | ALTER CONVERSION_P any_name OWNER TO RoleId
  7228. {
  7229. AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  7230. n->objectType = OBJECT_CONVERSION;
  7231. n->object = $3;
  7232. n->newowner = $6;
  7233. $$ = (Node *)n;
  7234. }
  7235. | ALTER DATABASE database_name OWNER TO RoleId
  7236. {
  7237. AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  7238. n->objectType = OBJECT_DATABASE;
  7239. n->object = list_make1(makeString($3));
  7240. n->newowner = $6;
  7241. $$ = (Node *)n;
  7242. }
  7243. | ALTER DOMAIN_P any_name OWNER TO RoleId
  7244. {
  7245. AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  7246. n->objectType = OBJECT_DOMAIN;
  7247. n->object = $3;
  7248. n->newowner = $6;
  7249. $$ = (Node *)n;
  7250. }
  7251. | ALTER FUNCTION function_with_argtypes OWNER TO RoleId
  7252. {
  7253. AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  7254. n->objectType = OBJECT_FUNCTION;
  7255. n->object = $3->funcname;
  7256. n->objarg = $3->funcargs;
  7257. n->newowner = $6;
  7258. $$ = (Node *)n;
  7259. }
  7260. | ALTER opt_procedural LANGUAGE name OWNER TO RoleId
  7261. {
  7262. AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  7263. n->objectType = OBJECT_LANGUAGE;
  7264. n->object = list_make1(makeString($4));
  7265. n->newowner = $7;
  7266. $$ = (Node *)n;
  7267. }
  7268. | ALTER LARGE_P OBJECT_P NumericOnly OWNER TO RoleId
  7269. {
  7270. AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  7271. n->objectType = OBJECT_LARGEOBJECT;
  7272. n->object = list_make1($4);
  7273. n->newowner = $7;
  7274. $$ = (Node *)n;
  7275. }
  7276. | ALTER OPERATOR any_operator oper_argtypes OWNER TO RoleId
  7277. {
  7278. AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  7279. n->objectType = OBJECT_OPERATOR;
  7280. n->object = $3;
  7281. n->objarg = $4;
  7282. n->newowner = $7;
  7283. $$ = (Node *)n;
  7284. }
  7285. | ALTER OPERATOR CLASS any_name USING access_method OWNER TO RoleId
  7286. {
  7287. AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  7288. n->objectType = OBJECT_OPCLASS;
  7289. n->object = $4;
  7290. n->objarg = list_make1(makeString($6));
  7291. n->newowner = $9;
  7292. $$ = (Node *)n;
  7293. }
  7294. | ALTER OPERATOR FAMILY any_name USING access_method OWNER TO RoleId
  7295. {
  7296. AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  7297. n->objectType = OBJECT_OPFAMILY;
  7298. n->object = $4;
  7299. n->objarg = list_make1(makeString($6));
  7300. n->newowner = $9;
  7301. $$ = (Node *)n;
  7302. }
  7303. | ALTER SCHEMA name OWNER TO RoleId
  7304. {
  7305. AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  7306. n->objectType = OBJECT_SCHEMA;
  7307. n->object = list_make1(makeString($3));
  7308. n->newowner = $6;
  7309. $$ = (Node *)n;
  7310. }
  7311. | ALTER TYPE_P any_name OWNER TO RoleId
  7312. {
  7313. AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  7314. n->objectType = OBJECT_TYPE;
  7315. n->object = $3;
  7316. n->newowner = $6;
  7317. $$ = (Node *)n;
  7318. }
  7319. | ALTER TABLESPACE name OWNER TO RoleId
  7320. {
  7321. AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  7322. n->objectType = OBJECT_TABLESPACE;
  7323. n->object = list_make1(makeString($3));
  7324. n->newowner = $6;
  7325. $$ = (Node *)n;
  7326. }
  7327. | ALTER TEXT_P SEARCH DICTIONARY any_name OWNER TO RoleId
  7328. {
  7329. AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  7330. n->objectType = OBJECT_TSDICTIONARY;
  7331. n->object = $5;
  7332. n->newowner = $8;
  7333. $$ = (Node *)n;
  7334. }
  7335. | ALTER TEXT_P SEARCH CONFIGURATION any_name OWNER TO RoleId
  7336. {
  7337. AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  7338. n->objectType = OBJECT_TSCONFIGURATION;
  7339. n->object = $5;
  7340. n->newowner = $8;
  7341. $$ = (Node *)n;
  7342. }
  7343. | ALTER FOREIGN DATA_P WRAPPER name OWNER TO RoleId
  7344. {
  7345. AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  7346. n->objectType = OBJECT_FDW;
  7347. n->object = list_make1(makeString($5));
  7348. n->newowner = $8;
  7349. $$ = (Node *)n;
  7350. }
  7351. | ALTER SERVER name OWNER TO RoleId
  7352. {
  7353. AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  7354. n->objectType = OBJECT_FOREIGN_SERVER;
  7355. n->object = list_make1(makeString($3));
  7356. n->newowner = $6;
  7357. $$ = (Node *)n;
  7358. }
  7359. | ALTER EVENT TRIGGER name OWNER TO RoleId
  7360. {
  7361. AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  7362. n->objectType = OBJECT_EVENT_TRIGGER;
  7363. n->object = list_make1(makeString($4));
  7364. n->newowner = $7;
  7365. $$ = (Node *)n;
  7366. }
  7367. ;
  7368. /*****************************************************************************
  7369. *
  7370. * QUERY: Define Rewrite Rule
  7371. *
  7372. *****************************************************************************/
  7373. RuleStmt: CREATE opt_or_replace RULE name AS
  7374. ON event TO qualified_name where_clause
  7375. DO opt_instead RuleActionList
  7376. {
  7377. RuleStmt *n = makeNode(RuleStmt);
  7378. n->replace = $2;
  7379. n->relation = $9;
  7380. n->rulename = $4;
  7381. n->whereClause = $10;
  7382. n->event = $7;
  7383. n->instead = $12;
  7384. n->actions = $13;
  7385. $$ = (Node *)n;
  7386. }
  7387. ;
  7388. RuleActionList:
  7389. NOTHING { $$ = NIL; }
  7390. | RuleActionStmt { $$ = list_make1($1); }
  7391. | '(' RuleActionMulti ')' { $$ = $2; }
  7392. ;
  7393. /* the thrashing around here is to discard "empty" statements... */
  7394. RuleActionMulti:
  7395. RuleActionMulti ';' RuleActionStmtOrEmpty
  7396. { if ($3 != NULL)
  7397. $$ = lappend($1, $3);
  7398. else
  7399. $$ = $1;
  7400. }
  7401. | RuleActionStmtOrEmpty
  7402. { if ($1 != NULL)
  7403. $$ = list_make1($1);
  7404. else
  7405. $$ = NIL;
  7406. }
  7407. ;
  7408. RuleActionStmt:
  7409. SelectStmt
  7410. | InsertStmt
  7411. | UpdateStmt
  7412. | DeleteStmt
  7413. | NotifyStmt
  7414. ;
  7415. RuleActionStmtOrEmpty:
  7416. RuleActionStmt { $$ = $1; }
  7417. | /*EMPTY*/ { $$ = NULL; }
  7418. ;
  7419. event: SELECT { $$ = CMD_SELECT; }
  7420. | UPDATE { $$ = CMD_UPDATE; }
  7421. | DELETE_P { $$ = CMD_DELETE; }
  7422. | INSERT { $$ = CMD_INSERT; }
  7423. ;
  7424. opt_instead:
  7425. INSTEAD { $$ = TRUE; }
  7426. | ALSO { $$ = FALSE; }
  7427. | /*EMPTY*/ { $$ = FALSE; }
  7428. ;
  7429. DropRuleStmt:
  7430. DROP RULE name ON any_name opt_drop_behavior
  7431. {
  7432. DropStmt *n = makeNode(DropStmt);
  7433. n->removeType = OBJECT_RULE;
  7434. n->objects = list_make1(lappend($5, makeString($3)));
  7435. n->arguments = NIL;
  7436. n->behavior = $6;
  7437. n->missing_ok = false;
  7438. n->concurrent = false;
  7439. $$ = (Node *) n;
  7440. }
  7441. | DROP RULE IF_P EXISTS name ON any_name opt_drop_behavior
  7442. {
  7443. DropStmt *n = makeNode(DropStmt);
  7444. n->removeType = OBJECT_RULE;
  7445. n->objects = list_make1(lappend($7, makeString($5)));
  7446. n->arguments = NIL;
  7447. n->behavior = $8;
  7448. n->missing_ok = true;
  7449. n->concurrent = false;
  7450. $$ = (Node *) n;
  7451. }
  7452. ;
  7453. /*****************************************************************************
  7454. *
  7455. * QUERY:
  7456. * NOTIFY <identifier> can appear both in rule bodies and
  7457. * as a query-level command
  7458. *
  7459. *****************************************************************************/
  7460. NotifyStmt: NOTIFY ColId notify_payload
  7461. {
  7462. NotifyStmt *n = makeNode(NotifyStmt);
  7463. n->conditionname = $2;
  7464. n->payload = $3;
  7465. $$ = (Node *)n;
  7466. }
  7467. ;
  7468. notify_payload:
  7469. ',' Sconst { $$ = $2; }
  7470. | /*EMPTY*/ { $$ = NULL; }
  7471. ;
  7472. ListenStmt: LISTEN ColId
  7473. {
  7474. ListenStmt *n = makeNode(ListenStmt);
  7475. n->conditionname = $2;
  7476. $$ = (Node *)n;
  7477. }
  7478. ;
  7479. UnlistenStmt:
  7480. UNLISTEN ColId
  7481. {
  7482. UnlistenStmt *n = makeNode(UnlistenStmt);
  7483. n->conditionname = $2;
  7484. $$ = (Node *)n;
  7485. }
  7486. | UNLISTEN '*'
  7487. {
  7488. UnlistenStmt *n = makeNode(UnlistenStmt);
  7489. n->conditionname = NULL;
  7490. $$ = (Node *)n;
  7491. }
  7492. ;
  7493. /*****************************************************************************
  7494. *
  7495. * Transactions:
  7496. *
  7497. * BEGIN / COMMIT / ROLLBACK
  7498. * (also older versions END / ABORT)
  7499. *
  7500. *****************************************************************************/
  7501. TransactionStmt:
  7502. ABORT_P opt_transaction
  7503. {
  7504. TransactionStmt *n = makeNode(TransactionStmt);
  7505. n->kind = TRANS_STMT_ROLLBACK;
  7506. n->options = NIL;
  7507. $$ = (Node *)n;
  7508. }
  7509. | BEGIN_P opt_transaction transaction_mode_list_or_empty
  7510. {
  7511. TransactionStmt *n = makeNode(TransactionStmt);
  7512. n->kind = TRANS_STMT_BEGIN;
  7513. n->options = $3;
  7514. $$ = (Node *)n;
  7515. }
  7516. | START TRANSACTION transaction_mode_list_or_empty
  7517. {
  7518. TransactionStmt *n = makeNode(TransactionStmt);
  7519. n->kind = TRANS_STMT_START;
  7520. n->options = $3;
  7521. $$ = (Node *)n;
  7522. }
  7523. | COMMIT opt_transaction
  7524. {
  7525. TransactionStmt *n = makeNode(TransactionStmt);
  7526. n->kind = TRANS_STMT_COMMIT;
  7527. n->options = NIL;
  7528. $$ = (Node *)n;
  7529. }
  7530. | END_P opt_transaction
  7531. {
  7532. TransactionStmt *n = makeNode(TransactionStmt);
  7533. n->kind = TRANS_STMT_COMMIT;
  7534. n->options = NIL;
  7535. $$ = (Node *)n;
  7536. }
  7537. | ROLLBACK opt_transaction
  7538. {
  7539. TransactionStmt *n = makeNode(TransactionStmt);
  7540. n->kind = TRANS_STMT_ROLLBACK;
  7541. n->options = NIL;
  7542. $$ = (Node *)n;
  7543. }
  7544. | SAVEPOINT ColId
  7545. {
  7546. TransactionStmt *n = makeNode(TransactionStmt);
  7547. n->kind = TRANS_STMT_SAVEPOINT;
  7548. n->options = list_make1(makeDefElem("savepoint_name",
  7549. (Node *)makeString($2)));
  7550. $$ = (Node *)n;
  7551. }
  7552. | RELEASE SAVEPOINT ColId
  7553. {
  7554. TransactionStmt *n = makeNode(TransactionStmt);
  7555. n->kind = TRANS_STMT_RELEASE;
  7556. n->options = list_make1(makeDefElem("savepoint_name",
  7557. (Node *)makeString($3)));
  7558. $$ = (Node *)n;
  7559. }
  7560. | RELEASE ColId
  7561. {
  7562. TransactionStmt *n = makeNode(TransactionStmt);
  7563. n->kind = TRANS_STMT_RELEASE;
  7564. n->options = list_make1(makeDefElem("savepoint_name",
  7565. (Node *)makeString($2)));
  7566. $$ = (Node *)n;
  7567. }
  7568. | ROLLBACK opt_transaction TO SAVEPOINT ColId
  7569. {
  7570. TransactionStmt *n = makeNode(TransactionStmt);
  7571. n->kind = TRANS_STMT_ROLLBACK_TO;
  7572. n->options = list_make1(makeDefElem("savepoint_name",
  7573. (Node *)makeString($5)));
  7574. $$ = (Node *)n;
  7575. }
  7576. | ROLLBACK opt_transaction TO ColId
  7577. {
  7578. TransactionStmt *n = makeNode(TransactionStmt);
  7579. n->kind = TRANS_STMT_ROLLBACK_TO;
  7580. n->options = list_make1(makeDefElem("savepoint_name",
  7581. (Node *)makeString($4)));
  7582. $$ = (Node *)n;
  7583. }
  7584. | PREPARE TRANSACTION Sconst
  7585. {
  7586. TransactionStmt *n = makeNode(TransactionStmt);
  7587. n->kind = TRANS_STMT_PREPARE;
  7588. n->gid = $3;
  7589. $$ = (Node *)n;
  7590. }
  7591. | COMMIT PREPARED Sconst
  7592. {
  7593. TransactionStmt *n = makeNode(TransactionStmt);
  7594. n->kind = TRANS_STMT_COMMIT_PREPARED;
  7595. n->gid = $3;
  7596. $$ = (Node *)n;
  7597. }
  7598. | ROLLBACK PREPARED Sconst
  7599. {
  7600. TransactionStmt *n = makeNode(TransactionStmt);
  7601. n->kind = TRANS_STMT_ROLLBACK_PREPARED;
  7602. n->gid = $3;
  7603. $$ = (Node *)n;
  7604. }
  7605. ;
  7606. opt_transaction: WORK {}
  7607. | TRANSACTION {}
  7608. | /*EMPTY*/ {}
  7609. ;
  7610. transaction_mode_item:
  7611. ISOLATION LEVEL iso_level
  7612. { $$ = makeDefElem("transaction_isolation",
  7613. makeStringConst($3, @3)); }
  7614. | READ ONLY
  7615. { $$ = makeDefElem("transaction_read_only",
  7616. makeIntConst(TRUE, @1)); }
  7617. | READ WRITE
  7618. { $$ = makeDefElem("transaction_read_only",
  7619. makeIntConst(FALSE, @1)); }
  7620. | DEFERRABLE
  7621. { $$ = makeDefElem("transaction_deferrable",
  7622. makeIntConst(TRUE, @1)); }
  7623. | NOT DEFERRABLE
  7624. { $$ = makeDefElem("transaction_deferrable",
  7625. makeIntConst(FALSE, @1)); }
  7626. ;
  7627. /* Syntax with commas is SQL-spec, without commas is Postgres historical */
  7628. transaction_mode_list:
  7629. transaction_mode_item
  7630. { $$ = list_make1($1); }
  7631. | transaction_mode_list ',' transaction_mode_item
  7632. { $$ = lappend($1, $3); }
  7633. | transaction_mode_list transaction_mode_item
  7634. { $$ = lappend($1, $2); }
  7635. ;
  7636. transaction_mode_list_or_empty:
  7637. transaction_mode_list
  7638. | /* EMPTY */
  7639. { $$ = NIL; }
  7640. ;
  7641. /*****************************************************************************
  7642. *
  7643. * QUERY:
  7644. * CREATE [ OR REPLACE ] [ TEMP ] VIEW <viewname> '('target-list ')'
  7645. * AS <query> [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
  7646. *
  7647. *****************************************************************************/
  7648. ViewStmt: CREATE OptTemp VIEW qualified_name opt_column_list opt_reloptions
  7649. AS SelectStmt opt_check_option
  7650. {
  7651. ViewStmt *n = makeNode(ViewStmt);
  7652. n->view = $4;
  7653. n->view->relpersistence = $2;
  7654. n->aliases = $5;
  7655. n->query = $8;
  7656. n->replace = false;
  7657. n->options = $6;
  7658. n->withCheckOption = $9;
  7659. $$ = (Node *) n;
  7660. }
  7661. | CREATE OR REPLACE OptTemp VIEW qualified_name opt_column_list opt_reloptions
  7662. AS SelectStmt opt_check_option
  7663. {
  7664. ViewStmt *n = makeNode(ViewStmt);
  7665. n->view = $6;
  7666. n->view->relpersistence = $4;
  7667. n->aliases = $7;
  7668. n->query = $10;
  7669. n->replace = true;
  7670. n->options = $8;
  7671. n->withCheckOption = $11;
  7672. $$ = (Node *) n;
  7673. }
  7674. | CREATE OptTemp RECURSIVE VIEW qualified_name '(' columnList ')' opt_reloptions
  7675. AS SelectStmt opt_check_option
  7676. {
  7677. ViewStmt *n = makeNode(ViewStmt);
  7678. n->view = $5;
  7679. n->view->relpersistence = $2;
  7680. n->aliases = $7;
  7681. n->query = makeRecursiveViewSelect(n->view->relname, n->aliases, $11);
  7682. n->replace = false;
  7683. n->options = $9;
  7684. n->withCheckOption = $12;
  7685. if (n->withCheckOption != NO_CHECK_OPTION)
  7686. ereport(ERROR,
  7687. (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
  7688. errmsg("WITH CHECK OPTION not supported on recursive views"),
  7689. parser_errposition(@12)));
  7690. $$ = (Node *) n;
  7691. }
  7692. | CREATE OR REPLACE OptTemp RECURSIVE VIEW qualified_name '(' columnList ')' opt_reloptions
  7693. AS SelectStmt opt_check_option
  7694. {
  7695. ViewStmt *n = makeNode(ViewStmt);
  7696. n->view = $7;
  7697. n->view->relpersistence = $4;
  7698. n->aliases = $9;
  7699. n->query = makeRecursiveViewSelect(n->view->relname, n->aliases, $13);
  7700. n->replace = true;
  7701. n->options = $11;
  7702. n->withCheckOption = $14;
  7703. if (n->withCheckOption != NO_CHECK_OPTION)
  7704. ereport(ERROR,
  7705. (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
  7706. errmsg("WITH CHECK OPTION not supported on recursive views"),
  7707. parser_errposition(@14)));
  7708. $$ = (Node *) n;
  7709. }
  7710. ;
  7711. opt_check_option:
  7712. WITH CHECK OPTION { $$ = CASCADED_CHECK_OPTION; }
  7713. | WITH CASCADED CHECK OPTION { $$ = CASCADED_CHECK_OPTION; }
  7714. | WITH LOCAL CHECK OPTION { $$ = LOCAL_CHECK_OPTION; }
  7715. | /* EMPTY */ { $$ = NO_CHECK_OPTION; }
  7716. ;
  7717. /*****************************************************************************
  7718. *
  7719. * QUERY:
  7720. * LOAD "filename"
  7721. *
  7722. *****************************************************************************/
  7723. LoadStmt: LOAD file_name
  7724. {
  7725. LoadStmt *n = makeNode(LoadStmt);
  7726. n->filename = $2;
  7727. $$ = (Node *)n;
  7728. }
  7729. ;
  7730. /*****************************************************************************
  7731. *
  7732. * CREATE DATABASE
  7733. *
  7734. *****************************************************************************/
  7735. CreatedbStmt:
  7736. CREATE DATABASE database_name opt_with createdb_opt_list
  7737. {
  7738. CreatedbStmt *n = makeNode(CreatedbStmt);
  7739. n->dbname = $3;
  7740. n->options = $5;
  7741. $$ = (Node *)n;
  7742. }
  7743. ;
  7744. createdb_opt_list:
  7745. createdb_opt_list createdb_opt_item { $$ = lappend($1, $2); }
  7746. | /* EMPTY */ { $$ = NIL; }
  7747. ;
  7748. createdb_opt_item:
  7749. TABLESPACE opt_equal name
  7750. {
  7751. $$ = makeDefElem("tablespace", (Node *)makeString($3));
  7752. }
  7753. | TABLESPACE opt_equal DEFAULT
  7754. {
  7755. $$ = makeDefElem("tablespace", NULL);
  7756. }
  7757. | LOCATION opt_equal Sconst
  7758. {
  7759. $$ = makeDefElem("location", (Node *)makeString($3));
  7760. }
  7761. | LOCATION opt_equal DEFAULT
  7762. {
  7763. $$ = makeDefElem("location", NULL);
  7764. }
  7765. | TEMPLATE opt_equal name
  7766. {
  7767. $$ = makeDefElem("template", (Node *)makeString($3));
  7768. }
  7769. | TEMPLATE opt_equal DEFAULT
  7770. {
  7771. $$ = makeDefElem("template", NULL);
  7772. }
  7773. | ENCODING opt_equal Sconst
  7774. {
  7775. $$ = makeDefElem("encoding", (Node *)makeString($3));
  7776. }
  7777. | ENCODING opt_equal Iconst
  7778. {
  7779. $$ = makeDefElem("encoding", (Node *)makeInteger($3));
  7780. }
  7781. | ENCODING opt_equal DEFAULT
  7782. {
  7783. $$ = makeDefElem("encoding", NULL);
  7784. }
  7785. | LC_COLLATE_P opt_equal Sconst
  7786. {
  7787. $$ = makeDefElem("lc_collate", (Node *)makeString($3));
  7788. }
  7789. | LC_COLLATE_P opt_equal DEFAULT
  7790. {
  7791. $$ = makeDefElem("lc_collate", NULL);
  7792. }
  7793. | LC_CTYPE_P opt_equal Sconst
  7794. {
  7795. $$ = makeDefElem("lc_ctype", (Node *)makeString($3));
  7796. }
  7797. | LC_CTYPE_P opt_equal DEFAULT
  7798. {
  7799. $$ = makeDefElem("lc_ctype", NULL);
  7800. }
  7801. | CONNECTION LIMIT opt_equal SignedIconst
  7802. {
  7803. $$ = makeDefElem("connectionlimit", (Node *)makeInteger($4));
  7804. }
  7805. | OWNER opt_equal name
  7806. {
  7807. $$ = makeDefElem("owner", (Node *)makeString($3));
  7808. }
  7809. | OWNER opt_equal DEFAULT
  7810. {
  7811. $$ = makeDefElem("owner", NULL);
  7812. }
  7813. ;
  7814. /*
  7815. * Though the equals sign doesn't match other WITH options, pg_dump uses
  7816. * equals for backward compatibility, and it doesn't seem worth removing it.
  7817. */
  7818. opt_equal: '=' {}
  7819. | /*EMPTY*/ {}
  7820. ;
  7821. /*****************************************************************************
  7822. *
  7823. * ALTER DATABASE
  7824. *
  7825. *****************************************************************************/
  7826. AlterDatabaseStmt:
  7827. ALTER DATABASE database_name opt_with alterdb_opt_list
  7828. {
  7829. AlterDatabaseStmt *n = makeNode(AlterDatabaseStmt);
  7830. n->dbname = $3;
  7831. n->options = $5;
  7832. $$ = (Node *)n;
  7833. }
  7834. | ALTER DATABASE database_name SET TABLESPACE name
  7835. {
  7836. AlterDatabaseStmt *n = makeNode(AlterDatabaseStmt);
  7837. n->dbname = $3;
  7838. n->options = list_make1(makeDefElem("tablespace",
  7839. (Node *)makeString($6)));
  7840. $$ = (Node *)n;
  7841. }
  7842. ;
  7843. AlterDatabaseSetStmt:
  7844. ALTER DATABASE database_name SetResetClause
  7845. {
  7846. AlterDatabaseSetStmt *n = makeNode(AlterDatabaseSetStmt);
  7847. n->dbname = $3;
  7848. n->setstmt = $4;
  7849. $$ = (Node *)n;
  7850. }
  7851. ;
  7852. alterdb_opt_list:
  7853. alterdb_opt_list alterdb_opt_item { $$ = lappend($1, $2); }
  7854. | /* EMPTY */ { $$ = NIL; }
  7855. ;
  7856. alterdb_opt_item:
  7857. CONNECTION LIMIT opt_equal SignedIconst
  7858. {
  7859. $$ = makeDefElem("connectionlimit", (Node *)makeInteger($4));
  7860. }
  7861. ;
  7862. /*****************************************************************************
  7863. *
  7864. * DROP DATABASE [ IF EXISTS ]
  7865. *
  7866. * This is implicitly CASCADE, no need for drop behavior
  7867. *****************************************************************************/
  7868. DropdbStmt: DROP DATABASE database_name
  7869. {
  7870. DropdbStmt *n = makeNode(DropdbStmt);
  7871. n->dbname = $3;
  7872. n->missing_ok = FALSE;
  7873. $$ = (Node *)n;
  7874. }
  7875. | DROP DATABASE IF_P EXISTS database_name
  7876. {
  7877. DropdbStmt *n = makeNode(DropdbStmt);
  7878. n->dbname = $5;
  7879. n->missing_ok = TRUE;
  7880. $$ = (Node *)n;
  7881. }
  7882. ;
  7883. /*****************************************************************************
  7884. *
  7885. * ALTER SYSTEM SET
  7886. *
  7887. * This is used to change configuration parameters persistently.
  7888. *****************************************************************************/
  7889. AlterSystemStmt:
  7890. ALTER SYSTEM_P SET generic_set
  7891. {
  7892. AlterSystemStmt *n = makeNode(AlterSystemStmt);
  7893. n->setstmt = $4;
  7894. $$ = (Node *)n;
  7895. }
  7896. ;
  7897. /*****************************************************************************
  7898. *
  7899. * Manipulate a domain
  7900. *
  7901. *****************************************************************************/
  7902. CreateDomainStmt:
  7903. CREATE DOMAIN_P any_name opt_as Typename ColQualList
  7904. {
  7905. CreateDomainStmt *n = makeNode(CreateDomainStmt);
  7906. n->domainname = $3;
  7907. n->typeName = $5;
  7908. SplitColQualList($6, &n->constraints, &n->collClause,
  7909. yyscanner);
  7910. $$ = (Node *)n;
  7911. }
  7912. ;
  7913. AlterDomainStmt:
  7914. /* ALTER DOMAIN <domain> {SET DEFAULT <expr>|DROP DEFAULT} */
  7915. ALTER DOMAIN_P any_name alter_column_default
  7916. {
  7917. AlterDomainStmt *n = makeNode(AlterDomainStmt);
  7918. n->subtype = 'T';
  7919. n->typeName = $3;
  7920. n->def = $4;
  7921. $$ = (Node *)n;
  7922. }
  7923. /* ALTER DOMAIN <domain> DROP NOT NULL */
  7924. | ALTER DOMAIN_P any_name DROP NOT NULL_P
  7925. {
  7926. AlterDomainStmt *n = makeNode(AlterDomainStmt);
  7927. n->subtype = 'N';
  7928. n->typeName = $3;
  7929. $$ = (Node *)n;
  7930. }
  7931. /* ALTER DOMAIN <domain> SET NOT NULL */
  7932. | ALTER DOMAIN_P any_name SET NOT NULL_P
  7933. {
  7934. AlterDomainStmt *n = makeNode(AlterDomainStmt);
  7935. n->subtype = 'O';
  7936. n->typeName = $3;
  7937. $$ = (Node *)n;
  7938. }
  7939. /* ALTER DOMAIN <domain> ADD CONSTRAINT ... */
  7940. | ALTER DOMAIN_P any_name ADD_P TableConstraint
  7941. {
  7942. AlterDomainStmt *n = makeNode(AlterDomainStmt);
  7943. n->subtype = 'C';
  7944. n->typeName = $3;
  7945. n->def = $5;
  7946. $$ = (Node *)n;
  7947. }
  7948. /* ALTER DOMAIN <domain> DROP CONSTRAINT <name> [RESTRICT|CASCADE] */
  7949. | ALTER DOMAIN_P any_name DROP CONSTRAINT name opt_drop_behavior
  7950. {
  7951. AlterDomainStmt *n = makeNode(AlterDomainStmt);
  7952. n->subtype = 'X';
  7953. n->typeName = $3;
  7954. n->name = $6;
  7955. n->behavior = $7;
  7956. n->missing_ok = false;
  7957. $$ = (Node *)n;
  7958. }
  7959. /* ALTER DOMAIN <domain> DROP CONSTRAINT IF EXISTS <name> [RESTRICT|CASCADE] */
  7960. | ALTER DOMAIN_P any_name DROP CONSTRAINT IF_P EXISTS name opt_drop_behavior
  7961. {
  7962. AlterDomainStmt *n = makeNode(AlterDomainStmt);
  7963. n->subtype = 'X';
  7964. n->typeName = $3;
  7965. n->name = $8;
  7966. n->behavior = $9;
  7967. n->missing_ok = true;
  7968. $$ = (Node *)n;
  7969. }
  7970. /* ALTER DOMAIN <domain> VALIDATE CONSTRAINT <name> */
  7971. | ALTER DOMAIN_P any_name VALIDATE CONSTRAINT name
  7972. {
  7973. AlterDomainStmt *n = makeNode(AlterDomainStmt);
  7974. n->subtype = 'V';
  7975. n->typeName = $3;
  7976. n->name = $6;
  7977. $$ = (Node *)n;
  7978. }
  7979. ;
  7980. opt_as: AS {}
  7981. | /* EMPTY */ {}
  7982. ;
  7983. /*****************************************************************************
  7984. *
  7985. * Manipulate a text search dictionary or configuration
  7986. *
  7987. *****************************************************************************/
  7988. AlterTSDictionaryStmt:
  7989. ALTER TEXT_P SEARCH DICTIONARY any_name definition
  7990. {
  7991. AlterTSDictionaryStmt *n = makeNode(AlterTSDictionaryStmt);
  7992. n->dictname = $5;
  7993. n->options = $6;
  7994. $$ = (Node *)n;
  7995. }
  7996. ;
  7997. AlterTSConfigurationStmt:
  7998. ALTER TEXT_P SEARCH CONFIGURATION any_name ADD_P MAPPING FOR name_list WITH any_name_list
  7999. {
  8000. AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
  8001. n->cfgname = $5;
  8002. n->tokentype = $9;
  8003. n->dicts = $11;
  8004. n->override = false;
  8005. n->replace = false;
  8006. $$ = (Node*)n;
  8007. }
  8008. | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING FOR name_list WITH any_name_list
  8009. {
  8010. AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
  8011. n->cfgname = $5;
  8012. n->tokentype = $9;
  8013. n->dicts = $11;
  8014. n->override = true;
  8015. n->replace = false;
  8016. $$ = (Node*)n;
  8017. }
  8018. | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING REPLACE any_name WITH any_name
  8019. {
  8020. AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
  8021. n->cfgname = $5;
  8022. n->tokentype = NIL;
  8023. n->dicts = list_make2($9,$11);
  8024. n->override = false;
  8025. n->replace = true;
  8026. $$ = (Node*)n;
  8027. }
  8028. | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING FOR name_list REPLACE any_name WITH any_name
  8029. {
  8030. AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
  8031. n->cfgname = $5;
  8032. n->tokentype = $9;
  8033. n->dicts = list_make2($11,$13);
  8034. n->override = false;
  8035. n->replace = true;
  8036. $$ = (Node*)n;
  8037. }
  8038. | ALTER TEXT_P SEARCH CONFIGURATION any_name DROP MAPPING FOR name_list
  8039. {
  8040. AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
  8041. n->cfgname = $5;
  8042. n->tokentype = $9;
  8043. n->missing_ok = false;
  8044. $$ = (Node*)n;
  8045. }
  8046. | ALTER TEXT_P SEARCH CONFIGURATION any_name DROP MAPPING IF_P EXISTS FOR name_list
  8047. {
  8048. AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
  8049. n->cfgname = $5;
  8050. n->tokentype = $11;
  8051. n->missing_ok = true;
  8052. $$ = (Node*)n;
  8053. }
  8054. ;
  8055. /*****************************************************************************
  8056. *
  8057. * Manipulate a conversion
  8058. *
  8059. * CREATE [DEFAULT] CONVERSION <conversion_name>
  8060. * FOR <encoding_name> TO <encoding_name> FROM <func_name>
  8061. *
  8062. *****************************************************************************/
  8063. CreateConversionStmt:
  8064. CREATE opt_default CONVERSION_P any_name FOR Sconst
  8065. TO Sconst FROM any_name
  8066. {
  8067. CreateConversionStmt *n = makeNode(CreateConversionStmt);
  8068. n->conversion_name = $4;
  8069. n->for_encoding_name = $6;
  8070. n->to_encoding_name = $8;
  8071. n->func_name = $10;
  8072. n->def = $2;
  8073. $$ = (Node *)n;
  8074. }
  8075. ;
  8076. /*****************************************************************************
  8077. *
  8078. * QUERY:
  8079. * CLUSTER [VERBOSE] <qualified_name> [ USING <index_name> ]
  8080. * CLUSTER [VERBOSE]
  8081. * CLUSTER [VERBOSE] <index_name> ON <qualified_name> (for pre-8.3)
  8082. *
  8083. *****************************************************************************/
  8084. ClusterStmt:
  8085. CLUSTER opt_verbose qualified_name cluster_index_specification
  8086. {
  8087. ClusterStmt *n = makeNode(ClusterStmt);
  8088. n->relation = $3;
  8089. n->indexname = $4;
  8090. n->verbose = $2;
  8091. $$ = (Node*)n;
  8092. }
  8093. | CLUSTER opt_verbose
  8094. {
  8095. ClusterStmt *n = makeNode(ClusterStmt);
  8096. n->relation = NULL;
  8097. n->indexname = NULL;
  8098. n->verbose = $2;
  8099. $$ = (Node*)n;
  8100. }
  8101. /* kept for pre-8.3 compatibility */
  8102. | CLUSTER opt_verbose index_name ON qualified_name
  8103. {
  8104. ClusterStmt *n = makeNode(ClusterStmt);
  8105. n->relation = $5;
  8106. n->indexname = $3;
  8107. n->verbose = $2;
  8108. $$ = (Node*)n;
  8109. }
  8110. ;
  8111. cluster_index_specification:
  8112. USING index_name { $$ = $2; }
  8113. | /*EMPTY*/ { $$ = NULL; }
  8114. ;
  8115. /*****************************************************************************
  8116. *
  8117. * QUERY:
  8118. * VACUUM
  8119. * ANALYZE
  8120. *
  8121. *****************************************************************************/
  8122. VacuumStmt: VACUUM opt_full opt_freeze opt_verbose
  8123. {
  8124. VacuumStmt *n = makeNode(VacuumStmt);
  8125. n->options = VACOPT_VACUUM;
  8126. if ($2)
  8127. n->options |= VACOPT_FULL;
  8128. if ($4)
  8129. n->options |= VACOPT_VERBOSE;
  8130. n->freeze_min_age = $3 ? 0 : -1;
  8131. n->freeze_table_age = $3 ? 0 : -1;
  8132. n->multixact_freeze_min_age = $3 ? 0 : -1;
  8133. n->multixact_freeze_table_age = $3 ? 0 : -1;
  8134. n->relation = NULL;
  8135. n->va_cols = NIL;
  8136. $$ = (Node *)n;
  8137. }
  8138. | VACUUM opt_full opt_freeze opt_verbose qualified_name
  8139. {
  8140. VacuumStmt *n = makeNode(VacuumStmt);
  8141. n->options = VACOPT_VACUUM;
  8142. if ($2)
  8143. n->options |= VACOPT_FULL;
  8144. if ($4)
  8145. n->options |= VACOPT_VERBOSE;
  8146. n->freeze_min_age = $3 ? 0 : -1;
  8147. n->freeze_table_age = $3 ? 0 : -1;
  8148. n->multixact_freeze_min_age = $3 ? 0 : -1;
  8149. n->multixact_freeze_table_age = $3 ? 0 : -1;
  8150. n->relation = $5;
  8151. n->va_cols = NIL;
  8152. $$ = (Node *)n;
  8153. }
  8154. | VACUUM opt_full opt_freeze opt_verbose AnalyzeStmt
  8155. {
  8156. VacuumStmt *n = (VacuumStmt *) $5;
  8157. n->options |= VACOPT_VACUUM;
  8158. if ($2)
  8159. n->options |= VACOPT_FULL;
  8160. if ($4)
  8161. n->options |= VACOPT_VERBOSE;
  8162. n->freeze_min_age = $3 ? 0 : -1;
  8163. n->freeze_table_age = $3 ? 0 : -1;
  8164. n->multixact_freeze_min_age = $3 ? 0 : -1;
  8165. n->multixact_freeze_table_age = $3 ? 0 : -1;
  8166. $$ = (Node *)n;
  8167. }
  8168. | VACUUM '(' vacuum_option_list ')'
  8169. {
  8170. VacuumStmt *n = makeNode(VacuumStmt);
  8171. n->options = VACOPT_VACUUM | $3;
  8172. if (n->options & VACOPT_FREEZE)
  8173. {
  8174. n->freeze_min_age = n->freeze_table_age = 0;
  8175. n->multixact_freeze_min_age = 0;
  8176. n->multixact_freeze_table_age = 0;
  8177. }
  8178. else
  8179. {
  8180. n->freeze_min_age = n->freeze_table_age = -1;
  8181. n->multixact_freeze_min_age = -1;
  8182. n->multixact_freeze_table_age = -1;
  8183. }
  8184. n->relation = NULL;
  8185. n->va_cols = NIL;
  8186. $$ = (Node *) n;
  8187. }
  8188. | VACUUM '(' vacuum_option_list ')' qualified_name opt_name_list
  8189. {
  8190. VacuumStmt *n = makeNode(VacuumStmt);
  8191. n->options = VACOPT_VACUUM | $3;
  8192. if (n->options & VACOPT_FREEZE)
  8193. {
  8194. n->freeze_min_age = n->freeze_table_age = 0;
  8195. n->multixact_freeze_min_age = 0;
  8196. n->multixact_freeze_table_age = 0;
  8197. }
  8198. else
  8199. {
  8200. n->freeze_min_age = n->freeze_table_age = -1;
  8201. n->multixact_freeze_min_age = -1;
  8202. n->multixact_freeze_table_age = -1;
  8203. }
  8204. n->relation = $5;
  8205. n->va_cols = $6;
  8206. if (n->va_cols != NIL) /* implies analyze */
  8207. n->options |= VACOPT_ANALYZE;
  8208. $$ = (Node *) n;
  8209. }
  8210. ;
  8211. vacuum_option_list:
  8212. vacuum_option_elem { $$ = $1; }
  8213. | vacuum_option_list ',' vacuum_option_elem { $$ = $1 | $3; }
  8214. ;
  8215. vacuum_option_elem:
  8216. analyze_keyword { $$ = VACOPT_ANALYZE; }
  8217. | VERBOSE { $$ = VACOPT_VERBOSE; }
  8218. | FREEZE { $$ = VACOPT_FREEZE; }
  8219. | FULL { $$ = VACOPT_FULL; }
  8220. ;
  8221. AnalyzeStmt:
  8222. analyze_keyword opt_verbose
  8223. {
  8224. VacuumStmt *n = makeNode(VacuumStmt);
  8225. n->options = VACOPT_ANALYZE;
  8226. if ($2)
  8227. n->options |= VACOPT_VERBOSE;
  8228. n->freeze_min_age = -1;
  8229. n->freeze_table_age = -1;
  8230. n->multixact_freeze_min_age = -1;
  8231. n->multixact_freeze_table_age = -1;
  8232. n->relation = NULL;
  8233. n->va_cols = NIL;
  8234. $$ = (Node *)n;
  8235. }
  8236. | analyze_keyword opt_verbose qualified_name opt_name_list
  8237. {
  8238. VacuumStmt *n = makeNode(VacuumStmt);
  8239. n->options = VACOPT_ANALYZE;
  8240. if ($2)
  8241. n->options |= VACOPT_VERBOSE;
  8242. n->freeze_min_age = -1;
  8243. n->freeze_table_age = -1;
  8244. n->multixact_freeze_min_age = -1;
  8245. n->multixact_freeze_table_age = -1;
  8246. n->relation = $3;
  8247. n->va_cols = $4;
  8248. $$ = (Node *)n;
  8249. }
  8250. ;
  8251. analyze_keyword:
  8252. ANALYZE {}
  8253. | ANALYSE /* British */ {}
  8254. ;
  8255. opt_verbose:
  8256. VERBOSE { $$ = TRUE; }
  8257. | /*EMPTY*/ { $$ = FALSE; }
  8258. ;
  8259. opt_full: FULL { $$ = TRUE; }
  8260. | /*EMPTY*/ { $$ = FALSE; }
  8261. ;
  8262. opt_freeze: FREEZE { $$ = TRUE; }
  8263. | /*EMPTY*/ { $$ = FALSE; }
  8264. ;
  8265. opt_name_list:
  8266. '(' name_list ')' { $$ = $2; }
  8267. | /*EMPTY*/ { $$ = NIL; }
  8268. ;
  8269. /*****************************************************************************
  8270. *
  8271. * QUERY:
  8272. * EXPLAIN [ANALYZE] [VERBOSE] query
  8273. * EXPLAIN ( options ) query
  8274. *
  8275. *****************************************************************************/
  8276. ExplainStmt:
  8277. EXPLAIN ExplainableStmt
  8278. {
  8279. ExplainStmt *n = makeNode(ExplainStmt);
  8280. n->query = $2;
  8281. n->options = NIL;
  8282. $$ = (Node *) n;
  8283. }
  8284. | EXPLAIN analyze_keyword opt_verbose ExplainableStmt
  8285. {
  8286. ExplainStmt *n = makeNode(ExplainStmt);
  8287. n->query = $4;
  8288. n->options = list_make1(makeDefElem("analyze", NULL));
  8289. if ($3)
  8290. n->options = lappend(n->options,
  8291. makeDefElem("verbose", NULL));
  8292. $$ = (Node *) n;
  8293. }
  8294. | EXPLAIN VERBOSE ExplainableStmt
  8295. {
  8296. ExplainStmt *n = makeNode(ExplainStmt);
  8297. n->query = $3;
  8298. n->options = list_make1(makeDefElem("verbose", NULL));
  8299. $$ = (Node *) n;
  8300. }
  8301. | EXPLAIN '(' explain_option_list ')' ExplainableStmt
  8302. {
  8303. ExplainStmt *n = makeNode(ExplainStmt);
  8304. n->query = $5;
  8305. n->options = $3;
  8306. $$ = (Node *) n;
  8307. }
  8308. ;
  8309. ExplainableStmt:
  8310. SelectStmt
  8311. | InsertStmt
  8312. | UpdateStmt
  8313. | DeleteStmt
  8314. | DeclareCursorStmt
  8315. | CreateAsStmt
  8316. | CreateMatViewStmt
  8317. | RefreshMatViewStmt
  8318. | ExecuteStmt /* by default all are $$=$1 */
  8319. ;
  8320. explain_option_list:
  8321. explain_option_elem
  8322. {
  8323. $$ = list_make1($1);
  8324. }
  8325. | explain_option_list ',' explain_option_elem
  8326. {
  8327. $$ = lappend($1, $3);
  8328. }
  8329. ;
  8330. explain_option_elem:
  8331. explain_option_name explain_option_arg
  8332. {
  8333. $$ = makeDefElem($1, $2);
  8334. }
  8335. ;
  8336. explain_option_name:
  8337. NonReservedWord { $$ = $1; }
  8338. | analyze_keyword { $$ = "analyze"; }
  8339. ;
  8340. explain_option_arg:
  8341. opt_boolean_or_string { $$ = (Node *) makeString($1); }
  8342. | NumericOnly { $$ = (Node *) $1; }
  8343. | /* EMPTY */ { $$ = NULL; }
  8344. ;
  8345. /*****************************************************************************
  8346. *
  8347. * QUERY:
  8348. * PREPARE <plan_name> [(args, ...)] AS <query>
  8349. *
  8350. *****************************************************************************/
  8351. PrepareStmt: PREPARE name prep_type_clause AS PreparableStmt
  8352. {
  8353. PrepareStmt *n = makeNode(PrepareStmt);
  8354. n->name = $2;
  8355. n->argtypes = $3;
  8356. n->query = $5;
  8357. $$ = (Node *) n;
  8358. }
  8359. ;
  8360. prep_type_clause: '(' type_list ')' { $$ = $2; }
  8361. | /* EMPTY */ { $$ = NIL; }
  8362. ;
  8363. PreparableStmt:
  8364. SelectStmt
  8365. | InsertStmt
  8366. | UpdateStmt
  8367. | DeleteStmt /* by default all are $$=$1 */
  8368. ;
  8369. /*****************************************************************************
  8370. *
  8371. * EXECUTE <plan_name> [(params, ...)]
  8372. * CREATE TABLE <name> AS EXECUTE <plan_name> [(params, ...)]
  8373. *
  8374. *****************************************************************************/
  8375. ExecuteStmt: EXECUTE name execute_param_clause
  8376. {
  8377. ExecuteStmt *n = makeNode(ExecuteStmt);
  8378. n->name = $2;
  8379. n->params = $3;
  8380. $$ = (Node *) n;
  8381. }
  8382. | CREATE OptTemp TABLE create_as_target AS
  8383. EXECUTE name execute_param_clause opt_with_data
  8384. {
  8385. CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt);
  8386. ExecuteStmt *n = makeNode(ExecuteStmt);
  8387. n->name = $7;
  8388. n->params = $8;
  8389. ctas->query = (Node *) n;
  8390. ctas->into = $4;
  8391. ctas->relkind = OBJECT_TABLE;
  8392. ctas->is_select_into = false;
  8393. /* cram additional flags into the IntoClause */
  8394. $4->rel->relpersistence = $2;
  8395. $4->skipData = !($9);
  8396. $$ = (Node *) ctas;
  8397. }
  8398. ;
  8399. execute_param_clause: '(' expr_list ')' { $$ = $2; }
  8400. | /* EMPTY */ { $$ = NIL; }
  8401. ;
  8402. /*****************************************************************************
  8403. *
  8404. * QUERY:
  8405. * DEALLOCATE [PREPARE] <plan_name>
  8406. *
  8407. *****************************************************************************/
  8408. DeallocateStmt: DEALLOCATE name
  8409. {
  8410. DeallocateStmt *n = makeNode(DeallocateStmt);
  8411. n->name = $2;
  8412. $$ = (Node *) n;
  8413. }
  8414. | DEALLOCATE PREPARE name
  8415. {
  8416. DeallocateStmt *n = makeNode(DeallocateStmt);
  8417. n->name = $3;
  8418. $$ = (Node *) n;
  8419. }
  8420. | DEALLOCATE ALL
  8421. {
  8422. DeallocateStmt *n = makeNode(DeallocateStmt);
  8423. n->name = NULL;
  8424. $$ = (Node *) n;
  8425. }
  8426. | DEALLOCATE PREPARE ALL
  8427. {
  8428. DeallocateStmt *n = makeNode(DeallocateStmt);
  8429. n->name = NULL;
  8430. $$ = (Node *) n;
  8431. }
  8432. ;
  8433. /*****************************************************************************
  8434. *
  8435. * QUERY:
  8436. * INSERT STATEMENTS
  8437. *
  8438. *****************************************************************************/
  8439. InsertStmt:
  8440. opt_with_clause INSERT INTO qualified_name insert_rest returning_clause
  8441. {
  8442. $5->relation = $4;
  8443. $5->returningList = $6;
  8444. $5->withClause = $1;
  8445. $$ = (Node *) $5;
  8446. }
  8447. ;
  8448. insert_rest:
  8449. SelectStmt
  8450. {
  8451. $$ = makeNode(InsertStmt);
  8452. $$->cols = NIL;
  8453. $$->selectStmt = $1;
  8454. }
  8455. | '(' insert_column_list ')' SelectStmt
  8456. {
  8457. $$ = makeNode(InsertStmt);
  8458. $$->cols = $2;
  8459. $$->selectStmt = $4;
  8460. }
  8461. | DEFAULT VALUES
  8462. {
  8463. $$ = makeNode(InsertStmt);
  8464. $$->cols = NIL;
  8465. $$->selectStmt = NULL;
  8466. }
  8467. ;
  8468. insert_column_list:
  8469. insert_column_item
  8470. { $$ = list_make1($1); }
  8471. | insert_column_list ',' insert_column_item
  8472. { $$ = lappend($1, $3); }
  8473. ;
  8474. insert_column_item:
  8475. ColId opt_indirection
  8476. {
  8477. $$ = makeNode(ResTarget);
  8478. $$->name = $1;
  8479. $$->indirection = check_indirection($2, yyscanner);
  8480. $$->val = NULL;
  8481. $$->location = @1;
  8482. }
  8483. ;
  8484. returning_clause:
  8485. RETURNING target_list { $$ = $2; }
  8486. | /* EMPTY */ { $$ = NIL; }
  8487. ;
  8488. /*****************************************************************************
  8489. *
  8490. * QUERY:
  8491. * DELETE STATEMENTS
  8492. *
  8493. *****************************************************************************/
  8494. DeleteStmt: opt_with_clause DELETE_P FROM relation_expr_opt_alias
  8495. using_clause where_or_current_clause returning_clause
  8496. {
  8497. DeleteStmt *n = makeNode(DeleteStmt);
  8498. n->relation = $4;
  8499. n->usingClause = $5;
  8500. n->whereClause = $6;
  8501. n->returningList = $7;
  8502. n->withClause = $1;
  8503. $$ = (Node *)n;
  8504. }
  8505. ;
  8506. using_clause:
  8507. USING from_list { $$ = $2; }
  8508. | /*EMPTY*/ { $$ = NIL; }
  8509. ;
  8510. /*****************************************************************************
  8511. *
  8512. * QUERY:
  8513. * LOCK TABLE
  8514. *
  8515. *****************************************************************************/
  8516. LockStmt: LOCK_P opt_table relation_expr_list opt_lock opt_nowait
  8517. {
  8518. LockStmt *n = makeNode(LockStmt);
  8519. n->relations = $3;
  8520. n->mode = $4;
  8521. n->nowait = $5;
  8522. $$ = (Node *)n;
  8523. }
  8524. ;
  8525. opt_lock: IN_P lock_type MODE { $$ = $2; }
  8526. | /*EMPTY*/ { $$ = AccessExclusiveLock; }
  8527. ;
  8528. lock_type: ACCESS SHARE { $$ = AccessShareLock; }
  8529. | ROW SHARE { $$ = RowShareLock; }
  8530. | ROW EXCLUSIVE { $$ = RowExclusiveLock; }
  8531. | SHARE UPDATE EXCLUSIVE { $$ = ShareUpdateExclusiveLock; }
  8532. | SHARE { $$ = ShareLock; }
  8533. | SHARE ROW EXCLUSIVE { $$ = ShareRowExclusiveLock; }
  8534. | EXCLUSIVE { $$ = ExclusiveLock; }
  8535. | ACCESS EXCLUSIVE { $$ = AccessExclusiveLock; }
  8536. ;
  8537. opt_nowait: NOWAIT { $$ = TRUE; }
  8538. | /*EMPTY*/ { $$ = FALSE; }
  8539. ;
  8540. /*****************************************************************************
  8541. *
  8542. * QUERY:
  8543. * UpdateStmt (UPDATE)
  8544. *
  8545. *****************************************************************************/
  8546. UpdateStmt: opt_with_clause UPDATE relation_expr_opt_alias
  8547. SET set_clause_list
  8548. from_clause
  8549. where_or_current_clause
  8550. returning_clause
  8551. {
  8552. UpdateStmt *n = makeNode(UpdateStmt);
  8553. n->relation = $3;
  8554. n->targetList = $5;
  8555. n->fromClause = $6;
  8556. n->whereClause = $7;
  8557. n->returningList = $8;
  8558. n->withClause = $1;
  8559. $$ = (Node *)n;
  8560. }
  8561. ;
  8562. set_clause_list:
  8563. set_clause { $$ = $1; }
  8564. | set_clause_list ',' set_clause { $$ = list_concat($1,$3); }
  8565. ;
  8566. set_clause:
  8567. single_set_clause { $$ = list_make1($1); }
  8568. | multiple_set_clause { $$ = $1; }
  8569. ;
  8570. single_set_clause:
  8571. set_target '=' ctext_expr
  8572. {
  8573. $$ = $1;
  8574. $$->val = (Node *) $3;
  8575. }
  8576. ;
  8577. multiple_set_clause:
  8578. '(' set_target_list ')' '=' ctext_row
  8579. {
  8580. ListCell *col_cell;
  8581. ListCell *val_cell;
  8582. /*
  8583. * Break the ctext_row apart, merge individual expressions
  8584. * into the destination ResTargets. XXX this approach
  8585. * cannot work for general row expressions as sources.
  8586. */
  8587. if (list_length($2) != list_length($5))
  8588. ereport(ERROR,
  8589. (errcode(ERRCODE_SYNTAX_ERROR),
  8590. errmsg("number of columns does not match number of values"),
  8591. parser_errposition(@1)));
  8592. forboth(col_cell, $2, val_cell, $5)
  8593. {
  8594. ResTarget *res_col = (ResTarget *) lfirst(col_cell);
  8595. Node *res_val = (Node *) lfirst(val_cell);
  8596. res_col->val = res_val;
  8597. }
  8598. $$ = $2;
  8599. }
  8600. ;
  8601. set_target:
  8602. ColId opt_indirection
  8603. {
  8604. $$ = makeNode(ResTarget);
  8605. $$->name = $1;
  8606. $$->indirection = check_indirection($2, yyscanner);
  8607. $$->val = NULL; /* upper production sets this */
  8608. $$->location = @1;
  8609. }
  8610. ;
  8611. set_target_list:
  8612. set_target { $$ = list_make1($1); }
  8613. | set_target_list ',' set_target { $$ = lappend($1,$3); }
  8614. ;
  8615. /*****************************************************************************
  8616. *
  8617. * QUERY:
  8618. * CURSOR STATEMENTS
  8619. *
  8620. *****************************************************************************/
  8621. DeclareCursorStmt: DECLARE cursor_name cursor_options CURSOR opt_hold FOR SelectStmt
  8622. {
  8623. DeclareCursorStmt *n = makeNode(DeclareCursorStmt);
  8624. n->portalname = $2;
  8625. /* currently we always set FAST_PLAN option */
  8626. n->options = $3 | $5 | CURSOR_OPT_FAST_PLAN;
  8627. n->query = $7;
  8628. $$ = (Node *)n;
  8629. }
  8630. ;
  8631. cursor_name: name { $$ = $1; }
  8632. ;
  8633. cursor_options: /*EMPTY*/ { $$ = 0; }
  8634. | cursor_options NO SCROLL { $$ = $1 | CURSOR_OPT_NO_SCROLL; }
  8635. | cursor_options SCROLL { $$ = $1 | CURSOR_OPT_SCROLL; }
  8636. | cursor_options BINARY { $$ = $1 | CURSOR_OPT_BINARY; }
  8637. | cursor_options INSENSITIVE { $$ = $1 | CURSOR_OPT_INSENSITIVE; }
  8638. ;
  8639. opt_hold: /* EMPTY */ { $$ = 0; }
  8640. | WITH HOLD { $$ = CURSOR_OPT_HOLD; }
  8641. | WITHOUT HOLD { $$ = 0; }
  8642. ;
  8643. /*****************************************************************************
  8644. *
  8645. * QUERY:
  8646. * SELECT STATEMENTS
  8647. *
  8648. *****************************************************************************/
  8649. /* A complete SELECT statement looks like this.
  8650. *
  8651. * The rule returns either a single SelectStmt node or a tree of them,
  8652. * representing a set-operation tree.
  8653. *
  8654. * There is an ambiguity when a sub-SELECT is within an a_expr and there
  8655. * are excess parentheses: do the parentheses belong to the sub-SELECT or
  8656. * to the surrounding a_expr? We don't really care, but bison wants to know.
  8657. * To resolve the ambiguity, we are careful to define the grammar so that
  8658. * the decision is staved off as long as possible: as long as we can keep
  8659. * absorbing parentheses into the sub-SELECT, we will do so, and only when
  8660. * it's no longer possible to do that will we decide that parens belong to
  8661. * the expression. For example, in "SELECT (((SELECT 2)) + 3)" the extra
  8662. * parentheses are treated as part of the sub-select. The necessity of doing
  8663. * it that way is shown by "SELECT (((SELECT 2)) UNION SELECT 2)". Had we
  8664. * parsed "((SELECT 2))" as an a_expr, it'd be too late to go back to the
  8665. * SELECT viewpoint when we see the UNION.
  8666. *
  8667. * This approach is implemented by defining a nonterminal select_with_parens,
  8668. * which represents a SELECT with at least one outer layer of parentheses,
  8669. * and being careful to use select_with_parens, never '(' SelectStmt ')',
  8670. * in the expression grammar. We will then have shift-reduce conflicts
  8671. * which we can resolve in favor of always treating '(' <select> ')' as
  8672. * a select_with_parens. To resolve the conflicts, the productions that
  8673. * conflict with the select_with_parens productions are manually given
  8674. * precedences lower than the precedence of ')', thereby ensuring that we
  8675. * shift ')' (and then reduce to select_with_parens) rather than trying to
  8676. * reduce the inner <select> nonterminal to something else. We use UMINUS
  8677. * precedence for this, which is a fairly arbitrary choice.
  8678. *
  8679. * To be able to define select_with_parens itself without ambiguity, we need
  8680. * a nonterminal select_no_parens that represents a SELECT structure with no
  8681. * outermost parentheses. This is a little bit tedious, but it works.
  8682. *
  8683. * In non-expression contexts, we use SelectStmt which can represent a SELECT
  8684. * with or without outer parentheses.
  8685. */
  8686. SelectStmt: select_no_parens %prec UMINUS
  8687. | select_with_parens %prec UMINUS
  8688. ;
  8689. select_with_parens:
  8690. '(' select_no_parens ')' { $$ = $2; }
  8691. | '(' select_with_parens ')' { $$ = $2; }
  8692. ;
  8693. /*
  8694. * This rule parses the equivalent of the standard's <query expression>.
  8695. * The duplicative productions are annoying, but hard to get rid of without
  8696. * creating shift/reduce conflicts.
  8697. *
  8698. * The locking clause (FOR UPDATE etc) may be before or after LIMIT/OFFSET.
  8699. * In <=7.2.X, LIMIT/OFFSET had to be after FOR UPDATE
  8700. * We now support both orderings, but prefer LIMIT/OFFSET before the locking
  8701. * clause.
  8702. * 2002-08-28 bjm
  8703. */
  8704. select_no_parens:
  8705. simple_select { $$ = $1; }
  8706. | select_clause sort_clause
  8707. {
  8708. insertSelectOptions((SelectStmt *) $1, $2, NIL,
  8709. NULL, NULL, NULL,
  8710. yyscanner);
  8711. $$ = $1;
  8712. }
  8713. | select_clause opt_sort_clause for_locking_clause opt_select_limit
  8714. {
  8715. insertSelectOptions((SelectStmt *) $1, $2, $3,
  8716. list_nth($4, 0), list_nth($4, 1),
  8717. NULL,
  8718. yyscanner);
  8719. $$ = $1;
  8720. }
  8721. | select_clause opt_sort_clause select_limit opt_for_locking_clause
  8722. {
  8723. insertSelectOptions((SelectStmt *) $1, $2, $4,
  8724. list_nth($3, 0), list_nth($3, 1),
  8725. NULL,
  8726. yyscanner);
  8727. $$ = $1;
  8728. }
  8729. | with_clause select_clause
  8730. {
  8731. insertSelectOptions((SelectStmt *) $2, NULL, NIL,
  8732. NULL, NULL,
  8733. $1,
  8734. yyscanner);
  8735. $$ = $2;
  8736. }
  8737. | with_clause select_clause sort_clause
  8738. {
  8739. insertSelectOptions((SelectStmt *) $2, $3, NIL,
  8740. NULL, NULL,
  8741. $1,
  8742. yyscanner);
  8743. $$ = $2;
  8744. }
  8745. | with_clause select_clause opt_sort_clause for_locking_clause opt_select_limit
  8746. {
  8747. insertSelectOptions((SelectStmt *) $2, $3, $4,
  8748. list_nth($5, 0), list_nth($5, 1),
  8749. $1,
  8750. yyscanner);
  8751. $$ = $2;
  8752. }
  8753. | with_clause select_clause opt_sort_clause select_limit opt_for_locking_clause
  8754. {
  8755. insertSelectOptions((SelectStmt *) $2, $3, $5,
  8756. list_nth($4, 0), list_nth($4, 1),
  8757. $1,
  8758. yyscanner);
  8759. $$ = $2;
  8760. }
  8761. ;
  8762. select_clause:
  8763. simple_select { $$ = $1; }
  8764. | select_with_parens { $$ = $1; }
  8765. ;
  8766. /*
  8767. * This rule parses SELECT statements that can appear within set operations,
  8768. * including UNION, INTERSECT and EXCEPT. '(' and ')' can be used to specify
  8769. * the ordering of the set operations. Without '(' and ')' we want the
  8770. * operations to be ordered per the precedence specs at the head of this file.
  8771. *
  8772. * As with select_no_parens, simple_select cannot have outer parentheses,
  8773. * but can have parenthesized subclauses.
  8774. *
  8775. * Note that sort clauses cannot be included at this level --- SQL requires
  8776. * SELECT foo UNION SELECT bar ORDER BY baz
  8777. * to be parsed as
  8778. * (SELECT foo UNION SELECT bar) ORDER BY baz
  8779. * not
  8780. * SELECT foo UNION (SELECT bar ORDER BY baz)
  8781. * Likewise for WITH, FOR UPDATE and LIMIT. Therefore, those clauses are
  8782. * described as part of the select_no_parens production, not simple_select.
  8783. * This does not limit functionality, because you can reintroduce these
  8784. * clauses inside parentheses.
  8785. *
  8786. * NOTE: only the leftmost component SelectStmt should have INTO.
  8787. * However, this is not checked by the grammar; parse analysis must check it.
  8788. */
  8789. simple_select:
  8790. SELECT opt_distinct opt_target_list
  8791. into_clause from_clause where_clause
  8792. group_clause having_clause window_clause
  8793. {
  8794. SelectStmt *n = makeNode(SelectStmt);
  8795. n->distinctClause = $2;
  8796. n->targetList = $3;
  8797. n->intoClause = $4;
  8798. n->fromClause = $5;
  8799. n->whereClause = $6;
  8800. n->groupClause = $7;
  8801. n->havingClause = $8;
  8802. n->windowClause = $9;
  8803. $$ = (Node *)n;
  8804. }
  8805. | values_clause { $$ = $1; }
  8806. | TABLE relation_expr
  8807. {
  8808. /* same as SELECT * FROM relation_expr */
  8809. ColumnRef *cr = makeNode(ColumnRef);
  8810. ResTarget *rt = makeNode(ResTarget);
  8811. SelectStmt *n = makeNode(SelectStmt);
  8812. cr->fields = list_make1(makeNode(A_Star));
  8813. cr->location = -1;
  8814. rt->name = NULL;
  8815. rt->indirection = NIL;
  8816. rt->val = (Node *)cr;
  8817. rt->location = -1;
  8818. n->targetList = list_make1(rt);
  8819. n->fromClause = list_make1($2);
  8820. $$ = (Node *)n;
  8821. }
  8822. | select_clause UNION opt_all select_clause
  8823. {
  8824. $$ = makeSetOp(SETOP_UNION, $3, $1, $4);
  8825. }
  8826. | select_clause INTERSECT opt_all select_clause
  8827. {
  8828. $$ = makeSetOp(SETOP_INTERSECT, $3, $1, $4);
  8829. }
  8830. | select_clause EXCEPT opt_all select_clause
  8831. {
  8832. $$ = makeSetOp(SETOP_EXCEPT, $3, $1, $4);
  8833. }
  8834. ;
  8835. /*
  8836. * SQL standard WITH clause looks like:
  8837. *
  8838. * WITH [ RECURSIVE ] <query name> [ (<column>,...) ]
  8839. * AS (query) [ SEARCH or CYCLE clause ]
  8840. *
  8841. * We don't currently support the SEARCH or CYCLE clause.
  8842. */
  8843. with_clause:
  8844. WITH cte_list
  8845. {
  8846. $$ = makeNode(WithClause);
  8847. $$->ctes = $2;
  8848. $$->recursive = false;
  8849. $$->location = @1;
  8850. }
  8851. | WITH RECURSIVE cte_list
  8852. {
  8853. $$ = makeNode(WithClause);
  8854. $$->ctes = $3;
  8855. $$->recursive = true;
  8856. $$->location = @1;
  8857. }
  8858. ;
  8859. cte_list:
  8860. common_table_expr { $$ = list_make1($1); }
  8861. | cte_list ',' common_table_expr { $$ = lappend($1, $3); }
  8862. ;
  8863. common_table_expr: name opt_name_list AS '(' PreparableStmt ')'
  8864. {
  8865. CommonTableExpr *n = makeNode(CommonTableExpr);
  8866. n->ctename = $1;
  8867. n->aliascolnames = $2;
  8868. n->ctequery = $5;
  8869. n->location = @1;
  8870. $$ = (Node *) n;
  8871. }
  8872. ;
  8873. opt_with_clause:
  8874. with_clause { $$ = $1; }
  8875. | /*EMPTY*/ { $$ = NULL; }
  8876. ;
  8877. into_clause:
  8878. INTO OptTempTableName
  8879. {
  8880. $$ = makeNode(IntoClause);
  8881. $$->rel = $2;
  8882. $$->colNames = NIL;
  8883. $$->options = NIL;
  8884. $$->onCommit = ONCOMMIT_NOOP;
  8885. $$->tableSpaceName = NULL;
  8886. $$->viewQuery = NULL;
  8887. $$->skipData = false;
  8888. }
  8889. | /*EMPTY*/
  8890. { $$ = NULL; }
  8891. ;
  8892. /*
  8893. * Redundancy here is needed to avoid shift/reduce conflicts,
  8894. * since TEMP is not a reserved word. See also OptTemp.
  8895. */
  8896. OptTempTableName:
  8897. TEMPORARY opt_table qualified_name
  8898. {
  8899. $$ = $3;
  8900. $$->relpersistence = RELPERSISTENCE_TEMP;
  8901. }
  8902. | TEMP opt_table qualified_name
  8903. {
  8904. $$ = $3;
  8905. $$->relpersistence = RELPERSISTENCE_TEMP;
  8906. }
  8907. | LOCAL TEMPORARY opt_table qualified_name
  8908. {
  8909. $$ = $4;
  8910. $$->relpersistence = RELPERSISTENCE_TEMP;
  8911. }
  8912. | LOCAL TEMP opt_table qualified_name
  8913. {
  8914. $$ = $4;
  8915. $$->relpersistence = RELPERSISTENCE_TEMP;
  8916. }
  8917. | GLOBAL TEMPORARY opt_table qualified_name
  8918. {
  8919. ereport(WARNING,
  8920. (errmsg("GLOBAL is deprecated in temporary table creation"),
  8921. parser_errposition(@1)));
  8922. $$ = $4;
  8923. $$->relpersistence = RELPERSISTENCE_TEMP;
  8924. }
  8925. | GLOBAL TEMP opt_table qualified_name
  8926. {
  8927. ereport(WARNING,
  8928. (errmsg("GLOBAL is deprecated in temporary table creation"),
  8929. parser_errposition(@1)));
  8930. $$ = $4;
  8931. $$->relpersistence = RELPERSISTENCE_TEMP;
  8932. }
  8933. | UNLOGGED opt_table qualified_name
  8934. {
  8935. $$ = $3;
  8936. $$->relpersistence = RELPERSISTENCE_UNLOGGED;
  8937. }
  8938. | TABLE qualified_name
  8939. {
  8940. $$ = $2;
  8941. $$->relpersistence = RELPERSISTENCE_PERMANENT;
  8942. }
  8943. | qualified_name
  8944. {
  8945. $$ = $1;
  8946. $$->relpersistence = RELPERSISTENCE_PERMANENT;
  8947. }
  8948. ;
  8949. opt_table: TABLE {}
  8950. | /*EMPTY*/ {}
  8951. ;
  8952. opt_all: ALL { $$ = TRUE; }
  8953. | DISTINCT { $$ = FALSE; }
  8954. | /*EMPTY*/ { $$ = FALSE; }
  8955. ;
  8956. /* We use (NIL) as a placeholder to indicate that all target expressions
  8957. * should be placed in the DISTINCT list during parsetree analysis.
  8958. */
  8959. opt_distinct:
  8960. DISTINCT { $$ = list_make1(NIL); }
  8961. | DISTINCT ON '(' expr_list ')' { $$ = $4; }
  8962. | ALL { $$ = NIL; }
  8963. | /*EMPTY*/ { $$ = NIL; }
  8964. ;
  8965. opt_sort_clause:
  8966. sort_clause { $$ = $1;}
  8967. | /*EMPTY*/ { $$ = NIL; }
  8968. ;
  8969. sort_clause:
  8970. ORDER BY sortby_list { $$ = $3; }
  8971. ;
  8972. sortby_list:
  8973. sortby { $$ = list_make1($1); }
  8974. | sortby_list ',' sortby { $$ = lappend($1, $3); }
  8975. ;
  8976. sortby: a_expr USING qual_all_Op opt_nulls_order
  8977. {
  8978. $$ = makeNode(SortBy);
  8979. $$->node = $1;
  8980. $$->sortby_dir = SORTBY_USING;
  8981. $$->sortby_nulls = $4;
  8982. $$->useOp = $3;
  8983. $$->location = @3;
  8984. }
  8985. | a_expr opt_asc_desc opt_nulls_order
  8986. {
  8987. $$ = makeNode(SortBy);
  8988. $$->node = $1;
  8989. $$->sortby_dir = $2;
  8990. $$->sortby_nulls = $3;
  8991. $$->useOp = NIL;
  8992. $$->location = -1; /* no operator */
  8993. }
  8994. ;
  8995. select_limit:
  8996. limit_clause offset_clause { $$ = list_make2($2, $1); }
  8997. | offset_clause limit_clause { $$ = list_make2($1, $2); }
  8998. | limit_clause { $$ = list_make2(NULL, $1); }
  8999. | offset_clause { $$ = list_make2($1, NULL); }
  9000. ;
  9001. opt_select_limit:
  9002. select_limit { $$ = $1; }
  9003. | /* EMPTY */ { $$ = list_make2(NULL,NULL); }
  9004. ;
  9005. limit_clause:
  9006. LIMIT select_limit_value
  9007. { $$ = $2; }
  9008. | LIMIT select_limit_value ',' select_offset_value
  9009. {
  9010. /* Disabled because it was too confusing, bjm 2002-02-18 */
  9011. ereport(ERROR,
  9012. (errcode(ERRCODE_SYNTAX_ERROR),
  9013. errmsg("LIMIT #,# syntax is not supported"),
  9014. errhint("Use separate LIMIT and OFFSET clauses."),
  9015. parser_errposition(@1)));
  9016. }
  9017. /* SQL:2008 syntax */
  9018. | FETCH first_or_next opt_select_fetch_first_value row_or_rows ONLY
  9019. { $$ = $3; }
  9020. ;
  9021. offset_clause:
  9022. OFFSET select_offset_value
  9023. { $$ = $2; }
  9024. /* SQL:2008 syntax */
  9025. | OFFSET select_offset_value2 row_or_rows
  9026. { $$ = $2; }
  9027. ;
  9028. select_limit_value:
  9029. a_expr { $$ = $1; }
  9030. | ALL
  9031. {
  9032. /* LIMIT ALL is represented as a NULL constant */
  9033. $$ = makeNullAConst(@1);
  9034. }
  9035. ;
  9036. select_offset_value:
  9037. a_expr { $$ = $1; }
  9038. ;
  9039. /*
  9040. * Allowing full expressions without parentheses causes various parsing
  9041. * problems with the trailing ROW/ROWS key words. SQL only calls for
  9042. * constants, so we allow the rest only with parentheses. If omitted,
  9043. * default to 1.
  9044. */
  9045. opt_select_fetch_first_value:
  9046. SignedIconst { $$ = makeIntConst($1, @1); }
  9047. | '(' a_expr ')' { $$ = $2; }
  9048. | /*EMPTY*/ { $$ = makeIntConst(1, -1); }
  9049. ;
  9050. /*
  9051. * Again, the trailing ROW/ROWS in this case prevent the full expression
  9052. * syntax. c_expr is the best we can do.
  9053. */
  9054. select_offset_value2:
  9055. c_expr { $$ = $1; }
  9056. ;
  9057. /* noise words */
  9058. row_or_rows: ROW { $$ = 0; }
  9059. | ROWS { $$ = 0; }
  9060. ;
  9061. first_or_next: FIRST_P { $$ = 0; }
  9062. | NEXT { $$ = 0; }
  9063. ;
  9064. group_clause:
  9065. GROUP_P BY expr_list { $$ = $3; }
  9066. | /*EMPTY*/ { $$ = NIL; }
  9067. ;
  9068. having_clause:
  9069. HAVING a_expr { $$ = $2; }
  9070. | /*EMPTY*/ { $$ = NULL; }
  9071. ;
  9072. for_locking_clause:
  9073. for_locking_items { $$ = $1; }
  9074. | FOR READ ONLY { $$ = NIL; }
  9075. ;
  9076. opt_for_locking_clause:
  9077. for_locking_clause { $$ = $1; }
  9078. | /* EMPTY */ { $$ = NIL; }
  9079. ;
  9080. for_locking_items:
  9081. for_locking_item { $$ = list_make1($1); }
  9082. | for_locking_items for_locking_item { $$ = lappend($1, $2); }
  9083. ;
  9084. for_locking_item:
  9085. for_locking_strength locked_rels_list opt_nowait
  9086. {
  9087. LockingClause *n = makeNode(LockingClause);
  9088. n->lockedRels = $2;
  9089. n->strength = $1;
  9090. n->noWait = $3;
  9091. $$ = (Node *) n;
  9092. }
  9093. ;
  9094. for_locking_strength:
  9095. FOR UPDATE { $$ = LCS_FORUPDATE; }
  9096. | FOR NO KEY UPDATE { $$ = LCS_FORNOKEYUPDATE; }
  9097. | FOR SHARE { $$ = LCS_FORSHARE; }
  9098. | FOR KEY SHARE { $$ = LCS_FORKEYSHARE; }
  9099. ;
  9100. locked_rels_list:
  9101. OF qualified_name_list { $$ = $2; }
  9102. | /* EMPTY */ { $$ = NIL; }
  9103. ;
  9104. values_clause:
  9105. VALUES ctext_row
  9106. {
  9107. SelectStmt *n = makeNode(SelectStmt);
  9108. n->valuesLists = list_make1($2);
  9109. $$ = (Node *) n;
  9110. }
  9111. | values_clause ',' ctext_row
  9112. {
  9113. SelectStmt *n = (SelectStmt *) $1;
  9114. n->valuesLists = lappend(n->valuesLists, $3);
  9115. $$ = (Node *) n;
  9116. }
  9117. ;
  9118. /*****************************************************************************
  9119. *
  9120. * clauses common to all Optimizable Stmts:
  9121. * from_clause - allow list of both JOIN expressions and table names
  9122. * where_clause - qualifications for joins or restrictions
  9123. *
  9124. *****************************************************************************/
  9125. from_clause:
  9126. FROM from_list { $$ = $2; }
  9127. | /*EMPTY*/ { $$ = NIL; }
  9128. ;
  9129. from_list:
  9130. table_ref { $$ = list_make1($1); }
  9131. | from_list ',' table_ref { $$ = lappend($1, $3); }
  9132. ;
  9133. /*
  9134. * table_ref is where an alias clause can be attached.
  9135. */
  9136. table_ref: relation_expr opt_alias_clause
  9137. {
  9138. $1->alias = $2;
  9139. $$ = (Node *) $1;
  9140. }
  9141. | func_table func_alias_clause
  9142. {
  9143. RangeFunction *n = (RangeFunction *) $1;
  9144. n->alias = linitial($2);
  9145. n->coldeflist = lsecond($2);
  9146. $$ = (Node *) n;
  9147. }
  9148. | LATERAL_P func_table func_alias_clause
  9149. {
  9150. RangeFunction *n = (RangeFunction *) $2;
  9151. n->lateral = true;
  9152. n->alias = linitial($3);
  9153. n->coldeflist = lsecond($3);
  9154. $$ = (Node *) n;
  9155. }
  9156. | select_with_parens opt_alias_clause
  9157. {
  9158. RangeSubselect *n = makeNode(RangeSubselect);
  9159. n->lateral = false;
  9160. n->subquery = $1;
  9161. n->alias = $2;
  9162. /*
  9163. * The SQL spec does not permit a subselect
  9164. * (<derived_table>) without an alias clause,
  9165. * so we don't either. This avoids the problem
  9166. * of needing to invent a unique refname for it.
  9167. * That could be surmounted if there's sufficient
  9168. * popular demand, but for now let's just implement
  9169. * the spec and see if anyone complains.
  9170. * However, it does seem like a good idea to emit
  9171. * an error message that's better than "syntax error".
  9172. */
  9173. if ($2 == NULL)
  9174. {
  9175. if (IsA($1, SelectStmt) &&
  9176. ((SelectStmt *) $1)->valuesLists)
  9177. ereport(ERROR,
  9178. (errcode(ERRCODE_SYNTAX_ERROR),
  9179. errmsg("VALUES in FROM must have an alias"),
  9180. errhint("For example, FROM (VALUES ...) [AS] foo."),
  9181. parser_errposition(@1)));
  9182. else
  9183. ereport(ERROR,
  9184. (errcode(ERRCODE_SYNTAX_ERROR),
  9185. errmsg("subquery in FROM must have an alias"),
  9186. errhint("For example, FROM (SELECT ...) [AS] foo."),
  9187. parser_errposition(@1)));
  9188. }
  9189. $$ = (Node *) n;
  9190. }
  9191. | LATERAL_P select_with_parens opt_alias_clause
  9192. {
  9193. RangeSubselect *n = makeNode(RangeSubselect);
  9194. n->lateral = true;
  9195. n->subquery = $2;
  9196. n->alias = $3;
  9197. /* same coment as above */
  9198. if ($3 == NULL)
  9199. {
  9200. if (IsA($2, SelectStmt) &&
  9201. ((SelectStmt *) $2)->valuesLists)
  9202. ereport(ERROR,
  9203. (errcode(ERRCODE_SYNTAX_ERROR),
  9204. errmsg("VALUES in FROM must have an alias"),
  9205. errhint("For example, FROM (VALUES ...) [AS] foo."),
  9206. parser_errposition(@2)));
  9207. else
  9208. ereport(ERROR,
  9209. (errcode(ERRCODE_SYNTAX_ERROR),
  9210. errmsg("subquery in FROM must have an alias"),
  9211. errhint("For example, FROM (SELECT ...) [AS] foo."),
  9212. parser_errposition(@2)));
  9213. }
  9214. $$ = (Node *) n;
  9215. }
  9216. | joined_table
  9217. {
  9218. $$ = (Node *) $1;
  9219. }
  9220. | '(' joined_table ')' alias_clause
  9221. {
  9222. $2->alias = $4;
  9223. $$ = (Node *) $2;
  9224. }
  9225. ;
  9226. /*
  9227. * It may seem silly to separate joined_table from table_ref, but there is
  9228. * method in SQL's madness: if you don't do it this way you get reduce-
  9229. * reduce conflicts, because it's not clear to the parser generator whether
  9230. * to expect alias_clause after ')' or not. For the same reason we must
  9231. * treat 'JOIN' and 'join_type JOIN' separately, rather than allowing
  9232. * join_type to expand to empty; if we try it, the parser generator can't
  9233. * figure out when to reduce an empty join_type right after table_ref.
  9234. *
  9235. * Note that a CROSS JOIN is the same as an unqualified
  9236. * INNER JOIN, and an INNER JOIN/ON has the same shape
  9237. * but a qualification expression to limit membership.
  9238. * A NATURAL JOIN implicitly matches column names between
  9239. * tables and the shape is determined by which columns are
  9240. * in common. We'll collect columns during the later transformations.
  9241. */
  9242. joined_table:
  9243. '(' joined_table ')'
  9244. {
  9245. $$ = $2;
  9246. }
  9247. | table_ref CROSS JOIN table_ref
  9248. {
  9249. /* CROSS JOIN is same as unqualified inner join */
  9250. JoinExpr *n = makeNode(JoinExpr);
  9251. n->jointype = JOIN_INNER;
  9252. n->isNatural = FALSE;
  9253. n->larg = $1;
  9254. n->rarg = $4;
  9255. n->usingClause = NIL;
  9256. n->quals = NULL;
  9257. $$ = n;
  9258. }
  9259. | table_ref join_type JOIN table_ref join_qual
  9260. {
  9261. JoinExpr *n = makeNode(JoinExpr);
  9262. n->jointype = $2;
  9263. n->isNatural = FALSE;
  9264. n->larg = $1;
  9265. n->rarg = $4;
  9266. if ($5 != NULL && IsA($5, List))
  9267. n->usingClause = (List *) $5; /* USING clause */
  9268. else
  9269. n->quals = $5; /* ON clause */
  9270. $$ = n;
  9271. }
  9272. | table_ref JOIN table_ref join_qual
  9273. {
  9274. /* letting join_type reduce to empty doesn't work */
  9275. JoinExpr *n = makeNode(JoinExpr);
  9276. n->jointype = JOIN_INNER;
  9277. n->isNatural = FALSE;
  9278. n->larg = $1;
  9279. n->rarg = $3;
  9280. if ($4 != NULL && IsA($4, List))
  9281. n->usingClause = (List *) $4; /* USING clause */
  9282. else
  9283. n->quals = $4; /* ON clause */
  9284. $$ = n;
  9285. }
  9286. | table_ref NATURAL join_type JOIN table_ref
  9287. {
  9288. JoinExpr *n = makeNode(JoinExpr);
  9289. n->jointype = $3;
  9290. n->isNatural = TRUE;
  9291. n->larg = $1;
  9292. n->rarg = $5;
  9293. n->usingClause = NIL; /* figure out which columns later... */
  9294. n->quals = NULL; /* fill later */
  9295. $$ = n;
  9296. }
  9297. | table_ref NATURAL JOIN table_ref
  9298. {
  9299. /* letting join_type reduce to empty doesn't work */
  9300. JoinExpr *n = makeNode(JoinExpr);
  9301. n->jointype = JOIN_INNER;
  9302. n->isNatural = TRUE;
  9303. n->larg = $1;
  9304. n->rarg = $4;
  9305. n->usingClause = NIL; /* figure out which columns later... */
  9306. n->quals = NULL; /* fill later */
  9307. $$ = n;
  9308. }
  9309. ;
  9310. alias_clause:
  9311. AS ColId '(' name_list ')'
  9312. {
  9313. $$ = makeNode(Alias);
  9314. $$->aliasname = $2;
  9315. $$->colnames = $4;
  9316. }
  9317. | AS ColId
  9318. {
  9319. $$ = makeNode(Alias);
  9320. $$->aliasname = $2;
  9321. }
  9322. | ColId '(' name_list ')'
  9323. {
  9324. $$ = makeNode(Alias);
  9325. $$->aliasname = $1;
  9326. $$->colnames = $3;
  9327. }
  9328. | ColId
  9329. {
  9330. $$ = makeNode(Alias);
  9331. $$->aliasname = $1;
  9332. }
  9333. ;
  9334. opt_alias_clause: alias_clause { $$ = $1; }
  9335. | /*EMPTY*/ { $$ = NULL; }
  9336. ;
  9337. /*
  9338. * func_alias_clause can include both an Alias and a coldeflist, so we make it
  9339. * return a 2-element list that gets disassembled by calling production.
  9340. */
  9341. func_alias_clause:
  9342. alias_clause
  9343. {
  9344. $$ = list_make2($1, NIL);
  9345. }
  9346. | AS '(' TableFuncElementList ')'
  9347. {
  9348. $$ = list_make2(NULL, $3);
  9349. }
  9350. | AS ColId '(' TableFuncElementList ')'
  9351. {
  9352. Alias *a = makeNode(Alias);
  9353. a->aliasname = $2;
  9354. $$ = list_make2(a, $4);
  9355. }
  9356. | ColId '(' TableFuncElementList ')'
  9357. {
  9358. Alias *a = makeNode(Alias);
  9359. a->aliasname = $1;
  9360. $$ = list_make2(a, $3);
  9361. }
  9362. | /*EMPTY*/
  9363. {
  9364. $$ = list_make2(NULL, NIL);
  9365. }
  9366. ;
  9367. join_type: FULL join_outer { $$ = JOIN_FULL; }
  9368. | LEFT join_outer { $$ = JOIN_LEFT; }
  9369. | RIGHT join_outer { $$ = JOIN_RIGHT; }
  9370. | INNER_P { $$ = JOIN_INNER; }
  9371. ;
  9372. /* OUTER is just noise... */
  9373. join_outer: OUTER_P { $$ = NULL; }
  9374. | /*EMPTY*/ { $$ = NULL; }
  9375. ;
  9376. /* JOIN qualification clauses
  9377. * Possibilities are:
  9378. * USING ( column list ) allows only unqualified column names,
  9379. * which must match between tables.
  9380. * ON expr allows more general qualifications.
  9381. *
  9382. * We return USING as a List node, while an ON-expr will not be a List.
  9383. */
  9384. join_qual: USING '(' name_list ')' { $$ = (Node *) $3; }
  9385. | ON a_expr { $$ = $2; }
  9386. ;
  9387. relation_expr:
  9388. qualified_name
  9389. {
  9390. /* default inheritance */
  9391. $$ = $1;
  9392. $$->inhOpt = INH_DEFAULT;
  9393. $$->alias = NULL;
  9394. }
  9395. | qualified_name '*'
  9396. {
  9397. /* inheritance query */
  9398. $$ = $1;
  9399. $$->inhOpt = INH_YES;
  9400. $$->alias = NULL;
  9401. }
  9402. | ONLY qualified_name
  9403. {
  9404. /* no inheritance */
  9405. $$ = $2;
  9406. $$->inhOpt = INH_NO;
  9407. $$->alias = NULL;
  9408. }
  9409. | ONLY '(' qualified_name ')'
  9410. {
  9411. /* no inheritance, SQL99-style syntax */
  9412. $$ = $3;
  9413. $$->inhOpt = INH_NO;
  9414. $$->alias = NULL;
  9415. }
  9416. ;
  9417. relation_expr_list:
  9418. relation_expr { $$ = list_make1($1); }
  9419. | relation_expr_list ',' relation_expr { $$ = lappend($1, $3); }
  9420. ;
  9421. /*
  9422. * Given "UPDATE foo set set ...", we have to decide without looking any
  9423. * further ahead whether the first "set" is an alias or the UPDATE's SET
  9424. * keyword. Since "set" is allowed as a column name both interpretations
  9425. * are feasible. We resolve the shift/reduce conflict by giving the first
  9426. * relation_expr_opt_alias production a higher precedence than the SET token
  9427. * has, causing the parser to prefer to reduce, in effect assuming that the
  9428. * SET is not an alias.
  9429. */
  9430. relation_expr_opt_alias: relation_expr %prec UMINUS
  9431. {
  9432. $$ = $1;
  9433. }
  9434. | relation_expr ColId
  9435. {
  9436. Alias *alias = makeNode(Alias);
  9437. alias->aliasname = $2;
  9438. $1->alias = alias;
  9439. $$ = $1;
  9440. }
  9441. | relation_expr AS ColId
  9442. {
  9443. Alias *alias = makeNode(Alias);
  9444. alias->aliasname = $3;
  9445. $1->alias = alias;
  9446. $$ = $1;
  9447. }
  9448. ;
  9449. /*
  9450. * func_table represents a function invocation in a FROM list. It can be
  9451. * a plain function call, like "foo(...)", or a ROWS FROM expression with
  9452. * one or more function calls, "ROWS FROM (foo(...), bar(...))",
  9453. * optionally with WITH ORDINALITY attached.
  9454. * In the ROWS FROM syntax, a column definition list can be given for each
  9455. * function, for example:
  9456. * ROWS FROM (foo() AS (foo_res_a text, foo_res_b text),
  9457. * bar() AS (bar_res_a text, bar_res_b text))
  9458. * It's also possible to attach a column definition list to the RangeFunction
  9459. * as a whole, but that's handled by the table_ref production.
  9460. */
  9461. func_table: func_expr_windowless opt_ordinality
  9462. {
  9463. RangeFunction *n = makeNode(RangeFunction);
  9464. n->lateral = false;
  9465. n->ordinality = $2;
  9466. n->is_rowsfrom = false;
  9467. n->functions = list_make1(list_make2($1, NIL));
  9468. /* alias and coldeflist are set by table_ref production */
  9469. $$ = (Node *) n;
  9470. }
  9471. | ROWS FROM '(' rowsfrom_list ')' opt_ordinality
  9472. {
  9473. RangeFunction *n = makeNode(RangeFunction);
  9474. n->lateral = false;
  9475. n->ordinality = $6;
  9476. n->is_rowsfrom = true;
  9477. n->functions = $4;
  9478. /* alias and coldeflist are set by table_ref production */
  9479. $$ = (Node *) n;
  9480. }
  9481. ;
  9482. rowsfrom_item: func_expr_windowless opt_col_def_list
  9483. { $$ = list_make2($1, $2); }
  9484. ;
  9485. rowsfrom_list:
  9486. rowsfrom_item { $$ = list_make1($1); }
  9487. | rowsfrom_list ',' rowsfrom_item { $$ = lappend($1, $3); }
  9488. ;
  9489. opt_col_def_list: AS '(' TableFuncElementList ')' { $$ = $3; }
  9490. | /*EMPTY*/ { $$ = NIL; }
  9491. ;
  9492. opt_ordinality: WITH_ORDINALITY { $$ = true; }
  9493. | /*EMPTY*/ { $$ = false; }
  9494. ;
  9495. where_clause:
  9496. WHERE a_expr { $$ = $2; }
  9497. | /*EMPTY*/ { $$ = NULL; }
  9498. ;
  9499. /* variant for UPDATE and DELETE */
  9500. where_or_current_clause:
  9501. WHERE a_expr { $$ = $2; }
  9502. | WHERE CURRENT_P OF cursor_name
  9503. {
  9504. CurrentOfExpr *n = makeNode(CurrentOfExpr);
  9505. /* cvarno is filled in by parse analysis */
  9506. n->cursor_name = $4;
  9507. n->cursor_param = 0;
  9508. $$ = (Node *) n;
  9509. }
  9510. | /*EMPTY*/ { $$ = NULL; }
  9511. ;
  9512. OptTableFuncElementList:
  9513. TableFuncElementList { $$ = $1; }
  9514. | /*EMPTY*/ { $$ = NIL; }
  9515. ;
  9516. TableFuncElementList:
  9517. TableFuncElement
  9518. {
  9519. $$ = list_make1($1);
  9520. }
  9521. | TableFuncElementList ',' TableFuncElement
  9522. {
  9523. $$ = lappend($1, $3);
  9524. }
  9525. ;
  9526. TableFuncElement: ColId Typename opt_collate_clause
  9527. {
  9528. ColumnDef *n = makeNode(ColumnDef);
  9529. n->colname = $1;
  9530. n->typeName = $2;
  9531. n->inhcount = 0;
  9532. n->is_local = true;
  9533. n->is_not_null = false;
  9534. n->is_from_type = false;
  9535. n->storage = 0;
  9536. n->raw_default = NULL;
  9537. n->cooked_default = NULL;
  9538. n->collClause = (CollateClause *) $3;
  9539. n->collOid = InvalidOid;
  9540. n->constraints = NIL;
  9541. n->location = @1;
  9542. $$ = (Node *)n;
  9543. }
  9544. ;
  9545. /*****************************************************************************
  9546. *
  9547. * Type syntax
  9548. * SQL introduces a large amount of type-specific syntax.
  9549. * Define individual clauses to handle these cases, and use
  9550. * the generic case to handle regular type-extensible Postgres syntax.
  9551. * - thomas 1997-10-10
  9552. *
  9553. *****************************************************************************/
  9554. Typename: SimpleTypename opt_array_bounds
  9555. {
  9556. $$ = $1;
  9557. $$->arrayBounds = $2;
  9558. }
  9559. | SETOF SimpleTypename opt_array_bounds
  9560. {
  9561. $$ = $2;
  9562. $$->arrayBounds = $3;
  9563. $$->setof = TRUE;
  9564. }
  9565. /* SQL standard syntax, currently only one-dimensional */
  9566. | SimpleTypename ARRAY '[' Iconst ']'
  9567. {
  9568. $$ = $1;
  9569. $$->arrayBounds = list_make1(makeInteger($4));
  9570. }
  9571. | SETOF SimpleTypename ARRAY '[' Iconst ']'
  9572. {
  9573. $$ = $2;
  9574. $$->arrayBounds = list_make1(makeInteger($5));
  9575. $$->setof = TRUE;
  9576. }
  9577. | SimpleTypename ARRAY
  9578. {
  9579. $$ = $1;
  9580. $$->arrayBounds = list_make1(makeInteger(-1));
  9581. }
  9582. | SETOF SimpleTypename ARRAY
  9583. {
  9584. $$ = $2;
  9585. $$->arrayBounds = list_make1(makeInteger(-1));
  9586. $$->setof = TRUE;
  9587. }
  9588. ;
  9589. opt_array_bounds:
  9590. opt_array_bounds '[' ']'
  9591. { $$ = lappend($1, makeInteger(-1)); }
  9592. | opt_array_bounds '[' Iconst ']'
  9593. { $$ = lappend($1, makeInteger($3)); }
  9594. | /*EMPTY*/
  9595. { $$ = NIL; }
  9596. ;
  9597. SimpleTypename:
  9598. GenericType { $$ = $1; }
  9599. | Numeric { $$ = $1; }
  9600. | Bit { $$ = $1; }
  9601. | Character { $$ = $1; }
  9602. | ConstDatetime { $$ = $1; }
  9603. | ConstInterval opt_interval
  9604. {
  9605. $$ = $1;
  9606. $$->typmods = $2;
  9607. }
  9608. | ConstInterval '(' Iconst ')' opt_interval
  9609. {
  9610. $$ = $1;
  9611. if ($5 != NIL)
  9612. {
  9613. if (list_length($5) != 1)
  9614. ereport(ERROR,
  9615. (errcode(ERRCODE_SYNTAX_ERROR),
  9616. errmsg("interval precision specified twice"),
  9617. parser_errposition(@1)));
  9618. $$->typmods = lappend($5, makeIntConst($3, @3));
  9619. }
  9620. else
  9621. $$->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1),
  9622. makeIntConst($3, @3));
  9623. }
  9624. ;
  9625. /* We have a separate ConstTypename to allow defaulting fixed-length
  9626. * types such as CHAR() and BIT() to an unspecified length.
  9627. * SQL9x requires that these default to a length of one, but this
  9628. * makes no sense for constructs like CHAR 'hi' and BIT '0101',
  9629. * where there is an obvious better choice to make.
  9630. * Note that ConstInterval is not included here since it must
  9631. * be pushed up higher in the rules to accommodate the postfix
  9632. * options (e.g. INTERVAL '1' YEAR). Likewise, we have to handle
  9633. * the generic-type-name case in AExprConst to avoid premature
  9634. * reduce/reduce conflicts against function names.
  9635. */
  9636. ConstTypename:
  9637. Numeric { $$ = $1; }
  9638. | ConstBit { $$ = $1; }
  9639. | ConstCharacter { $$ = $1; }
  9640. | ConstDatetime { $$ = $1; }
  9641. ;
  9642. /*
  9643. * GenericType covers all type names that don't have special syntax mandated
  9644. * by the standard, including qualified names. We also allow type modifiers.
  9645. * To avoid parsing conflicts against function invocations, the modifiers
  9646. * have to be shown as expr_list here, but parse analysis will only accept
  9647. * constants for them.
  9648. */
  9649. GenericType:
  9650. type_function_name opt_type_modifiers
  9651. {
  9652. $$ = makeTypeName($1);
  9653. $$->typmods = $2;
  9654. $$->location = @1;
  9655. }
  9656. | type_function_name attrs opt_type_modifiers
  9657. {
  9658. $$ = makeTypeNameFromNameList(lcons(makeString($1), $2));
  9659. $$->typmods = $3;
  9660. $$->location = @1;
  9661. }
  9662. ;
  9663. opt_type_modifiers: '(' expr_list ')' { $$ = $2; }
  9664. | /* EMPTY */ { $$ = NIL; }
  9665. ;
  9666. /*
  9667. * SQL numeric data types
  9668. */
  9669. Numeric: INT_P
  9670. {
  9671. $$ = SystemTypeName("int4");
  9672. $$->location = @1;
  9673. }
  9674. | INTEGER
  9675. {
  9676. $$ = SystemTypeName("int4");
  9677. $$->location = @1;
  9678. }
  9679. | SMALLINT
  9680. {
  9681. $$ = SystemTypeName("int2");
  9682. $$->location = @1;
  9683. }
  9684. | BIGINT
  9685. {
  9686. $$ = SystemTypeName("int8");
  9687. $$->location = @1;
  9688. }
  9689. | REAL
  9690. {
  9691. $$ = SystemTypeName("float4");
  9692. $$->location = @1;
  9693. }
  9694. | FLOAT_P opt_float
  9695. {
  9696. $$ = $2;
  9697. $$->location = @1;
  9698. }
  9699. | DOUBLE_P PRECISION
  9700. {
  9701. $$ = SystemTypeName("float8");
  9702. $$->location = @1;
  9703. }
  9704. | DECIMAL_P opt_type_modifiers
  9705. {
  9706. $$ = SystemTypeName("numeric");
  9707. $$->typmods = $2;
  9708. $$->location = @1;
  9709. }
  9710. | DEC opt_type_modifiers
  9711. {
  9712. $$ = SystemTypeName("numeric");
  9713. $$->typmods = $2;
  9714. $$->location = @1;
  9715. }
  9716. | NUMERIC opt_type_modifiers
  9717. {
  9718. $$ = SystemTypeName("numeric");
  9719. $$->typmods = $2;
  9720. $$->location = @1;
  9721. }
  9722. | BOOLEAN_P
  9723. {
  9724. $$ = SystemTypeName("bool");
  9725. $$->location = @1;
  9726. }
  9727. ;
  9728. opt_float: '(' Iconst ')'
  9729. {
  9730. /*
  9731. * Check FLOAT() precision limits assuming IEEE floating
  9732. * types - thomas 1997-09-18
  9733. */
  9734. if ($2 < 1)
  9735. ereport(ERROR,
  9736. (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
  9737. errmsg("precision for type float must be at least 1 bit"),
  9738. parser_errposition(@2)));
  9739. else if ($2 <= 24)
  9740. $$ = SystemTypeName("float4");
  9741. else if ($2 <= 53)
  9742. $$ = SystemTypeName("float8");
  9743. else
  9744. ereport(ERROR,
  9745. (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
  9746. errmsg("precision for type float must be less than 54 bits"),
  9747. parser_errposition(@2)));
  9748. }
  9749. | /*EMPTY*/
  9750. {
  9751. $$ = SystemTypeName("float8");
  9752. }
  9753. ;
  9754. /*
  9755. * SQL bit-field data types
  9756. * The following implements BIT() and BIT VARYING().
  9757. */
  9758. Bit: BitWithLength
  9759. {
  9760. $$ = $1;
  9761. }
  9762. | BitWithoutLength
  9763. {
  9764. $$ = $1;
  9765. }
  9766. ;
  9767. /* ConstBit is like Bit except "BIT" defaults to unspecified length */
  9768. /* See notes for ConstCharacter, which addresses same issue for "CHAR" */
  9769. ConstBit: BitWithLength
  9770. {
  9771. $$ = $1;
  9772. }
  9773. | BitWithoutLength
  9774. {
  9775. $$ = $1;
  9776. $$->typmods = NIL;
  9777. }
  9778. ;
  9779. BitWithLength:
  9780. BIT opt_varying '(' expr_list ')'
  9781. {
  9782. char *typname;
  9783. typname = $2 ? "varbit" : "bit";
  9784. $$ = SystemTypeName(typname);
  9785. $$->typmods = $4;
  9786. $$->location = @1;
  9787. }
  9788. ;
  9789. BitWithoutLength:
  9790. BIT opt_varying
  9791. {
  9792. /* bit defaults to bit(1), varbit to no limit */
  9793. if ($2)
  9794. {
  9795. $$ = SystemTypeName("varbit");
  9796. }
  9797. else
  9798. {
  9799. $$ = SystemTypeName("bit");
  9800. $$->typmods = list_make1(makeIntConst(1, -1));
  9801. }
  9802. $$->location = @1;
  9803. }
  9804. ;
  9805. /*
  9806. * SQL character data types
  9807. * The following implements CHAR() and VARCHAR().
  9808. */
  9809. Character: CharacterWithLength
  9810. {
  9811. $$ = $1;
  9812. }
  9813. | CharacterWithoutLength
  9814. {
  9815. $$ = $1;
  9816. }
  9817. ;
  9818. ConstCharacter: CharacterWithLength
  9819. {
  9820. $$ = $1;
  9821. }
  9822. | CharacterWithoutLength
  9823. {
  9824. /* Length was not specified so allow to be unrestricted.
  9825. * This handles problems with fixed-length (bpchar) strings
  9826. * which in column definitions must default to a length
  9827. * of one, but should not be constrained if the length
  9828. * was not specified.
  9829. */
  9830. $$ = $1;
  9831. $$->typmods = NIL;
  9832. }
  9833. ;
  9834. CharacterWithLength: character '(' Iconst ')' opt_charset
  9835. {
  9836. if (($5 != NULL) && (strcmp($5, "sql_text") != 0))
  9837. $1 = psprintf("%s_%s", $1, $5);
  9838. $$ = SystemTypeName($1);
  9839. $$->typmods = list_make1(makeIntConst($3, @3));
  9840. $$->location = @1;
  9841. }
  9842. ;
  9843. CharacterWithoutLength: character opt_charset
  9844. {
  9845. if (($2 != NULL) && (strcmp($2, "sql_text") != 0))
  9846. $1 = psprintf("%s_%s", $1, $2);
  9847. $$ = SystemTypeName($1);
  9848. /* char defaults to char(1), varchar to no limit */
  9849. if (strcmp($1, "bpchar") == 0)
  9850. $$->typmods = list_make1(makeIntConst(1, -1));
  9851. $$->location = @1;
  9852. }
  9853. ;
  9854. character: CHARACTER opt_varying
  9855. { $$ = $2 ? "varchar": "bpchar"; }
  9856. | CHAR_P opt_varying
  9857. { $$ = $2 ? "varchar": "bpchar"; }
  9858. | VARCHAR
  9859. { $$ = "varchar"; }
  9860. | NATIONAL CHARACTER opt_varying
  9861. { $$ = $3 ? "varchar": "bpchar"; }
  9862. | NATIONAL CHAR_P opt_varying
  9863. { $$ = $3 ? "varchar": "bpchar"; }
  9864. | NCHAR opt_varying
  9865. { $$ = $2 ? "varchar": "bpchar"; }
  9866. ;
  9867. opt_varying:
  9868. VARYING { $$ = TRUE; }
  9869. | /*EMPTY*/ { $$ = FALSE; }
  9870. ;
  9871. opt_charset:
  9872. CHARACTER SET ColId { $$ = $3; }
  9873. | /*EMPTY*/ { $$ = NULL; }
  9874. ;
  9875. /*
  9876. * SQL date/time types
  9877. */
  9878. ConstDatetime:
  9879. TIMESTAMP '(' Iconst ')' opt_timezone
  9880. {
  9881. if ($5)
  9882. $$ = SystemTypeName("timestamptz");
  9883. else
  9884. $$ = SystemTypeName("timestamp");
  9885. $$->typmods = list_make1(makeIntConst($3, @3));
  9886. $$->location = @1;
  9887. }
  9888. | TIMESTAMP opt_timezone
  9889. {
  9890. if ($2)
  9891. $$ = SystemTypeName("timestamptz");
  9892. else
  9893. $$ = SystemTypeName("timestamp");
  9894. $$->location = @1;
  9895. }
  9896. | TIME '(' Iconst ')' opt_timezone
  9897. {
  9898. if ($5)
  9899. $$ = SystemTypeName("timetz");
  9900. else
  9901. $$ = SystemTypeName("time");
  9902. $$->typmods = list_make1(makeIntConst($3, @3));
  9903. $$->location = @1;
  9904. }
  9905. | TIME opt_timezone
  9906. {
  9907. if ($2)
  9908. $$ = SystemTypeName("timetz");
  9909. else
  9910. $$ = SystemTypeName("time");
  9911. $$->location = @1;
  9912. }
  9913. ;
  9914. ConstInterval:
  9915. INTERVAL
  9916. {
  9917. $$ = SystemTypeName("interval");
  9918. $$->location = @1;
  9919. }
  9920. ;
  9921. opt_timezone:
  9922. WITH_TIME ZONE { $$ = TRUE; }
  9923. | WITHOUT TIME ZONE { $$ = FALSE; }
  9924. | /*EMPTY*/ { $$ = FALSE; }
  9925. ;
  9926. opt_interval:
  9927. YEAR_P
  9928. { $$ = list_make1(makeIntConst(INTERVAL_MASK(YEAR), @1)); }
  9929. | MONTH_P
  9930. { $$ = list_make1(makeIntConst(INTERVAL_MASK(MONTH), @1)); }
  9931. | DAY_P
  9932. { $$ = list_make1(makeIntConst(INTERVAL_MASK(DAY), @1)); }
  9933. | HOUR_P
  9934. { $$ = list_make1(makeIntConst(INTERVAL_MASK(HOUR), @1)); }
  9935. | MINUTE_P
  9936. { $$ = list_make1(makeIntConst(INTERVAL_MASK(MINUTE), @1)); }
  9937. | interval_second
  9938. { $$ = $1; }
  9939. | YEAR_P TO MONTH_P
  9940. {
  9941. $$ = list_make1(makeIntConst(INTERVAL_MASK(YEAR) |
  9942. INTERVAL_MASK(MONTH), @1));
  9943. }
  9944. | DAY_P TO HOUR_P
  9945. {
  9946. $$ = list_make1(makeIntConst(INTERVAL_MASK(DAY) |
  9947. INTERVAL_MASK(HOUR), @1));
  9948. }
  9949. | DAY_P TO MINUTE_P
  9950. {
  9951. $$ = list_make1(makeIntConst(INTERVAL_MASK(DAY) |
  9952. INTERVAL_MASK(HOUR) |
  9953. INTERVAL_MASK(MINUTE), @1));
  9954. }
  9955. | DAY_P TO interval_second
  9956. {
  9957. $$ = $3;
  9958. linitial($$) = makeIntConst(INTERVAL_MASK(DAY) |
  9959. INTERVAL_MASK(HOUR) |
  9960. INTERVAL_MASK(MINUTE) |
  9961. INTERVAL_MASK(SECOND), @1);
  9962. }
  9963. | HOUR_P TO MINUTE_P
  9964. {
  9965. $$ = list_make1(makeIntConst(INTERVAL_MASK(HOUR) |
  9966. INTERVAL_MASK(MINUTE), @1));
  9967. }
  9968. | HOUR_P TO interval_second
  9969. {
  9970. $$ = $3;
  9971. linitial($$) = makeIntConst(INTERVAL_MASK(HOUR) |
  9972. INTERVAL_MASK(MINUTE) |
  9973. INTERVAL_MASK(SECOND), @1);
  9974. }
  9975. | MINUTE_P TO interval_second
  9976. {
  9977. $$ = $3;
  9978. linitial($$) = makeIntConst(INTERVAL_MASK(MINUTE) |
  9979. INTERVAL_MASK(SECOND), @1);
  9980. }
  9981. | /*EMPTY*/
  9982. { $$ = NIL; }
  9983. ;
  9984. interval_second:
  9985. SECOND_P
  9986. {
  9987. $$ = list_make1(makeIntConst(INTERVAL_MASK(SECOND), @1));
  9988. }
  9989. | SECOND_P '(' Iconst ')'
  9990. {
  9991. $$ = list_make2(makeIntConst(INTERVAL_MASK(SECOND), @1),
  9992. makeIntConst($3, @3));
  9993. }
  9994. ;
  9995. /*****************************************************************************
  9996. *
  9997. * expression grammar
  9998. *
  9999. *****************************************************************************/
  10000. /*
  10001. * General expressions
  10002. * This is the heart of the expression syntax.
  10003. *
  10004. * We have two expression types: a_expr is the unrestricted kind, and
  10005. * b_expr is a subset that must be used in some places to avoid shift/reduce
  10006. * conflicts. For example, we can't do BETWEEN as "BETWEEN a_expr AND a_expr"
  10007. * because that use of AND conflicts with AND as a boolean operator. So,
  10008. * b_expr is used in BETWEEN and we remove boolean keywords from b_expr.
  10009. *
  10010. * Note that '(' a_expr ')' is a b_expr, so an unrestricted expression can
  10011. * always be used by surrounding it with parens.
  10012. *
  10013. * c_expr is all the productions that are common to a_expr and b_expr;
  10014. * it's factored out just to eliminate redundant coding.
  10015. */
  10016. a_expr: c_expr { $$ = $1; }
  10017. | a_expr TYPECAST Typename
  10018. { $$ = makeTypeCast($1, $3, @2); }
  10019. | a_expr COLLATE any_name
  10020. {
  10021. CollateClause *n = makeNode(CollateClause);
  10022. n->arg = $1;
  10023. n->collname = $3;
  10024. n->location = @2;
  10025. $$ = (Node *) n;
  10026. }
  10027. | a_expr AT TIME ZONE a_expr %prec AT
  10028. {
  10029. $$ = (Node *) makeFuncCall(SystemFuncName("timezone"),
  10030. list_make2($5, $1),
  10031. @2);
  10032. }
  10033. /*
  10034. * These operators must be called out explicitly in order to make use
  10035. * of bison's automatic operator-precedence handling. All other
  10036. * operator names are handled by the generic productions using "Op",
  10037. * below; and all those operators will have the same precedence.
  10038. *
  10039. * If you add more explicitly-known operators, be sure to add them
  10040. * also to b_expr and to the MathOp list above.
  10041. */
  10042. | '+' a_expr %prec UMINUS
  10043. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2, @1); }
  10044. | '-' a_expr %prec UMINUS
  10045. { $$ = doNegate($2, @1); }
  10046. | a_expr '+' a_expr
  10047. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", $1, $3, @2); }
  10048. | a_expr '-' a_expr
  10049. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "-", $1, $3, @2); }
  10050. | a_expr '*' a_expr
  10051. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "*", $1, $3, @2); }
  10052. | a_expr '/' a_expr
  10053. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "/", $1, $3, @2); }
  10054. | a_expr '%' a_expr
  10055. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, $3, @2); }
  10056. | a_expr '^' a_expr
  10057. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, $3, @2); }
  10058. | a_expr '<' a_expr
  10059. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $3, @2); }
  10060. | a_expr '>' a_expr
  10061. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $3, @2); }
  10062. | a_expr '=' a_expr
  10063. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "=", $1, $3, @2); }
  10064. | a_expr qual_Op a_expr %prec Op
  10065. { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, $3, @2); }
  10066. | qual_Op a_expr %prec Op
  10067. { $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2, @1); }
  10068. | a_expr qual_Op %prec POSTFIXOP
  10069. { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, NULL, @2); }
  10070. | a_expr AND a_expr
  10071. { $$ = (Node *) makeA_Expr(AEXPR_AND, NIL, $1, $3, @2); }
  10072. | a_expr OR a_expr
  10073. { $$ = (Node *) makeA_Expr(AEXPR_OR, NIL, $1, $3, @2); }
  10074. | NOT a_expr
  10075. { $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL, $2, @1); }
  10076. | a_expr LIKE a_expr
  10077. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~", $1, $3, @2); }
  10078. | a_expr LIKE a_expr ESCAPE a_expr
  10079. {
  10080. FuncCall *n = makeFuncCall(SystemFuncName("like_escape"),
  10081. list_make2($3, $5),
  10082. @2);
  10083. $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~", $1, (Node *) n, @2);
  10084. }
  10085. | a_expr NOT LIKE a_expr
  10086. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~", $1, $4, @2); }
  10087. | a_expr NOT LIKE a_expr ESCAPE a_expr
  10088. {
  10089. FuncCall *n = makeFuncCall(SystemFuncName("like_escape"),
  10090. list_make2($4, $6),
  10091. @2);
  10092. $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~", $1, (Node *) n, @2);
  10093. }
  10094. | a_expr ILIKE a_expr
  10095. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~*", $1, $3, @2); }
  10096. | a_expr ILIKE a_expr ESCAPE a_expr
  10097. {
  10098. FuncCall *n = makeFuncCall(SystemFuncName("like_escape"),
  10099. list_make2($3, $5),
  10100. @2);
  10101. $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~*", $1, (Node *) n, @2);
  10102. }
  10103. | a_expr NOT ILIKE a_expr
  10104. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~*", $1, $4, @2); }
  10105. | a_expr NOT ILIKE a_expr ESCAPE a_expr
  10106. {
  10107. FuncCall *n = makeFuncCall(SystemFuncName("like_escape"),
  10108. list_make2($4, $6),
  10109. @2);
  10110. $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~*", $1, (Node *) n, @2);
  10111. }
  10112. | a_expr SIMILAR TO a_expr %prec SIMILAR
  10113. {
  10114. FuncCall *n = makeFuncCall(SystemFuncName("similar_escape"),
  10115. list_make2($4, makeNullAConst(-1)),
  10116. @2);
  10117. $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~", $1, (Node *) n, @2);
  10118. }
  10119. | a_expr SIMILAR TO a_expr ESCAPE a_expr
  10120. {
  10121. FuncCall *n = makeFuncCall(SystemFuncName("similar_escape"),
  10122. list_make2($4, $6),
  10123. @2);
  10124. $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~", $1, (Node *) n, @2);
  10125. }
  10126. | a_expr NOT SIMILAR TO a_expr %prec SIMILAR
  10127. {
  10128. FuncCall *n = makeFuncCall(SystemFuncName("similar_escape"),
  10129. list_make2($5, makeNullAConst(-1)),
  10130. @2);
  10131. $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~", $1, (Node *) n, @2);
  10132. }
  10133. | a_expr NOT SIMILAR TO a_expr ESCAPE a_expr
  10134. {
  10135. FuncCall *n = makeFuncCall(SystemFuncName("similar_escape"),
  10136. list_make2($5, $7),
  10137. @2);
  10138. $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~", $1, (Node *) n, @2);
  10139. }
  10140. /* NullTest clause
  10141. * Define SQL-style Null test clause.
  10142. * Allow two forms described in the standard:
  10143. * a IS NULL
  10144. * a IS NOT NULL
  10145. * Allow two SQL extensions
  10146. * a ISNULL
  10147. * a NOTNULL
  10148. */
  10149. | a_expr IS NULL_P %prec IS
  10150. {
  10151. NullTest *n = makeNode(NullTest);
  10152. n->arg = (Expr *) $1;
  10153. n->nulltesttype = IS_NULL;
  10154. $$ = (Node *)n;
  10155. }
  10156. | a_expr ISNULL
  10157. {
  10158. NullTest *n = makeNode(NullTest);
  10159. n->arg = (Expr *) $1;
  10160. n->nulltesttype = IS_NULL;
  10161. $$ = (Node *)n;
  10162. }
  10163. | a_expr IS NOT NULL_P %prec IS
  10164. {
  10165. NullTest *n = makeNode(NullTest);
  10166. n->arg = (Expr *) $1;
  10167. n->nulltesttype = IS_NOT_NULL;
  10168. $$ = (Node *)n;
  10169. }
  10170. | a_expr NOTNULL
  10171. {
  10172. NullTest *n = makeNode(NullTest);
  10173. n->arg = (Expr *) $1;
  10174. n->nulltesttype = IS_NOT_NULL;
  10175. $$ = (Node *)n;
  10176. }
  10177. | row OVERLAPS row
  10178. {
  10179. if (list_length($1) != 2)
  10180. ereport(ERROR,
  10181. (errcode(ERRCODE_SYNTAX_ERROR),
  10182. errmsg("wrong number of parameters on left side of OVERLAPS expression"),
  10183. parser_errposition(@1)));
  10184. if (list_length($3) != 2)
  10185. ereport(ERROR,
  10186. (errcode(ERRCODE_SYNTAX_ERROR),
  10187. errmsg("wrong number of parameters on right side of OVERLAPS expression"),
  10188. parser_errposition(@3)));
  10189. $$ = (Node *) makeFuncCall(SystemFuncName("overlaps"),
  10190. list_concat($1, $3),
  10191. @2);
  10192. }
  10193. | a_expr IS TRUE_P %prec IS
  10194. {
  10195. BooleanTest *b = makeNode(BooleanTest);
  10196. b->arg = (Expr *) $1;
  10197. b->booltesttype = IS_TRUE;
  10198. $$ = (Node *)b;
  10199. }
  10200. | a_expr IS NOT TRUE_P %prec IS
  10201. {
  10202. BooleanTest *b = makeNode(BooleanTest);
  10203. b->arg = (Expr *) $1;
  10204. b->booltesttype = IS_NOT_TRUE;
  10205. $$ = (Node *)b;
  10206. }
  10207. | a_expr IS FALSE_P %prec IS
  10208. {
  10209. BooleanTest *b = makeNode(BooleanTest);
  10210. b->arg = (Expr *) $1;
  10211. b->booltesttype = IS_FALSE;
  10212. $$ = (Node *)b;
  10213. }
  10214. | a_expr IS NOT FALSE_P %prec IS
  10215. {
  10216. BooleanTest *b = makeNode(BooleanTest);
  10217. b->arg = (Expr *) $1;
  10218. b->booltesttype = IS_NOT_FALSE;
  10219. $$ = (Node *)b;
  10220. }
  10221. | a_expr IS UNKNOWN %prec IS
  10222. {
  10223. BooleanTest *b = makeNode(BooleanTest);
  10224. b->arg = (Expr *) $1;
  10225. b->booltesttype = IS_UNKNOWN;
  10226. $$ = (Node *)b;
  10227. }
  10228. | a_expr IS NOT UNKNOWN %prec IS
  10229. {
  10230. BooleanTest *b = makeNode(BooleanTest);
  10231. b->arg = (Expr *) $1;
  10232. b->booltesttype = IS_NOT_UNKNOWN;
  10233. $$ = (Node *)b;
  10234. }
  10235. | a_expr IS DISTINCT FROM a_expr %prec IS
  10236. {
  10237. $$ = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $5, @2);
  10238. }
  10239. | a_expr IS NOT DISTINCT FROM a_expr %prec IS
  10240. {
  10241. $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL,
  10242. (Node *) makeSimpleA_Expr(AEXPR_DISTINCT,
  10243. "=", $1, $6, @2),
  10244. @2);
  10245. }
  10246. | a_expr IS OF '(' type_list ')' %prec IS
  10247. {
  10248. $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "=", $1, (Node *) $5, @2);
  10249. }
  10250. | a_expr IS NOT OF '(' type_list ')' %prec IS
  10251. {
  10252. $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "<>", $1, (Node *) $6, @2);
  10253. }
  10254. /*
  10255. * Ideally we would not use hard-wired operators below but
  10256. * instead use opclasses. However, mixed data types and other
  10257. * issues make this difficult:
  10258. * http://archives.postgresql.org/pgsql-hackers/2008-08/msg01142.php
  10259. */
  10260. | a_expr BETWEEN opt_asymmetric b_expr AND b_expr %prec BETWEEN
  10261. {
  10262. $$ = (Node *) makeA_Expr(AEXPR_AND, NIL,
  10263. (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $4, @2),
  10264. (Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $6, @2),
  10265. @2);
  10266. }
  10267. | a_expr NOT BETWEEN opt_asymmetric b_expr AND b_expr %prec BETWEEN
  10268. {
  10269. $$ = (Node *) makeA_Expr(AEXPR_OR, NIL,
  10270. (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $5, @2),
  10271. (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $7, @2),
  10272. @2);
  10273. }
  10274. | a_expr BETWEEN SYMMETRIC b_expr AND b_expr %prec BETWEEN
  10275. {
  10276. $$ = (Node *) makeA_Expr(AEXPR_OR, NIL,
  10277. (Node *) makeA_Expr(AEXPR_AND, NIL,
  10278. (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $4, @2),
  10279. (Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $6, @2),
  10280. @2),
  10281. (Node *) makeA_Expr(AEXPR_AND, NIL,
  10282. (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $6, @2),
  10283. (Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $4, @2),
  10284. @2),
  10285. @2);
  10286. }
  10287. | a_expr NOT BETWEEN SYMMETRIC b_expr AND b_expr %prec BETWEEN
  10288. {
  10289. $$ = (Node *) makeA_Expr(AEXPR_AND, NIL,
  10290. (Node *) makeA_Expr(AEXPR_OR, NIL,
  10291. (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $5, @2),
  10292. (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $7, @2),
  10293. @2),
  10294. (Node *) makeA_Expr(AEXPR_OR, NIL,
  10295. (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $7, @2),
  10296. (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $5, @2),
  10297. @2),
  10298. @2);
  10299. }
  10300. | a_expr IN_P in_expr
  10301. {
  10302. /* in_expr returns a SubLink or a list of a_exprs */
  10303. if (IsA($3, SubLink))
  10304. {
  10305. /* generate foo = ANY (subquery) */
  10306. SubLink *n = (SubLink *) $3;
  10307. n->subLinkType = ANY_SUBLINK;
  10308. n->testexpr = $1;
  10309. n->operName = list_make1(makeString("="));
  10310. n->location = @2;
  10311. $$ = (Node *)n;
  10312. }
  10313. else
  10314. {
  10315. /* generate scalar IN expression */
  10316. $$ = (Node *) makeSimpleA_Expr(AEXPR_IN, "=", $1, $3, @2);
  10317. }
  10318. }
  10319. | a_expr NOT IN_P in_expr
  10320. {
  10321. /* in_expr returns a SubLink or a list of a_exprs */
  10322. if (IsA($4, SubLink))
  10323. {
  10324. /* generate NOT (foo = ANY (subquery)) */
  10325. /* Make an = ANY node */
  10326. SubLink *n = (SubLink *) $4;
  10327. n->subLinkType = ANY_SUBLINK;
  10328. n->testexpr = $1;
  10329. n->operName = list_make1(makeString("="));
  10330. n->location = @3;
  10331. /* Stick a NOT on top */
  10332. $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL, (Node *) n, @2);
  10333. }
  10334. else
  10335. {
  10336. /* generate scalar NOT IN expression */
  10337. $$ = (Node *) makeSimpleA_Expr(AEXPR_IN, "<>", $1, $4, @2);
  10338. }
  10339. }
  10340. | a_expr subquery_Op sub_type select_with_parens %prec Op
  10341. {
  10342. SubLink *n = makeNode(SubLink);
  10343. n->subLinkType = $3;
  10344. n->testexpr = $1;
  10345. n->operName = $2;
  10346. n->subselect = $4;
  10347. n->location = @2;
  10348. $$ = (Node *)n;
  10349. }
  10350. | a_expr subquery_Op sub_type '(' a_expr ')' %prec Op
  10351. {
  10352. if ($3 == ANY_SUBLINK)
  10353. $$ = (Node *) makeA_Expr(AEXPR_OP_ANY, $2, $1, $5, @2);
  10354. else
  10355. $$ = (Node *) makeA_Expr(AEXPR_OP_ALL, $2, $1, $5, @2);
  10356. }
  10357. | UNIQUE select_with_parens
  10358. {
  10359. /* Not sure how to get rid of the parentheses
  10360. * but there are lots of shift/reduce errors without them.
  10361. *
  10362. * Should be able to implement this by plopping the entire
  10363. * select into a node, then transforming the target expressions
  10364. * from whatever they are into count(*), and testing the
  10365. * entire result equal to one.
  10366. * But, will probably implement a separate node in the executor.
  10367. */
  10368. ereport(ERROR,
  10369. (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
  10370. errmsg("UNIQUE predicate is not yet implemented"),
  10371. parser_errposition(@1)));
  10372. }
  10373. | a_expr IS DOCUMENT_P %prec IS
  10374. {
  10375. $$ = makeXmlExpr(IS_DOCUMENT, NULL, NIL,
  10376. list_make1($1), @2);
  10377. }
  10378. | a_expr IS NOT DOCUMENT_P %prec IS
  10379. {
  10380. $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL,
  10381. makeXmlExpr(IS_DOCUMENT, NULL, NIL,
  10382. list_make1($1), @2),
  10383. @2);
  10384. }
  10385. ;
  10386. /*
  10387. * Restricted expressions
  10388. *
  10389. * b_expr is a subset of the complete expression syntax defined by a_expr.
  10390. *
  10391. * Presently, AND, NOT, IS, and IN are the a_expr keywords that would
  10392. * cause trouble in the places where b_expr is used. For simplicity, we
  10393. * just eliminate all the boolean-keyword-operator productions from b_expr.
  10394. */
  10395. b_expr: c_expr
  10396. { $$ = $1; }
  10397. | b_expr TYPECAST Typename
  10398. { $$ = makeTypeCast($1, $3, @2); }
  10399. | '+' b_expr %prec UMINUS
  10400. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2, @1); }
  10401. | '-' b_expr %prec UMINUS
  10402. { $$ = doNegate($2, @1); }
  10403. | b_expr '+' b_expr
  10404. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", $1, $3, @2); }
  10405. | b_expr '-' b_expr
  10406. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "-", $1, $3, @2); }
  10407. | b_expr '*' b_expr
  10408. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "*", $1, $3, @2); }
  10409. | b_expr '/' b_expr
  10410. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "/", $1, $3, @2); }
  10411. | b_expr '%' b_expr
  10412. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, $3, @2); }
  10413. | b_expr '^' b_expr
  10414. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, $3, @2); }
  10415. | b_expr '<' b_expr
  10416. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $3, @2); }
  10417. | b_expr '>' b_expr
  10418. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $3, @2); }
  10419. | b_expr '=' b_expr
  10420. { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "=", $1, $3, @2); }
  10421. | b_expr qual_Op b_expr %prec Op
  10422. { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, $3, @2); }
  10423. | qual_Op b_expr %prec Op
  10424. { $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2, @1); }
  10425. | b_expr qual_Op %prec POSTFIXOP
  10426. { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, NULL, @2); }
  10427. | b_expr IS DISTINCT FROM b_expr %prec IS
  10428. {
  10429. $$ = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $5, @2);
  10430. }
  10431. | b_expr IS NOT DISTINCT FROM b_expr %prec IS
  10432. {
  10433. $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL,
  10434. NULL, (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $6, @2), @2);
  10435. }
  10436. | b_expr IS OF '(' type_list ')' %prec IS
  10437. {
  10438. $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "=", $1, (Node *) $5, @2);
  10439. }
  10440. | b_expr IS NOT OF '(' type_list ')' %prec IS
  10441. {
  10442. $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "<>", $1, (Node *) $6, @2);
  10443. }
  10444. | b_expr IS DOCUMENT_P %prec IS
  10445. {
  10446. $$ = makeXmlExpr(IS_DOCUMENT, NULL, NIL,
  10447. list_make1($1), @2);
  10448. }
  10449. | b_expr IS NOT DOCUMENT_P %prec IS
  10450. {
  10451. $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL,
  10452. makeXmlExpr(IS_DOCUMENT, NULL, NIL,
  10453. list_make1($1), @2),
  10454. @2);
  10455. }
  10456. ;
  10457. /*
  10458. * Productions that can be used in both a_expr and b_expr.
  10459. *
  10460. * Note: productions that refer recursively to a_expr or b_expr mostly
  10461. * cannot appear here. However, it's OK to refer to a_exprs that occur
  10462. * inside parentheses, such as function arguments; that cannot introduce
  10463. * ambiguity to the b_expr syntax.
  10464. */
  10465. c_expr: columnref { $$ = $1; }
  10466. | AexprConst { $$ = $1; }
  10467. | PARAM opt_indirection
  10468. {
  10469. ParamRef *p = makeNode(ParamRef);
  10470. p->number = $1;
  10471. p->location = @1;
  10472. if ($2)
  10473. {
  10474. A_Indirection *n = makeNode(A_Indirection);
  10475. n->arg = (Node *) p;
  10476. n->indirection = check_indirection($2, yyscanner);
  10477. $$ = (Node *) n;
  10478. }
  10479. else
  10480. $$ = (Node *) p;
  10481. }
  10482. | '(' a_expr ')' opt_indirection
  10483. {
  10484. if ($4)
  10485. {
  10486. A_Indirection *n = makeNode(A_Indirection);
  10487. n->arg = $2;
  10488. n->indirection = check_indirection($4, yyscanner);
  10489. $$ = (Node *)n;
  10490. }
  10491. else
  10492. $$ = $2;
  10493. }
  10494. | case_expr
  10495. { $$ = $1; }
  10496. | func_expr
  10497. { $$ = $1; }
  10498. | select_with_parens %prec UMINUS
  10499. {
  10500. SubLink *n = makeNode(SubLink);
  10501. n->subLinkType = EXPR_SUBLINK;
  10502. n->testexpr = NULL;
  10503. n->operName = NIL;
  10504. n->subselect = $1;
  10505. n->location = @1;
  10506. $$ = (Node *)n;
  10507. }
  10508. | select_with_parens indirection
  10509. {
  10510. /*
  10511. * Because the select_with_parens nonterminal is designed
  10512. * to "eat" as many levels of parens as possible, the
  10513. * '(' a_expr ')' opt_indirection production above will
  10514. * fail to match a sub-SELECT with indirection decoration;
  10515. * the sub-SELECT won't be regarded as an a_expr as long
  10516. * as there are parens around it. To support applying
  10517. * subscripting or field selection to a sub-SELECT result,
  10518. * we need this redundant-looking production.
  10519. */
  10520. SubLink *n = makeNode(SubLink);
  10521. A_Indirection *a = makeNode(A_Indirection);
  10522. n->subLinkType = EXPR_SUBLINK;
  10523. n->testexpr = NULL;
  10524. n->operName = NIL;
  10525. n->subselect = $1;
  10526. n->location = @1;
  10527. a->arg = (Node *)n;
  10528. a->indirection = check_indirection($2, yyscanner);
  10529. $$ = (Node *)a;
  10530. }
  10531. | EXISTS select_with_parens
  10532. {
  10533. SubLink *n = makeNode(SubLink);
  10534. n->subLinkType = EXISTS_SUBLINK;
  10535. n->testexpr = NULL;
  10536. n->operName = NIL;
  10537. n->subselect = $2;
  10538. n->location = @1;
  10539. $$ = (Node *)n;
  10540. }
  10541. | ARRAY select_with_parens
  10542. {
  10543. SubLink *n = makeNode(SubLink);
  10544. n->subLinkType = ARRAY_SUBLINK;
  10545. n->testexpr = NULL;
  10546. n->operName = NIL;
  10547. n->subselect = $2;
  10548. n->location = @1;
  10549. $$ = (Node *)n;
  10550. }
  10551. | ARRAY array_expr
  10552. {
  10553. A_ArrayExpr *n = (A_ArrayExpr *) $2;
  10554. Assert(IsA(n, A_ArrayExpr));
  10555. /* point outermost A_ArrayExpr to the ARRAY keyword */
  10556. n->location = @1;
  10557. $$ = (Node *)n;
  10558. }
  10559. | row
  10560. {
  10561. RowExpr *r = makeNode(RowExpr);
  10562. r->args = $1;
  10563. r->row_typeid = InvalidOid; /* not analyzed yet */
  10564. r->colnames = NIL; /* to be filled in during analysis */
  10565. r->location = @1;
  10566. $$ = (Node *)r;
  10567. }
  10568. ;
  10569. func_application: func_name '(' ')'
  10570. {
  10571. $$ = (Node *) makeFuncCall($1, NIL, @1);
  10572. }
  10573. | func_name '(' func_arg_list opt_sort_clause ')'
  10574. {
  10575. FuncCall *n = makeFuncCall($1, $3, @1);
  10576. n->agg_order = $4;
  10577. $$ = (Node *)n;
  10578. }
  10579. | func_name '(' VARIADIC func_arg_expr opt_sort_clause ')'
  10580. {
  10581. FuncCall *n = makeFuncCall($1, list_make1($4), @1);
  10582. n->func_variadic = TRUE;
  10583. n->agg_order = $5;
  10584. $$ = (Node *)n;
  10585. }
  10586. | func_name '(' func_arg_list ',' VARIADIC func_arg_expr opt_sort_clause ')'
  10587. {
  10588. FuncCall *n = makeFuncCall($1, lappend($3, $6), @1);
  10589. n->func_variadic = TRUE;
  10590. n->agg_order = $7;
  10591. $$ = (Node *)n;
  10592. }
  10593. | func_name '(' ALL func_arg_list opt_sort_clause ')'
  10594. {
  10595. FuncCall *n = makeFuncCall($1, $4, @1);
  10596. n->agg_order = $5;
  10597. /* Ideally we'd mark the FuncCall node to indicate
  10598. * "must be an aggregate", but there's no provision
  10599. * for that in FuncCall at the moment.
  10600. */
  10601. $$ = (Node *)n;
  10602. }
  10603. | func_name '(' DISTINCT func_arg_list opt_sort_clause ')'
  10604. {
  10605. FuncCall *n = makeFuncCall($1, $4, @1);
  10606. n->agg_order = $5;
  10607. n->agg_distinct = TRUE;
  10608. $$ = (Node *)n;
  10609. }
  10610. | func_name '(' '*' ')'
  10611. {
  10612. /*
  10613. * We consider AGGREGATE(*) to invoke a parameterless
  10614. * aggregate. This does the right thing for COUNT(*),
  10615. * and there are no other aggregates in SQL that accept
  10616. * '*' as parameter.
  10617. *
  10618. * The FuncCall node is also marked agg_star = true,
  10619. * so that later processing can detect what the argument
  10620. * really was.
  10621. */
  10622. FuncCall *n = makeFuncCall($1, NIL, @1);
  10623. n->agg_star = TRUE;
  10624. $$ = (Node *)n;
  10625. }
  10626. ;
  10627. /*
  10628. * func_expr and its cousin func_expr_windowless are split out from c_expr just
  10629. * so that we have classifications for "everything that is a function call or
  10630. * looks like one". This isn't very important, but it saves us having to
  10631. * document which variants are legal in places like "FROM function()" or the
  10632. * backwards-compatible functional-index syntax for CREATE INDEX.
  10633. * (Note that many of the special SQL functions wouldn't actually make any
  10634. * sense as functional index entries, but we ignore that consideration here.)
  10635. */
  10636. func_expr: func_application within_group_clause filter_clause over_clause
  10637. {
  10638. FuncCall *n = (FuncCall *) $1;
  10639. /*
  10640. * The order clause for WITHIN GROUP and the one for
  10641. * plain-aggregate ORDER BY share a field, so we have to
  10642. * check here that at most one is present. We also check
  10643. * for DISTINCT and VARIADIC here to give a better error
  10644. * location. Other consistency checks are deferred to
  10645. * parse analysis.
  10646. */
  10647. if ($2 != NIL)
  10648. {
  10649. if (n->agg_order != NIL)
  10650. ereport(ERROR,
  10651. (errcode(ERRCODE_SYNTAX_ERROR),
  10652. errmsg("cannot use multiple ORDER BY clauses with WITHIN GROUP"),
  10653. parser_errposition(@2)));
  10654. if (n->agg_distinct)
  10655. ereport(ERROR,
  10656. (errcode(ERRCODE_SYNTAX_ERROR),
  10657. errmsg("cannot use DISTINCT with WITHIN GROUP"),
  10658. parser_errposition(@2)));
  10659. if (n->func_variadic)
  10660. ereport(ERROR,
  10661. (errcode(ERRCODE_SYNTAX_ERROR),
  10662. errmsg("cannot use VARIADIC with WITHIN GROUP"),
  10663. parser_errposition(@2)));
  10664. n->agg_order = $2;
  10665. n->agg_within_group = TRUE;
  10666. }
  10667. n->agg_filter = $3;
  10668. n->over = $4;
  10669. $$ = (Node *) n;
  10670. }
  10671. | func_expr_common_subexpr
  10672. { $$ = $1; }
  10673. ;
  10674. /*
  10675. * As func_expr but does not accept WINDOW functions directly
  10676. * (but they can still be contained in arguments for functions etc).
  10677. * Use this when window expressions are not allowed, where needed to
  10678. * disambiguate the grammar (e.g. in CREATE INDEX).
  10679. */
  10680. func_expr_windowless:
  10681. func_application { $$ = $1; }
  10682. | func_expr_common_subexpr { $$ = $1; }
  10683. ;
  10684. /*
  10685. * Special expressions that are considered to be functions.
  10686. */
  10687. func_expr_common_subexpr:
  10688. COLLATION FOR '(' a_expr ')'
  10689. {
  10690. $$ = (Node *) makeFuncCall(SystemFuncName("pg_collation_for"),
  10691. list_make1($4),
  10692. @1);
  10693. }
  10694. | CURRENT_DATE
  10695. {
  10696. /*
  10697. * Translate as "'now'::text::date".
  10698. *
  10699. * We cannot use "'now'::date" because coerce_type() will
  10700. * immediately reduce that to a constant representing
  10701. * today's date. We need to delay the conversion until
  10702. * runtime, else the wrong things will happen when
  10703. * CURRENT_DATE is used in a column default value or rule.
  10704. *
  10705. * This could be simplified if we had a way to generate
  10706. * an expression tree representing runtime application
  10707. * of type-input conversion functions. (As of PG 7.3
  10708. * that is actually possible, but not clear that we want
  10709. * to rely on it.)
  10710. *
  10711. * The token location is attached to the run-time
  10712. * typecast, not to the Const, for the convenience of
  10713. * pg_stat_statements (which doesn't want these constructs
  10714. * to appear to be replaceable constants).
  10715. */
  10716. Node *n;
  10717. n = makeStringConstCast("now", -1, SystemTypeName("text"));
  10718. $$ = makeTypeCast(n, SystemTypeName("date"), @1);
  10719. }
  10720. | CURRENT_TIME
  10721. {
  10722. /*
  10723. * Translate as "'now'::text::timetz".
  10724. * See comments for CURRENT_DATE.
  10725. */
  10726. Node *n;
  10727. n = makeStringConstCast("now", -1, SystemTypeName("text"));
  10728. $$ = makeTypeCast(n, SystemTypeName("timetz"), @1);
  10729. }
  10730. | CURRENT_TIME '(' Iconst ')'
  10731. {
  10732. /*
  10733. * Translate as "'now'::text::timetz(n)".
  10734. * See comments for CURRENT_DATE.
  10735. */
  10736. Node *n;
  10737. TypeName *d;
  10738. n = makeStringConstCast("now", -1, SystemTypeName("text"));
  10739. d = SystemTypeName("timetz");
  10740. d->typmods = list_make1(makeIntConst($3, @3));
  10741. $$ = makeTypeCast(n, d, @1);
  10742. }
  10743. | CURRENT_TIMESTAMP
  10744. {
  10745. /*
  10746. * Translate as "now()", since we have a function that
  10747. * does exactly what is needed.
  10748. */
  10749. $$ = (Node *) makeFuncCall(SystemFuncName("now"), NIL, @1);
  10750. }
  10751. | CURRENT_TIMESTAMP '(' Iconst ')'
  10752. {
  10753. /*
  10754. * Translate as "'now'::text::timestamptz(n)".
  10755. * See comments for CURRENT_DATE.
  10756. */
  10757. Node *n;
  10758. TypeName *d;
  10759. n = makeStringConstCast("now", -1, SystemTypeName("text"));
  10760. d = SystemTypeName("timestamptz");
  10761. d->typmods = list_make1(makeIntConst($3, @3));
  10762. $$ = makeTypeCast(n, d, @1);
  10763. }
  10764. | LOCALTIME
  10765. {
  10766. /*
  10767. * Translate as "'now'::text::time".
  10768. * See comments for CURRENT_DATE.
  10769. */
  10770. Node *n;
  10771. n = makeStringConstCast("now", -1, SystemTypeName("text"));
  10772. $$ = makeTypeCast((Node *)n, SystemTypeName("time"), @1);
  10773. }
  10774. | LOCALTIME '(' Iconst ')'
  10775. {
  10776. /*
  10777. * Translate as "'now'::text::time(n)".
  10778. * See comments for CURRENT_DATE.
  10779. */
  10780. Node *n;
  10781. TypeName *d;
  10782. n = makeStringConstCast("now", -1, SystemTypeName("text"));
  10783. d = SystemTypeName("time");
  10784. d->typmods = list_make1(makeIntConst($3, @3));
  10785. $$ = makeTypeCast((Node *)n, d, @1);
  10786. }
  10787. | LOCALTIMESTAMP
  10788. {
  10789. /*
  10790. * Translate as "'now'::text::timestamp".
  10791. * See comments for CURRENT_DATE.
  10792. */
  10793. Node *n;
  10794. n = makeStringConstCast("now", -1, SystemTypeName("text"));
  10795. $$ = makeTypeCast(n, SystemTypeName("timestamp"), @1);
  10796. }
  10797. | LOCALTIMESTAMP '(' Iconst ')'
  10798. {
  10799. /*
  10800. * Translate as "'now'::text::timestamp(n)".
  10801. * See comments for CURRENT_DATE.
  10802. */
  10803. Node *n;
  10804. TypeName *d;
  10805. n = makeStringConstCast("now", -1, SystemTypeName("text"));
  10806. d = SystemTypeName("timestamp");
  10807. d->typmods = list_make1(makeIntConst($3, @3));
  10808. $$ = makeTypeCast(n, d, @1);
  10809. }
  10810. | CURRENT_ROLE
  10811. {
  10812. $$ = (Node *) makeFuncCall(SystemFuncName("current_user"), NIL, @1);
  10813. }
  10814. | CURRENT_USER
  10815. {
  10816. $$ = (Node *) makeFuncCall(SystemFuncName("current_user"), NIL, @1);
  10817. }
  10818. | SESSION_USER
  10819. {
  10820. $$ = (Node *) makeFuncCall(SystemFuncName("session_user"), NIL, @1);
  10821. }
  10822. | USER
  10823. {
  10824. $$ = (Node *) makeFuncCall(SystemFuncName("current_user"), NIL, @1);
  10825. }
  10826. | CURRENT_CATALOG
  10827. {
  10828. $$ = (Node *) makeFuncCall(SystemFuncName("current_database"), NIL, @1);
  10829. }
  10830. | CURRENT_SCHEMA
  10831. {
  10832. $$ = (Node *) makeFuncCall(SystemFuncName("current_schema"), NIL, @1);
  10833. }
  10834. | CAST '(' a_expr AS Typename ')'
  10835. { $$ = makeTypeCast($3, $5, @1); }
  10836. | EXTRACT '(' extract_list ')'
  10837. {
  10838. $$ = (Node *) makeFuncCall(SystemFuncName("date_part"), $3, @1);
  10839. }
  10840. | OVERLAY '(' overlay_list ')'
  10841. {
  10842. /* overlay(A PLACING B FROM C FOR D) is converted to
  10843. * overlay(A, B, C, D)
  10844. * overlay(A PLACING B FROM C) is converted to
  10845. * overlay(A, B, C)
  10846. */
  10847. $$ = (Node *) makeFuncCall(SystemFuncName("overlay"), $3, @1);
  10848. }
  10849. | POSITION '(' position_list ')'
  10850. {
  10851. /* position(A in B) is converted to position(B, A) */
  10852. $$ = (Node *) makeFuncCall(SystemFuncName("position"), $3, @1);
  10853. }
  10854. | SUBSTRING '(' substr_list ')'
  10855. {
  10856. /* substring(A from B for C) is converted to
  10857. * substring(A, B, C) - thomas 2000-11-28
  10858. */
  10859. $$ = (Node *) makeFuncCall(SystemFuncName("substring"), $3, @1);
  10860. }
  10861. | TREAT '(' a_expr AS Typename ')'
  10862. {
  10863. /* TREAT(expr AS target) converts expr of a particular type to target,
  10864. * which is defined to be a subtype of the original expression.
  10865. * In SQL99, this is intended for use with structured UDTs,
  10866. * but let's make this a generally useful form allowing stronger
  10867. * coercions than are handled by implicit casting.
  10868. *
  10869. * Convert SystemTypeName() to SystemFuncName() even though
  10870. * at the moment they result in the same thing.
  10871. */
  10872. $$ = (Node *) makeFuncCall(SystemFuncName(((Value *)llast($5->names))->val.str),
  10873. list_make1($3),
  10874. @1);
  10875. }
  10876. | TRIM '(' BOTH trim_list ')'
  10877. {
  10878. /* various trim expressions are defined in SQL
  10879. * - thomas 1997-07-19
  10880. */
  10881. $$ = (Node *) makeFuncCall(SystemFuncName("btrim"), $4, @1);
  10882. }
  10883. | TRIM '(' LEADING trim_list ')'
  10884. {
  10885. $$ = (Node *) makeFuncCall(SystemFuncName("ltrim"), $4, @1);
  10886. }
  10887. | TRIM '(' TRAILING trim_list ')'
  10888. {
  10889. $$ = (Node *) makeFuncCall(SystemFuncName("rtrim"), $4, @1);
  10890. }
  10891. | TRIM '(' trim_list ')'
  10892. {
  10893. $$ = (Node *) makeFuncCall(SystemFuncName("btrim"), $3, @1);
  10894. }
  10895. | NULLIF '(' a_expr ',' a_expr ')'
  10896. {
  10897. $$ = (Node *) makeSimpleA_Expr(AEXPR_NULLIF, "=", $3, $5, @1);
  10898. }
  10899. | COALESCE '(' expr_list ')'
  10900. {
  10901. CoalesceExpr *c = makeNode(CoalesceExpr);
  10902. c->args = $3;
  10903. c->location = @1;
  10904. $$ = (Node *)c;
  10905. }
  10906. | GREATEST '(' expr_list ')'
  10907. {
  10908. MinMaxExpr *v = makeNode(MinMaxExpr);
  10909. v->args = $3;
  10910. v->op = IS_GREATEST;
  10911. v->location = @1;
  10912. $$ = (Node *)v;
  10913. }
  10914. | LEAST '(' expr_list ')'
  10915. {
  10916. MinMaxExpr *v = makeNode(MinMaxExpr);
  10917. v->args = $3;
  10918. v->op = IS_LEAST;
  10919. v->location = @1;
  10920. $$ = (Node *)v;
  10921. }
  10922. | XMLCONCAT '(' expr_list ')'
  10923. {
  10924. $$ = makeXmlExpr(IS_XMLCONCAT, NULL, NIL, $3, @1);
  10925. }
  10926. | XMLELEMENT '(' NAME_P ColLabel ')'
  10927. {
  10928. $$ = makeXmlExpr(IS_XMLELEMENT, $4, NIL, NIL, @1);
  10929. }
  10930. | XMLELEMENT '(' NAME_P ColLabel ',' xml_attributes ')'
  10931. {
  10932. $$ = makeXmlExpr(IS_XMLELEMENT, $4, $6, NIL, @1);
  10933. }
  10934. | XMLELEMENT '(' NAME_P ColLabel ',' expr_list ')'
  10935. {
  10936. $$ = makeXmlExpr(IS_XMLELEMENT, $4, NIL, $6, @1);
  10937. }
  10938. | XMLELEMENT '(' NAME_P ColLabel ',' xml_attributes ',' expr_list ')'
  10939. {
  10940. $$ = makeXmlExpr(IS_XMLELEMENT, $4, $6, $8, @1);
  10941. }
  10942. | XMLEXISTS '(' c_expr xmlexists_argument ')'
  10943. {
  10944. /* xmlexists(A PASSING [BY REF] B [BY REF]) is
  10945. * converted to xmlexists(A, B)*/
  10946. $$ = (Node *) makeFuncCall(SystemFuncName("xmlexists"), list_make2($3, $4), @1);
  10947. }
  10948. | XMLFOREST '(' xml_attribute_list ')'
  10949. {
  10950. $$ = makeXmlExpr(IS_XMLFOREST, NULL, $3, NIL, @1);
  10951. }
  10952. | XMLPARSE '(' document_or_content a_expr xml_whitespace_option ')'
  10953. {
  10954. XmlExpr *x = (XmlExpr *)
  10955. makeXmlExpr(IS_XMLPARSE, NULL, NIL,
  10956. list_make2($4, makeBoolAConst($5, -1)),
  10957. @1);
  10958. x->xmloption = $3;
  10959. $$ = (Node *)x;
  10960. }
  10961. | XMLPI '(' NAME_P ColLabel ')'
  10962. {
  10963. $$ = makeXmlExpr(IS_XMLPI, $4, NULL, NIL, @1);
  10964. }
  10965. | XMLPI '(' NAME_P ColLabel ',' a_expr ')'
  10966. {
  10967. $$ = makeXmlExpr(IS_XMLPI, $4, NULL, list_make1($6), @1);
  10968. }
  10969. | XMLROOT '(' a_expr ',' xml_root_version opt_xml_root_standalone ')'
  10970. {
  10971. $$ = makeXmlExpr(IS_XMLROOT, NULL, NIL,
  10972. list_make3($3, $5, $6), @1);
  10973. }
  10974. | XMLSERIALIZE '(' document_or_content a_expr AS SimpleTypename ')'
  10975. {
  10976. XmlSerialize *n = makeNode(XmlSerialize);
  10977. n->xmloption = $3;
  10978. n->expr = $4;
  10979. n->typeName = $6;
  10980. n->location = @1;
  10981. $$ = (Node *)n;
  10982. }
  10983. ;
  10984. /*
  10985. * SQL/XML support
  10986. */
  10987. xml_root_version: VERSION_P a_expr
  10988. { $$ = $2; }
  10989. | VERSION_P NO VALUE_P
  10990. { $$ = makeNullAConst(-1); }
  10991. ;
  10992. opt_xml_root_standalone: ',' STANDALONE_P YES_P
  10993. { $$ = makeIntConst(XML_STANDALONE_YES, -1); }
  10994. | ',' STANDALONE_P NO
  10995. { $$ = makeIntConst(XML_STANDALONE_NO, -1); }
  10996. | ',' STANDALONE_P NO VALUE_P
  10997. { $$ = makeIntConst(XML_STANDALONE_NO_VALUE, -1); }
  10998. | /*EMPTY*/
  10999. { $$ = makeIntConst(XML_STANDALONE_OMITTED, -1); }
  11000. ;
  11001. xml_attributes: XMLATTRIBUTES '(' xml_attribute_list ')' { $$ = $3; }
  11002. ;
  11003. xml_attribute_list: xml_attribute_el { $$ = list_make1($1); }
  11004. | xml_attribute_list ',' xml_attribute_el { $$ = lappend($1, $3); }
  11005. ;
  11006. xml_attribute_el: a_expr AS ColLabel
  11007. {
  11008. $$ = makeNode(ResTarget);
  11009. $$->name = $3;
  11010. $$->indirection = NIL;
  11011. $$->val = (Node *) $1;
  11012. $$->location = @1;
  11013. }
  11014. | a_expr
  11015. {
  11016. $$ = makeNode(ResTarget);
  11017. $$->name = NULL;
  11018. $$->indirection = NIL;
  11019. $$->val = (Node *) $1;
  11020. $$->location = @1;
  11021. }
  11022. ;
  11023. document_or_content: DOCUMENT_P { $$ = XMLOPTION_DOCUMENT; }
  11024. | CONTENT_P { $$ = XMLOPTION_CONTENT; }
  11025. ;
  11026. xml_whitespace_option: PRESERVE WHITESPACE_P { $$ = TRUE; }
  11027. | STRIP_P WHITESPACE_P { $$ = FALSE; }
  11028. | /*EMPTY*/ { $$ = FALSE; }
  11029. ;
  11030. /* We allow several variants for SQL and other compatibility. */
  11031. xmlexists_argument:
  11032. PASSING c_expr
  11033. {
  11034. $$ = $2;
  11035. }
  11036. | PASSING c_expr BY REF
  11037. {
  11038. $$ = $2;
  11039. }
  11040. | PASSING BY REF c_expr
  11041. {
  11042. $$ = $4;
  11043. }
  11044. | PASSING BY REF c_expr BY REF
  11045. {
  11046. $$ = $4;
  11047. }
  11048. ;
  11049. /*
  11050. * Aggregate decoration clauses
  11051. */
  11052. within_group_clause:
  11053. WITHIN GROUP_P '(' sort_clause ')' { $$ = $4; }
  11054. | /*EMPTY*/ { $$ = NIL; }
  11055. ;
  11056. filter_clause:
  11057. FILTER '(' WHERE a_expr ')' { $$ = $4; }
  11058. | /*EMPTY*/ { $$ = NULL; }
  11059. ;
  11060. /*
  11061. * Window Definitions
  11062. */
  11063. window_clause:
  11064. WINDOW window_definition_list { $$ = $2; }
  11065. | /*EMPTY*/ { $$ = NIL; }
  11066. ;
  11067. window_definition_list:
  11068. window_definition { $$ = list_make1($1); }
  11069. | window_definition_list ',' window_definition
  11070. { $$ = lappend($1, $3); }
  11071. ;
  11072. window_definition:
  11073. ColId AS window_specification
  11074. {
  11075. WindowDef *n = $3;
  11076. n->name = $1;
  11077. $$ = n;
  11078. }
  11079. ;
  11080. over_clause: OVER window_specification
  11081. { $$ = $2; }
  11082. | OVER ColId
  11083. {
  11084. WindowDef *n = makeNode(WindowDef);
  11085. n->name = $2;
  11086. n->refname = NULL;
  11087. n->partitionClause = NIL;
  11088. n->orderClause = NIL;
  11089. n->frameOptions = FRAMEOPTION_DEFAULTS;
  11090. n->startOffset = NULL;
  11091. n->endOffset = NULL;
  11092. n->location = @2;
  11093. $$ = n;
  11094. }
  11095. | /*EMPTY*/
  11096. { $$ = NULL; }
  11097. ;
  11098. window_specification: '(' opt_existing_window_name opt_partition_clause
  11099. opt_sort_clause opt_frame_clause ')'
  11100. {
  11101. WindowDef *n = makeNode(WindowDef);
  11102. n->name = NULL;
  11103. n->refname = $2;
  11104. n->partitionClause = $3;
  11105. n->orderClause = $4;
  11106. /* copy relevant fields of opt_frame_clause */
  11107. n->frameOptions = $5->frameOptions;
  11108. n->startOffset = $5->startOffset;
  11109. n->endOffset = $5->endOffset;
  11110. n->location = @1;
  11111. $$ = n;
  11112. }
  11113. ;
  11114. /*
  11115. * If we see PARTITION, RANGE, or ROWS as the first token after the '('
  11116. * of a window_specification, we want the assumption to be that there is
  11117. * no existing_window_name; but those keywords are unreserved and so could
  11118. * be ColIds. We fix this by making them have the same precedence as IDENT
  11119. * and giving the empty production here a slightly higher precedence, so
  11120. * that the shift/reduce conflict is resolved in favor of reducing the rule.
  11121. * These keywords are thus precluded from being an existing_window_name but
  11122. * are not reserved for any other purpose.
  11123. */
  11124. opt_existing_window_name: ColId { $$ = $1; }
  11125. | /*EMPTY*/ %prec Op { $$ = NULL; }
  11126. ;
  11127. opt_partition_clause: PARTITION BY expr_list { $$ = $3; }
  11128. | /*EMPTY*/ { $$ = NIL; }
  11129. ;
  11130. /*
  11131. * For frame clauses, we return a WindowDef, but only some fields are used:
  11132. * frameOptions, startOffset, and endOffset.
  11133. *
  11134. * This is only a subset of the full SQL:2008 frame_clause grammar.
  11135. * We don't support <window frame exclusion> yet.
  11136. */
  11137. opt_frame_clause:
  11138. RANGE frame_extent
  11139. {
  11140. WindowDef *n = $2;
  11141. n->frameOptions |= FRAMEOPTION_NONDEFAULT | FRAMEOPTION_RANGE;
  11142. if (n->frameOptions & (FRAMEOPTION_START_VALUE_PRECEDING |
  11143. FRAMEOPTION_END_VALUE_PRECEDING))
  11144. ereport(ERROR,
  11145. (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
  11146. errmsg("RANGE PRECEDING is only supported with UNBOUNDED"),
  11147. parser_errposition(@1)));
  11148. if (n->frameOptions & (FRAMEOPTION_START_VALUE_FOLLOWING |
  11149. FRAMEOPTION_END_VALUE_FOLLOWING))
  11150. ereport(ERROR,
  11151. (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
  11152. errmsg("RANGE FOLLOWING is only supported with UNBOUNDED"),
  11153. parser_errposition(@1)));
  11154. $$ = n;
  11155. }
  11156. | ROWS frame_extent
  11157. {
  11158. WindowDef *n = $2;
  11159. n->frameOptions |= FRAMEOPTION_NONDEFAULT | FRAMEOPTION_ROWS;
  11160. $$ = n;
  11161. }
  11162. | /*EMPTY*/
  11163. {
  11164. WindowDef *n = makeNode(WindowDef);
  11165. n->frameOptions = FRAMEOPTION_DEFAULTS;
  11166. n->startOffset = NULL;
  11167. n->endOffset = NULL;
  11168. $$ = n;
  11169. }
  11170. ;
  11171. frame_extent: frame_bound
  11172. {
  11173. WindowDef *n = $1;
  11174. /* reject invalid cases */
  11175. if (n->frameOptions & FRAMEOPTION_START_UNBOUNDED_FOLLOWING)
  11176. ereport(ERROR,
  11177. (errcode(ERRCODE_WINDOWING_ERROR),
  11178. errmsg("frame start cannot be UNBOUNDED FOLLOWING"),
  11179. parser_errposition(@1)));
  11180. if (n->frameOptions & FRAMEOPTION_START_VALUE_FOLLOWING)
  11181. ereport(ERROR,
  11182. (errcode(ERRCODE_WINDOWING_ERROR),
  11183. errmsg("frame starting from following row cannot end with current row"),
  11184. parser_errposition(@1)));
  11185. n->frameOptions |= FRAMEOPTION_END_CURRENT_ROW;
  11186. $$ = n;
  11187. }
  11188. | BETWEEN frame_bound AND frame_bound
  11189. {
  11190. WindowDef *n1 = $2;
  11191. WindowDef *n2 = $4;
  11192. /* form merged options */
  11193. int frameOptions = n1->frameOptions;
  11194. /* shift converts START_ options to END_ options */
  11195. frameOptions |= n2->frameOptions << 1;
  11196. frameOptions |= FRAMEOPTION_BETWEEN;
  11197. /* reject invalid cases */
  11198. if (frameOptions & FRAMEOPTION_START_UNBOUNDED_FOLLOWING)
  11199. ereport(ERROR,
  11200. (errcode(ERRCODE_WINDOWING_ERROR),
  11201. errmsg("frame start cannot be UNBOUNDED FOLLOWING"),
  11202. parser_errposition(@2)));
  11203. if (frameOptions & FRAMEOPTION_END_UNBOUNDED_PRECEDING)
  11204. ereport(ERROR,
  11205. (errcode(ERRCODE_WINDOWING_ERROR),
  11206. errmsg("frame end cannot be UNBOUNDED PRECEDING"),
  11207. parser_errposition(@4)));
  11208. if ((frameOptions & FRAMEOPTION_START_CURRENT_ROW) &&
  11209. (frameOptions & FRAMEOPTION_END_VALUE_PRECEDING))
  11210. ereport(ERROR,
  11211. (errcode(ERRCODE_WINDOWING_ERROR),
  11212. errmsg("frame starting from current row cannot have preceding rows"),
  11213. parser_errposition(@4)));
  11214. if ((frameOptions & FRAMEOPTION_START_VALUE_FOLLOWING) &&
  11215. (frameOptions & (FRAMEOPTION_END_VALUE_PRECEDING |
  11216. FRAMEOPTION_END_CURRENT_ROW)))
  11217. ereport(ERROR,
  11218. (errcode(ERRCODE_WINDOWING_ERROR),
  11219. errmsg("frame starting from following row cannot have preceding rows"),
  11220. parser_errposition(@4)));
  11221. n1->frameOptions = frameOptions;
  11222. n1->endOffset = n2->startOffset;
  11223. $$ = n1;
  11224. }
  11225. ;
  11226. /*
  11227. * This is used for both frame start and frame end, with output set up on
  11228. * the assumption it's frame start; the frame_extent productions must reject
  11229. * invalid cases.
  11230. */
  11231. frame_bound:
  11232. UNBOUNDED PRECEDING
  11233. {
  11234. WindowDef *n = makeNode(WindowDef);
  11235. n->frameOptions = FRAMEOPTION_START_UNBOUNDED_PRECEDING;
  11236. n->startOffset = NULL;
  11237. n->endOffset = NULL;
  11238. $$ = n;
  11239. }
  11240. | UNBOUNDED FOLLOWING
  11241. {
  11242. WindowDef *n = makeNode(WindowDef);
  11243. n->frameOptions = FRAMEOPTION_START_UNBOUNDED_FOLLOWING;
  11244. n->startOffset = NULL;
  11245. n->endOffset = NULL;
  11246. $$ = n;
  11247. }
  11248. | CURRENT_P ROW
  11249. {
  11250. WindowDef *n = makeNode(WindowDef);
  11251. n->frameOptions = FRAMEOPTION_START_CURRENT_ROW;
  11252. n->startOffset = NULL;
  11253. n->endOffset = NULL;
  11254. $$ = n;
  11255. }
  11256. | a_expr PRECEDING
  11257. {
  11258. WindowDef *n = makeNode(WindowDef);
  11259. n->frameOptions = FRAMEOPTION_START_VALUE_PRECEDING;
  11260. n->startOffset = $1;
  11261. n->endOffset = NULL;
  11262. $$ = n;
  11263. }
  11264. | a_expr FOLLOWING
  11265. {
  11266. WindowDef *n = makeNode(WindowDef);
  11267. n->frameOptions = FRAMEOPTION_START_VALUE_FOLLOWING;
  11268. n->startOffset = $1;
  11269. n->endOffset = NULL;
  11270. $$ = n;
  11271. }
  11272. ;
  11273. /*
  11274. * Supporting nonterminals for expressions.
  11275. */
  11276. /* Explicit row production.
  11277. *
  11278. * SQL99 allows an optional ROW keyword, so we can now do single-element rows
  11279. * without conflicting with the parenthesized a_expr production. Without the
  11280. * ROW keyword, there must be more than one a_expr inside the parens.
  11281. */
  11282. row: ROW '(' expr_list ')' { $$ = $3; }
  11283. | ROW '(' ')' { $$ = NIL; }
  11284. | '(' expr_list ',' a_expr ')' { $$ = lappend($2, $4); }
  11285. ;
  11286. sub_type: ANY { $$ = ANY_SUBLINK; }
  11287. | SOME { $$ = ANY_SUBLINK; }
  11288. | ALL { $$ = ALL_SUBLINK; }
  11289. ;
  11290. all_Op: Op { $$ = $1; }
  11291. | MathOp { $$ = $1; }
  11292. ;
  11293. MathOp: '+' { $$ = "+"; }
  11294. | '-' { $$ = "-"; }
  11295. | '*' { $$ = "*"; }
  11296. | '/' { $$ = "/"; }
  11297. | '%' { $$ = "%"; }
  11298. | '^' { $$ = "^"; }
  11299. | '<' { $$ = "<"; }
  11300. | '>' { $$ = ">"; }
  11301. | '=' { $$ = "="; }
  11302. ;
  11303. qual_Op: Op
  11304. { $$ = list_make1(makeString($1)); }
  11305. | OPERATOR '(' any_operator ')'
  11306. { $$ = $3; }
  11307. ;
  11308. qual_all_Op:
  11309. all_Op
  11310. { $$ = list_make1(makeString($1)); }
  11311. | OPERATOR '(' any_operator ')'
  11312. { $$ = $3; }
  11313. ;
  11314. subquery_Op:
  11315. all_Op
  11316. { $$ = list_make1(makeString($1)); }
  11317. | OPERATOR '(' any_operator ')'
  11318. { $$ = $3; }
  11319. | LIKE
  11320. { $$ = list_make1(makeString("~~")); }
  11321. | NOT LIKE
  11322. { $$ = list_make1(makeString("!~~")); }
  11323. | ILIKE
  11324. { $$ = list_make1(makeString("~~*")); }
  11325. | NOT ILIKE
  11326. { $$ = list_make1(makeString("!~~*")); }
  11327. /* cannot put SIMILAR TO here, because SIMILAR TO is a hack.
  11328. * the regular expression is preprocessed by a function (similar_escape),
  11329. * and the ~ operator for posix regular expressions is used.
  11330. * x SIMILAR TO y -> x ~ similar_escape(y)
  11331. * this transformation is made on the fly by the parser upwards.
  11332. * however the SubLink structure which handles any/some/all stuff
  11333. * is not ready for such a thing.
  11334. */
  11335. ;
  11336. expr_list: a_expr
  11337. {
  11338. $$ = list_make1($1);
  11339. }
  11340. | expr_list ',' a_expr
  11341. {
  11342. $$ = lappend($1, $3);
  11343. }
  11344. ;
  11345. /* function arguments can have names */
  11346. func_arg_list: func_arg_expr
  11347. {
  11348. $$ = list_make1($1);
  11349. }
  11350. | func_arg_list ',' func_arg_expr
  11351. {
  11352. $$ = lappend($1, $3);
  11353. }
  11354. ;
  11355. func_arg_expr: a_expr
  11356. {
  11357. $$ = $1;
  11358. }
  11359. | param_name COLON_EQUALS a_expr
  11360. {
  11361. NamedArgExpr *na = makeNode(NamedArgExpr);
  11362. na->name = $1;
  11363. na->arg = (Expr *) $3;
  11364. na->argnumber = -1; /* until determined */
  11365. na->location = @1;
  11366. $$ = (Node *) na;
  11367. }
  11368. ;
  11369. type_list: Typename { $$ = list_make1($1); }
  11370. | type_list ',' Typename { $$ = lappend($1, $3); }
  11371. ;
  11372. array_expr: '[' expr_list ']'
  11373. {
  11374. $$ = makeAArrayExpr($2, @1);
  11375. }
  11376. | '[' array_expr_list ']'
  11377. {
  11378. $$ = makeAArrayExpr($2, @1);
  11379. }
  11380. | '[' ']'
  11381. {
  11382. $$ = makeAArrayExpr(NIL, @1);
  11383. }
  11384. ;
  11385. array_expr_list: array_expr { $$ = list_make1($1); }
  11386. | array_expr_list ',' array_expr { $$ = lappend($1, $3); }
  11387. ;
  11388. extract_list:
  11389. extract_arg FROM a_expr
  11390. {
  11391. $$ = list_make2(makeStringConst($1, @1), $3);
  11392. }
  11393. | /*EMPTY*/ { $$ = NIL; }
  11394. ;
  11395. /* Allow delimited string Sconst in extract_arg as an SQL extension.
  11396. * - thomas 2001-04-12
  11397. */
  11398. extract_arg:
  11399. IDENT { $$ = $1; }
  11400. | YEAR_P { $$ = "year"; }
  11401. | MONTH_P { $$ = "month"; }
  11402. | DAY_P { $$ = "day"; }
  11403. | HOUR_P { $$ = "hour"; }
  11404. | MINUTE_P { $$ = "minute"; }
  11405. | SECOND_P { $$ = "second"; }
  11406. | Sconst { $$ = $1; }
  11407. ;
  11408. /* OVERLAY() arguments
  11409. * SQL99 defines the OVERLAY() function:
  11410. * o overlay(text placing text from int for int)
  11411. * o overlay(text placing text from int)
  11412. * and similarly for binary strings
  11413. */
  11414. overlay_list:
  11415. a_expr overlay_placing substr_from substr_for
  11416. {
  11417. $$ = list_make4($1, $2, $3, $4);
  11418. }
  11419. | a_expr overlay_placing substr_from
  11420. {
  11421. $$ = list_make3($1, $2, $3);
  11422. }
  11423. ;
  11424. overlay_placing:
  11425. PLACING a_expr
  11426. { $$ = $2; }
  11427. ;
  11428. /* position_list uses b_expr not a_expr to avoid conflict with general IN */
  11429. position_list:
  11430. b_expr IN_P b_expr { $$ = list_make2($3, $1); }
  11431. | /*EMPTY*/ { $$ = NIL; }
  11432. ;
  11433. /* SUBSTRING() arguments
  11434. * SQL9x defines a specific syntax for arguments to SUBSTRING():
  11435. * o substring(text from int for int)
  11436. * o substring(text from int) get entire string from starting point "int"
  11437. * o substring(text for int) get first "int" characters of string
  11438. * o substring(text from pattern) get entire string matching pattern
  11439. * o substring(text from pattern for escape) same with specified escape char
  11440. * We also want to support generic substring functions which accept
  11441. * the usual generic list of arguments. So we will accept both styles
  11442. * here, and convert the SQL9x style to the generic list for further
  11443. * processing. - thomas 2000-11-28
  11444. */
  11445. substr_list:
  11446. a_expr substr_from substr_for
  11447. {
  11448. $$ = list_make3($1, $2, $3);
  11449. }
  11450. | a_expr substr_for substr_from
  11451. {
  11452. /* not legal per SQL99, but might as well allow it */
  11453. $$ = list_make3($1, $3, $2);
  11454. }
  11455. | a_expr substr_from
  11456. {
  11457. $$ = list_make2($1, $2);
  11458. }
  11459. | a_expr substr_for
  11460. {
  11461. /*
  11462. * Since there are no cases where this syntax allows
  11463. * a textual FOR value, we forcibly cast the argument
  11464. * to int4. The possible matches in pg_proc are
  11465. * substring(text,int4) and substring(text,text),
  11466. * and we don't want the parser to choose the latter,
  11467. * which it is likely to do if the second argument
  11468. * is unknown or doesn't have an implicit cast to int4.
  11469. */
  11470. $$ = list_make3($1, makeIntConst(1, -1),
  11471. makeTypeCast($2,
  11472. SystemTypeName("int4"), -1));
  11473. }
  11474. | expr_list
  11475. {
  11476. $$ = $1;
  11477. }
  11478. | /*EMPTY*/
  11479. { $$ = NIL; }
  11480. ;
  11481. substr_from:
  11482. FROM a_expr { $$ = $2; }
  11483. ;
  11484. substr_for: FOR a_expr { $$ = $2; }
  11485. ;
  11486. trim_list: a_expr FROM expr_list { $$ = lappend($3, $1); }
  11487. | FROM expr_list { $$ = $2; }
  11488. | expr_list { $$ = $1; }
  11489. ;
  11490. in_expr: select_with_parens
  11491. {
  11492. SubLink *n = makeNode(SubLink);
  11493. n->subselect = $1;
  11494. /* other fields will be filled later */
  11495. $$ = (Node *)n;
  11496. }
  11497. | '(' expr_list ')' { $$ = (Node *)$2; }
  11498. ;
  11499. /*
  11500. * Define SQL-style CASE clause.
  11501. * - Full specification
  11502. * CASE WHEN a = b THEN c ... ELSE d END
  11503. * - Implicit argument
  11504. * CASE a WHEN b THEN c ... ELSE d END
  11505. */
  11506. case_expr: CASE case_arg when_clause_list case_default END_P
  11507. {
  11508. CaseExpr *c = makeNode(CaseExpr);
  11509. c->casetype = InvalidOid; /* not analyzed yet */
  11510. c->arg = (Expr *) $2;
  11511. c->args = $3;
  11512. c->defresult = (Expr *) $4;
  11513. c->location = @1;
  11514. $$ = (Node *)c;
  11515. }
  11516. ;
  11517. when_clause_list:
  11518. /* There must be at least one */
  11519. when_clause { $$ = list_make1($1); }
  11520. | when_clause_list when_clause { $$ = lappend($1, $2); }
  11521. ;
  11522. when_clause:
  11523. WHEN a_expr THEN a_expr
  11524. {
  11525. CaseWhen *w = makeNode(CaseWhen);
  11526. w->expr = (Expr *) $2;
  11527. w->result = (Expr *) $4;
  11528. w->location = @1;
  11529. $$ = (Node *)w;
  11530. }
  11531. ;
  11532. case_default:
  11533. ELSE a_expr { $$ = $2; }
  11534. | /*EMPTY*/ { $$ = NULL; }
  11535. ;
  11536. case_arg: a_expr { $$ = $1; }
  11537. | /*EMPTY*/ { $$ = NULL; }
  11538. ;
  11539. columnref: ColId
  11540. {
  11541. $$ = makeColumnRef($1, NIL, @1, yyscanner);
  11542. }
  11543. | ColId indirection
  11544. {
  11545. $$ = makeColumnRef($1, $2, @1, yyscanner);
  11546. }
  11547. ;
  11548. indirection_el:
  11549. '.' attr_name
  11550. {
  11551. $$ = (Node *) makeString($2);
  11552. }
  11553. | '.' '*'
  11554. {
  11555. $$ = (Node *) makeNode(A_Star);
  11556. }
  11557. | '[' a_expr ']'
  11558. {
  11559. A_Indices *ai = makeNode(A_Indices);
  11560. ai->lidx = NULL;
  11561. ai->uidx = $2;
  11562. $$ = (Node *) ai;
  11563. }
  11564. | '[' a_expr ':' a_expr ']'
  11565. {
  11566. A_Indices *ai = makeNode(A_Indices);
  11567. ai->lidx = $2;
  11568. ai->uidx = $4;
  11569. $$ = (Node *) ai;
  11570. }
  11571. ;
  11572. indirection:
  11573. indirection_el { $$ = list_make1($1); }
  11574. | indirection indirection_el { $$ = lappend($1, $2); }
  11575. ;
  11576. opt_indirection:
  11577. /*EMPTY*/ { $$ = NIL; }
  11578. | opt_indirection indirection_el { $$ = lappend($1, $2); }
  11579. ;
  11580. opt_asymmetric: ASYMMETRIC
  11581. | /*EMPTY*/
  11582. ;
  11583. /*
  11584. * The SQL spec defines "contextually typed value expressions" and
  11585. * "contextually typed row value constructors", which for our purposes
  11586. * are the same as "a_expr" and "row" except that DEFAULT can appear at
  11587. * the top level.
  11588. */
  11589. ctext_expr:
  11590. a_expr { $$ = (Node *) $1; }
  11591. | DEFAULT
  11592. {
  11593. SetToDefault *n = makeNode(SetToDefault);
  11594. n->location = @1;
  11595. $$ = (Node *) n;
  11596. }
  11597. ;
  11598. ctext_expr_list:
  11599. ctext_expr { $$ = list_make1($1); }
  11600. | ctext_expr_list ',' ctext_expr { $$ = lappend($1, $3); }
  11601. ;
  11602. /*
  11603. * We should allow ROW '(' ctext_expr_list ')' too, but that seems to require
  11604. * making VALUES a fully reserved word, which will probably break more apps
  11605. * than allowing the noise-word is worth.
  11606. */
  11607. ctext_row: '(' ctext_expr_list ')' { $$ = $2; }
  11608. ;
  11609. /*****************************************************************************
  11610. *
  11611. * target list for SELECT
  11612. *
  11613. *****************************************************************************/
  11614. opt_target_list: target_list { $$ = $1; }
  11615. | /* EMPTY */ { $$ = NIL; }
  11616. ;
  11617. target_list:
  11618. target_el { $$ = list_make1($1); }
  11619. | target_list ',' target_el { $$ = lappend($1, $3); }
  11620. ;
  11621. target_el: a_expr AS ColLabel
  11622. {
  11623. $$ = makeNode(ResTarget);
  11624. $$->name = $3;
  11625. $$->indirection = NIL;
  11626. $$->val = (Node *)$1;
  11627. $$->location = @1;
  11628. }
  11629. /*
  11630. * We support omitting AS only for column labels that aren't
  11631. * any known keyword. There is an ambiguity against postfix
  11632. * operators: is "a ! b" an infix expression, or a postfix
  11633. * expression and a column label? We prefer to resolve this
  11634. * as an infix expression, which we accomplish by assigning
  11635. * IDENT a precedence higher than POSTFIXOP.
  11636. */
  11637. | a_expr IDENT
  11638. {
  11639. $$ = makeNode(ResTarget);
  11640. $$->name = $2;
  11641. $$->indirection = NIL;
  11642. $$->val = (Node *)$1;
  11643. $$->location = @1;
  11644. }
  11645. | a_expr
  11646. {
  11647. $$ = makeNode(ResTarget);
  11648. $$->name = NULL;
  11649. $$->indirection = NIL;
  11650. $$->val = (Node *)$1;
  11651. $$->location = @1;
  11652. }
  11653. | '*'
  11654. {
  11655. ColumnRef *n = makeNode(ColumnRef);
  11656. n->fields = list_make1(makeNode(A_Star));
  11657. n->location = @1;
  11658. $$ = makeNode(ResTarget);
  11659. $$->name = NULL;
  11660. $$->indirection = NIL;
  11661. $$->val = (Node *)n;
  11662. $$->location = @1;
  11663. }
  11664. ;
  11665. /*****************************************************************************
  11666. *
  11667. * Names and constants
  11668. *
  11669. *****************************************************************************/
  11670. qualified_name_list:
  11671. qualified_name { $$ = list_make1($1); }
  11672. | qualified_name_list ',' qualified_name { $$ = lappend($1, $3); }
  11673. ;
  11674. /*
  11675. * The production for a qualified relation name has to exactly match the
  11676. * production for a qualified func_name, because in a FROM clause we cannot
  11677. * tell which we are parsing until we see what comes after it ('(' for a
  11678. * func_name, something else for a relation). Therefore we allow 'indirection'
  11679. * which may contain subscripts, and reject that case in the C code.
  11680. */
  11681. qualified_name:
  11682. ColId
  11683. {
  11684. $$ = makeRangeVar(NULL, $1, @1);
  11685. }
  11686. | ColId indirection
  11687. {
  11688. check_qualified_name($2, yyscanner);
  11689. $$ = makeRangeVar(NULL, NULL, @1);
  11690. switch (list_length($2))
  11691. {
  11692. case 1:
  11693. $$->catalogname = NULL;
  11694. $$->schemaname = $1;
  11695. $$->relname = strVal(linitial($2));
  11696. break;
  11697. case 2:
  11698. $$->catalogname = $1;
  11699. $$->schemaname = strVal(linitial($2));
  11700. $$->relname = strVal(lsecond($2));
  11701. break;
  11702. default:
  11703. ereport(ERROR,
  11704. (errcode(ERRCODE_SYNTAX_ERROR),
  11705. errmsg("improper qualified name (too many dotted names): %s",
  11706. NameListToString(lcons(makeString($1), $2))),
  11707. parser_errposition(@1)));
  11708. break;
  11709. }
  11710. }
  11711. ;
  11712. name_list: name
  11713. { $$ = list_make1(makeString($1)); }
  11714. | name_list ',' name
  11715. { $$ = lappend($1, makeString($3)); }
  11716. ;
  11717. name: ColId { $$ = $1; };
  11718. database_name:
  11719. ColId { $$ = $1; };
  11720. access_method:
  11721. ColId { $$ = $1; };
  11722. attr_name: ColLabel { $$ = $1; };
  11723. index_name: ColId { $$ = $1; };
  11724. file_name: Sconst { $$ = $1; };
  11725. /*
  11726. * The production for a qualified func_name has to exactly match the
  11727. * production for a qualified columnref, because we cannot tell which we
  11728. * are parsing until we see what comes after it ('(' or Sconst for a func_name,
  11729. * anything else for a columnref). Therefore we allow 'indirection' which
  11730. * may contain subscripts, and reject that case in the C code. (If we
  11731. * ever implement SQL99-like methods, such syntax may actually become legal!)
  11732. */
  11733. func_name: type_function_name
  11734. { $$ = list_make1(makeString($1)); }
  11735. | ColId indirection
  11736. {
  11737. $$ = check_func_name(lcons(makeString($1), $2),
  11738. yyscanner);
  11739. }
  11740. ;
  11741. /*
  11742. * Constants
  11743. */
  11744. AexprConst: Iconst
  11745. {
  11746. $$ = makeIntConst($1, @1);
  11747. }
  11748. | FCONST
  11749. {
  11750. $$ = makeFloatConst($1, @1);
  11751. }
  11752. | Sconst
  11753. {
  11754. $$ = makeStringConst($1, @1);
  11755. }
  11756. | BCONST
  11757. {
  11758. $$ = makeBitStringConst($1, @1);
  11759. }
  11760. | XCONST
  11761. {
  11762. /* This is a bit constant per SQL99:
  11763. * Without Feature F511, "BIT data type",
  11764. * a <general literal> shall not be a
  11765. * <bit string literal> or a <hex string literal>.
  11766. */
  11767. $$ = makeBitStringConst($1, @1);
  11768. }
  11769. | func_name Sconst
  11770. {
  11771. /* generic type 'literal' syntax */
  11772. TypeName *t = makeTypeNameFromNameList($1);
  11773. t->location = @1;
  11774. $$ = makeStringConstCast($2, @2, t);
  11775. }
  11776. | func_name '(' func_arg_list opt_sort_clause ')' Sconst
  11777. {
  11778. /* generic syntax with a type modifier */
  11779. TypeName *t = makeTypeNameFromNameList($1);
  11780. ListCell *lc;
  11781. /*
  11782. * We must use func_arg_list and opt_sort_clause in the
  11783. * production to avoid reduce/reduce conflicts, but we
  11784. * don't actually wish to allow NamedArgExpr in this
  11785. * context, nor ORDER BY.
  11786. */
  11787. foreach(lc, $3)
  11788. {
  11789. NamedArgExpr *arg = (NamedArgExpr *) lfirst(lc);
  11790. if (IsA(arg, NamedArgExpr))
  11791. ereport(ERROR,
  11792. (errcode(ERRCODE_SYNTAX_ERROR),
  11793. errmsg("type modifier cannot have parameter name"),
  11794. parser_errposition(arg->location)));
  11795. }
  11796. if ($4 != NIL)
  11797. ereport(ERROR,
  11798. (errcode(ERRCODE_SYNTAX_ERROR),
  11799. errmsg("type modifier cannot have ORDER BY"),
  11800. parser_errposition(@4)));
  11801. t->typmods = $3;
  11802. t->location = @1;
  11803. $$ = makeStringConstCast($6, @6, t);
  11804. }
  11805. | ConstTypename Sconst
  11806. {
  11807. $$ = makeStringConstCast($2, @2, $1);
  11808. }
  11809. | ConstInterval Sconst opt_interval
  11810. {
  11811. TypeName *t = $1;
  11812. t->typmods = $3;
  11813. $$ = makeStringConstCast($2, @2, t);
  11814. }
  11815. | ConstInterval '(' Iconst ')' Sconst opt_interval
  11816. {
  11817. TypeName *t = $1;
  11818. if ($6 != NIL)
  11819. {
  11820. if (list_length($6) != 1)
  11821. ereport(ERROR,
  11822. (errcode(ERRCODE_SYNTAX_ERROR),
  11823. errmsg("interval precision specified twice"),
  11824. parser_errposition(@1)));
  11825. t->typmods = lappend($6, makeIntConst($3, @3));
  11826. }
  11827. else
  11828. t->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1),
  11829. makeIntConst($3, @3));
  11830. $$ = makeStringConstCast($5, @5, t);
  11831. }
  11832. | TRUE_P
  11833. {
  11834. $$ = makeBoolAConst(TRUE, @1);
  11835. }
  11836. | FALSE_P
  11837. {
  11838. $$ = makeBoolAConst(FALSE, @1);
  11839. }
  11840. | NULL_P
  11841. {
  11842. $$ = makeNullAConst(@1);
  11843. }
  11844. ;
  11845. Iconst: ICONST { $$ = $1; };
  11846. Sconst: SCONST { $$ = $1; };
  11847. RoleId: NonReservedWord { $$ = $1; };
  11848. role_list: RoleId
  11849. { $$ = list_make1(makeString($1)); }
  11850. | role_list ',' RoleId
  11851. { $$ = lappend($1, makeString($3)); }
  11852. ;
  11853. SignedIconst: Iconst { $$ = $1; }
  11854. | '+' Iconst { $$ = + $2; }
  11855. | '-' Iconst { $$ = - $2; }
  11856. ;
  11857. /*
  11858. * Name classification hierarchy.
  11859. *
  11860. * IDENT is the lexeme returned by the lexer for identifiers that match
  11861. * no known keyword. In most cases, we can accept certain keywords as
  11862. * names, not only IDENTs. We prefer to accept as many such keywords
  11863. * as possible to minimize the impact of "reserved words" on programmers.
  11864. * So, we divide names into several possible classes. The classification
  11865. * is chosen in part to make keywords acceptable as names wherever possible.
  11866. */
  11867. /* Column identifier --- names that can be column, table, etc names.
  11868. */
  11869. ColId: IDENT { $$ = $1; }
  11870. | unreserved_keyword { $$ = pstrdup($1); }
  11871. | col_name_keyword { $$ = pstrdup($1); }
  11872. ;
  11873. /* Type/function identifier --- names that can be type or function names.
  11874. */
  11875. type_function_name: IDENT { $$ = $1; }
  11876. | unreserved_keyword { $$ = pstrdup($1); }
  11877. | type_func_name_keyword { $$ = pstrdup($1); }
  11878. ;
  11879. /* Any not-fully-reserved word --- these names can be, eg, role names.
  11880. */
  11881. NonReservedWord: IDENT { $$ = $1; }
  11882. | unreserved_keyword { $$ = pstrdup($1); }
  11883. | col_name_keyword { $$ = pstrdup($1); }
  11884. | type_func_name_keyword { $$ = pstrdup($1); }
  11885. ;
  11886. /* Column label --- allowed labels in "AS" clauses.
  11887. * This presently includes *all* Postgres keywords.
  11888. */
  11889. ColLabel: IDENT { $$ = $1; }
  11890. | unreserved_keyword { $$ = pstrdup($1); }
  11891. | col_name_keyword { $$ = pstrdup($1); }
  11892. | type_func_name_keyword { $$ = pstrdup($1); }
  11893. | reserved_keyword { $$ = pstrdup($1); }
  11894. ;
  11895. /*
  11896. * Keyword category lists. Generally, every keyword present in
  11897. * the Postgres grammar should appear in exactly one of these lists.
  11898. *
  11899. * Put a new keyword into the first list that it can go into without causing
  11900. * shift or reduce conflicts. The earlier lists define "less reserved"
  11901. * categories of keywords.
  11902. *
  11903. * Make sure that each keyword's category in kwlist.h matches where
  11904. * it is listed here. (Someday we may be able to generate these lists and
  11905. * kwlist.h's table from a common master list.)
  11906. */
  11907. /* "Unreserved" keywords --- available for use as any kind of name.
  11908. */
  11909. unreserved_keyword:
  11910. ABORT_P
  11911. | ABSOLUTE_P
  11912. | ACCESS
  11913. | ACTION
  11914. | ADD_P
  11915. | ADMIN
  11916. | AFTER
  11917. | AGGREGATE
  11918. | ALSO
  11919. | ALTER
  11920. | ALWAYS
  11921. | ASSERTION
  11922. | ASSIGNMENT
  11923. | AT
  11924. | ATTRIBUTE
  11925. | BACKWARD
  11926. | BEFORE
  11927. | BEGIN_P
  11928. | BY
  11929. | CACHE
  11930. | CALLED
  11931. | CASCADE
  11932. | CASCADED
  11933. | CATALOG_P
  11934. | CHAIN
  11935. | CHARACTERISTICS
  11936. | CHECKPOINT
  11937. | CLASS
  11938. | CLOSE
  11939. | CLUSTER
  11940. | COMMENT
  11941. | COMMENTS
  11942. | COMMIT
  11943. | COMMITTED
  11944. | CONFIGURATION
  11945. | CONNECTION
  11946. | CONSTRAINTS
  11947. | CONTENT_P
  11948. | CONTINUE_P
  11949. | CONVERSION_P
  11950. | COPY
  11951. | COST
  11952. | CSV
  11953. | CURRENT_P
  11954. | CURSOR
  11955. | CYCLE
  11956. | DATA_P
  11957. | DATABASE
  11958. | DAY_P
  11959. | DEALLOCATE
  11960. | DECLARE
  11961. | DEFAULTS
  11962. | DEFERRED
  11963. | DEFINER
  11964. | DELETE_P
  11965. | DELIMITER
  11966. | DELIMITERS
  11967. | DICTIONARY
  11968. | DISABLE_P
  11969. | DISCARD
  11970. | DOCUMENT_P
  11971. | DOMAIN_P
  11972. | DOUBLE_P
  11973. | DROP
  11974. | EACH
  11975. | ENABLE_P
  11976. | ENCODING
  11977. | ENCRYPTED
  11978. | ENUM_P
  11979. | ESCAPE
  11980. | EVENT
  11981. | EXCLUDE
  11982. | EXCLUDING
  11983. | EXCLUSIVE
  11984. | EXECUTE
  11985. | EXPLAIN
  11986. | EXTENSION
  11987. | EXTERNAL
  11988. | FAMILY
  11989. | FILTER
  11990. | FIRST_P
  11991. | FOLLOWING
  11992. | FORCE
  11993. | FORWARD
  11994. | FUNCTION
  11995. | FUNCTIONS
  11996. | GLOBAL
  11997. | GRANTED
  11998. | HANDLER
  11999. | HEADER_P
  12000. | HOLD
  12001. | HOUR_P
  12002. | IDENTITY_P
  12003. | IF_P
  12004. | IMMEDIATE
  12005. | IMMUTABLE
  12006. | IMPLICIT_P
  12007. | INCLUDING
  12008. | INCREMENT
  12009. | INDEX
  12010. | INDEXES
  12011. | INHERIT
  12012. | INHERITS
  12013. | INLINE_P
  12014. | INPUT_P
  12015. | INSENSITIVE
  12016. | INSERT
  12017. | INSTEAD
  12018. | INVOKER
  12019. | ISOLATION
  12020. | KEY
  12021. | LABEL
  12022. | LANGUAGE
  12023. | LARGE_P
  12024. | LAST_P
  12025. | LC_COLLATE_P
  12026. | LC_CTYPE_P
  12027. | LEAKPROOF
  12028. | LEVEL
  12029. | LISTEN
  12030. | LOAD
  12031. | LOCAL
  12032. | LOCATION
  12033. | LOCK_P
  12034. | MAPPING
  12035. | MATCH
  12036. | MATERIALIZED
  12037. | MAXVALUE
  12038. | MINUTE_P
  12039. | MINVALUE
  12040. | MODE
  12041. | MONTH_P
  12042. | MOVE
  12043. | NAME_P
  12044. | NAMES
  12045. | NEXT
  12046. | NO
  12047. | NOTHING
  12048. | NOTIFY
  12049. | NOWAIT
  12050. | NULLS_P
  12051. | OBJECT_P
  12052. | OF
  12053. | OFF
  12054. | OIDS
  12055. | OPERATOR
  12056. | OPTION
  12057. | OPTIONS
  12058. | ORDINALITY
  12059. | OVER
  12060. | OWNED
  12061. | OWNER
  12062. | PARSER
  12063. | PARTIAL
  12064. | PARTITION
  12065. | PASSING
  12066. | PASSWORD
  12067. | PLANS
  12068. | PRECEDING
  12069. | PREPARE
  12070. | PREPARED
  12071. | PRESERVE
  12072. | PRIOR
  12073. | PRIVILEGES
  12074. | PROCEDURAL
  12075. | PROCEDURE
  12076. | PROGRAM
  12077. | QUOTE
  12078. | RANGE
  12079. | READ
  12080. | REASSIGN
  12081. | RECHECK
  12082. | RECURSIVE
  12083. | REF
  12084. | REFRESH
  12085. | REINDEX
  12086. | RELATIVE_P
  12087. | RELEASE
  12088. | RENAME
  12089. | REPEATABLE
  12090. | REPLACE
  12091. | REPLICA
  12092. | RESET
  12093. | RESTART
  12094. | RESTRICT
  12095. | RETURNS
  12096. | REVOKE
  12097. | ROLE
  12098. | ROLLBACK
  12099. | ROWS
  12100. | RULE
  12101. | SAVEPOINT
  12102. | SCHEMA
  12103. | SCROLL
  12104. | SEARCH
  12105. | SECOND_P
  12106. | SECURITY
  12107. | SEQUENCE
  12108. | SEQUENCES
  12109. | SERIALIZABLE
  12110. | SERVER
  12111. | SESSION
  12112. | SET
  12113. | SHARE
  12114. | SHOW
  12115. | SIMPLE
  12116. | SNAPSHOT
  12117. | STABLE
  12118. | STANDALONE_P
  12119. | START
  12120. | STATEMENT
  12121. | STATISTICS
  12122. | STDIN
  12123. | STDOUT
  12124. | STORAGE
  12125. | STRICT_P
  12126. | STRIP_P
  12127. | SYSID
  12128. | SYSTEM_P
  12129. | TABLES
  12130. | TABLESPACE
  12131. | TEMP
  12132. | TEMPLATE
  12133. | TEMPORARY
  12134. | TEXT_P
  12135. | TRANSACTION
  12136. | TRIGGER
  12137. | TRUNCATE
  12138. | TRUSTED
  12139. | TYPE_P
  12140. | TYPES_P
  12141. | UNBOUNDED
  12142. | UNCOMMITTED
  12143. | UNENCRYPTED
  12144. | UNKNOWN
  12145. | UNLISTEN
  12146. | UNLOGGED
  12147. | UNTIL
  12148. | UPDATE
  12149. | VACUUM
  12150. | VALID
  12151. | VALIDATE
  12152. | VALIDATOR
  12153. | VALUE_P
  12154. | VARYING
  12155. | VERSION_P
  12156. | VIEW
  12157. | VIEWS
  12158. | VOLATILE
  12159. | WHITESPACE_P
  12160. | WITHIN
  12161. | WITHOUT
  12162. | WORK
  12163. | WRAPPER
  12164. | WRITE
  12165. | XML_P
  12166. | YEAR_P
  12167. | YES_P
  12168. | ZONE
  12169. ;
  12170. /* Column identifier --- keywords that can be column, table, etc names.
  12171. *
  12172. * Many of these keywords will in fact be recognized as type or function
  12173. * names too; but they have special productions for the purpose, and so
  12174. * can't be treated as "generic" type or function names.
  12175. *
  12176. * The type names appearing here are not usable as function names
  12177. * because they can be followed by '(' in typename productions, which
  12178. * looks too much like a function call for an LR(1) parser.
  12179. */
  12180. col_name_keyword:
  12181. BETWEEN
  12182. | BIGINT
  12183. | BIT
  12184. | BOOLEAN_P
  12185. | CHAR_P
  12186. | CHARACTER
  12187. | COALESCE
  12188. | DEC
  12189. | DECIMAL_P
  12190. | EXISTS
  12191. | EXTRACT
  12192. | FLOAT_P
  12193. | GREATEST
  12194. | INOUT
  12195. | INT_P
  12196. | INTEGER
  12197. | INTERVAL
  12198. | LEAST
  12199. | NATIONAL
  12200. | NCHAR
  12201. | NONE
  12202. | NULLIF
  12203. | NUMERIC
  12204. | OUT_P
  12205. | OVERLAY
  12206. | POSITION
  12207. | PRECISION
  12208. | REAL
  12209. | ROW
  12210. | SETOF
  12211. | SMALLINT
  12212. | SUBSTRING
  12213. | TIME
  12214. | TIMESTAMP
  12215. | TREAT
  12216. | TRIM
  12217. | VALUES
  12218. | VARCHAR
  12219. | XMLATTRIBUTES
  12220. | XMLCONCAT
  12221. | XMLELEMENT
  12222. | XMLEXISTS
  12223. | XMLFOREST
  12224. | XMLPARSE
  12225. | XMLPI
  12226. | XMLROOT
  12227. | XMLSERIALIZE
  12228. ;
  12229. /* Type/function identifier --- keywords that can be type or function names.
  12230. *
  12231. * Most of these are keywords that are used as operators in expressions;
  12232. * in general such keywords can't be column names because they would be
  12233. * ambiguous with variables, but they are unambiguous as function identifiers.
  12234. *
  12235. * Do not include POSITION, SUBSTRING, etc here since they have explicit
  12236. * productions in a_expr to support the goofy SQL9x argument syntax.
  12237. * - thomas 2000-11-28
  12238. */
  12239. type_func_name_keyword:
  12240. AUTHORIZATION
  12241. | BINARY
  12242. | COLLATION
  12243. | CONCURRENTLY
  12244. | CROSS
  12245. | CURRENT_SCHEMA
  12246. | FREEZE
  12247. | FULL
  12248. | ILIKE
  12249. | INNER_P
  12250. | IS
  12251. | ISNULL
  12252. | JOIN
  12253. | LEFT
  12254. | LIKE
  12255. | NATURAL
  12256. | NOTNULL
  12257. | OUTER_P
  12258. | OVERLAPS
  12259. | RIGHT
  12260. | SIMILAR
  12261. | VERBOSE
  12262. ;
  12263. /* Reserved keyword --- these keywords are usable only as a ColLabel.
  12264. *
  12265. * Keywords appear here if they could not be distinguished from variable,
  12266. * type, or function names in some contexts. Don't put things here unless
  12267. * forced to.
  12268. */
  12269. reserved_keyword:
  12270. ALL
  12271. | ANALYSE
  12272. | ANALYZE
  12273. | AND
  12274. | ANY
  12275. | ARRAY
  12276. | AS
  12277. | ASC
  12278. | ASYMMETRIC
  12279. | BOTH
  12280. | CASE
  12281. | CAST
  12282. | CHECK
  12283. | COLLATE
  12284. | COLUMN
  12285. | CONSTRAINT
  12286. | CREATE
  12287. | CURRENT_CATALOG
  12288. | CURRENT_DATE
  12289. | CURRENT_ROLE
  12290. | CURRENT_TIME
  12291. | CURRENT_TIMESTAMP
  12292. | CURRENT_USER
  12293. | DEFAULT
  12294. | DEFERRABLE
  12295. | DESC
  12296. | DISTINCT
  12297. | DO
  12298. | ELSE
  12299. | END_P
  12300. | EXCEPT
  12301. | FALSE_P
  12302. | FETCH
  12303. | FOR
  12304. | FOREIGN
  12305. | FROM
  12306. | GRANT
  12307. | GROUP_P
  12308. | HAVING
  12309. | IN_P
  12310. | INITIALLY
  12311. | INTERSECT
  12312. | INTO
  12313. | LATERAL_P
  12314. | LEADING
  12315. | LIMIT
  12316. | LOCALTIME
  12317. | LOCALTIMESTAMP
  12318. | NOT
  12319. | NULL_P
  12320. | OFFSET
  12321. | ON
  12322. | ONLY
  12323. | OR
  12324. | ORDER
  12325. | PLACING
  12326. | PRIMARY
  12327. | REFERENCES
  12328. | RETURNING
  12329. | SELECT
  12330. | SESSION_USER
  12331. | SOME
  12332. | SYMMETRIC
  12333. | TABLE
  12334. | THEN
  12335. | TO
  12336. | TRAILING
  12337. | TRUE_P
  12338. | UNION
  12339. | UNIQUE
  12340. | USER
  12341. | USING
  12342. | VARIADIC
  12343. | WHEN
  12344. | WHERE
  12345. | WINDOW
  12346. | WITH
  12347. ;
  12348. %%
  12349. /*
  12350. * The signature of this function is required by bison. However, we
  12351. * ignore the passed yylloc and instead use the last token position
  12352. * available from the scanner.
  12353. */
  12354. static void
  12355. base_yyerror(YYLTYPE *yylloc, core_yyscan_t yyscanner, const char *msg)
  12356. {
  12357. parser_yyerror(msg);
  12358. }
  12359. static Node *
  12360. makeColumnRef(char *colname, List *indirection,
  12361. int location, core_yyscan_t yyscanner)
  12362. {
  12363. /*
  12364. * Generate a ColumnRef node, with an A_Indirection node added if there
  12365. * is any subscripting in the specified indirection list. However,
  12366. * any field selection at the start of the indirection list must be
  12367. * transposed into the "fields" part of the ColumnRef node.
  12368. */
  12369. ColumnRef *c = makeNode(ColumnRef);
  12370. int nfields = 0;
  12371. ListCell *l;
  12372. c->location = location;
  12373. foreach(l, indirection)
  12374. {
  12375. if (IsA(lfirst(l), A_Indices))
  12376. {
  12377. A_Indirection *i = makeNode(A_Indirection);
  12378. if (nfields == 0)
  12379. {
  12380. /* easy case - all indirection goes to A_Indirection */
  12381. c->fields = list_make1(makeString(colname));
  12382. i->indirection = check_indirection(indirection, yyscanner);
  12383. }
  12384. else
  12385. {
  12386. /* got to split the list in two */
  12387. i->indirection = check_indirection(list_copy_tail(indirection,
  12388. nfields),
  12389. yyscanner);
  12390. indirection = list_truncate(indirection, nfields);
  12391. c->fields = lcons(makeString(colname), indirection);
  12392. }
  12393. i->arg = (Node *) c;
  12394. return (Node *) i;
  12395. }
  12396. else if (IsA(lfirst(l), A_Star))
  12397. {
  12398. /* We only allow '*' at the end of a ColumnRef */
  12399. if (lnext(l) != NULL)
  12400. parser_yyerror("improper use of \"*\"");
  12401. }
  12402. nfields++;
  12403. }
  12404. /* No subscripting, so all indirection gets added to field list */
  12405. c->fields = lcons(makeString(colname), indirection);
  12406. return (Node *) c;
  12407. }
  12408. static Node *
  12409. makeTypeCast(Node *arg, TypeName *typename, int location)
  12410. {
  12411. TypeCast *n = makeNode(TypeCast);
  12412. n->arg = arg;
  12413. n->typeName = typename;
  12414. n->location = location;
  12415. return (Node *) n;
  12416. }
  12417. static Node *
  12418. makeStringConst(char *str, int location)
  12419. {
  12420. A_Const *n = makeNode(A_Const);
  12421. n->val.type = T_String;
  12422. n->val.val.str = str;
  12423. n->location = location;
  12424. return (Node *)n;
  12425. }
  12426. static Node *
  12427. makeStringConstCast(char *str, int location, TypeName *typename)
  12428. {
  12429. Node *s = makeStringConst(str, location);
  12430. return makeTypeCast(s, typename, -1);
  12431. }
  12432. static Node *
  12433. makeIntConst(int val, int location)
  12434. {
  12435. A_Const *n = makeNode(A_Const);
  12436. n->val.type = T_Integer;
  12437. n->val.val.ival = val;
  12438. n->location = location;
  12439. return (Node *)n;
  12440. }
  12441. static Node *
  12442. makeFloatConst(char *str, int location)
  12443. {
  12444. A_Const *n = makeNode(A_Const);
  12445. n->val.type = T_Float;
  12446. n->val.val.str = str;
  12447. n->location = location;
  12448. return (Node *)n;
  12449. }
  12450. static Node *
  12451. makeBitStringConst(char *str, int location)
  12452. {
  12453. A_Const *n = makeNode(A_Const);
  12454. n->val.type = T_BitString;
  12455. n->val.val.str = str;
  12456. n->location = location;
  12457. return (Node *)n;
  12458. }
  12459. static Node *
  12460. makeNullAConst(int location)
  12461. {
  12462. A_Const *n = makeNode(A_Const);
  12463. n->val.type = T_Null;
  12464. n->location = location;
  12465. return (Node *)n;
  12466. }
  12467. static Node *
  12468. makeAConst(Value *v, int location)
  12469. {
  12470. Node *n;
  12471. switch (v->type)
  12472. {
  12473. case T_Float:
  12474. n = makeFloatConst(v->val.str, location);
  12475. break;
  12476. case T_Integer:
  12477. n = makeIntConst(v->val.ival, location);
  12478. break;
  12479. case T_String:
  12480. default:
  12481. n = makeStringConst(v->val.str, location);
  12482. break;
  12483. }
  12484. return n;
  12485. }
  12486. /* makeBoolAConst()
  12487. * Create an A_Const string node and put it inside a boolean cast.
  12488. */
  12489. static Node *
  12490. makeBoolAConst(bool state, int location)
  12491. {
  12492. A_Const *n = makeNode(A_Const);
  12493. n->val.type = T_String;
  12494. n->val.val.str = (state ? "t" : "f");
  12495. n->location = location;
  12496. return makeTypeCast((Node *)n, SystemTypeName("bool"), -1);
  12497. }
  12498. /* check_qualified_name --- check the result of qualified_name production
  12499. *
  12500. * It's easiest to let the grammar production for qualified_name allow
  12501. * subscripts and '*', which we then must reject here.
  12502. */
  12503. static void
  12504. check_qualified_name(List *names, core_yyscan_t yyscanner)
  12505. {
  12506. ListCell *i;
  12507. foreach(i, names)
  12508. {
  12509. if (!IsA(lfirst(i), String))
  12510. parser_yyerror("syntax error");
  12511. }
  12512. }
  12513. /* check_func_name --- check the result of func_name production
  12514. *
  12515. * It's easiest to let the grammar production for func_name allow subscripts
  12516. * and '*', which we then must reject here.
  12517. */
  12518. static List *
  12519. check_func_name(List *names, core_yyscan_t yyscanner)
  12520. {
  12521. ListCell *i;
  12522. foreach(i, names)
  12523. {
  12524. if (!IsA(lfirst(i), String))
  12525. parser_yyerror("syntax error");
  12526. }
  12527. return names;
  12528. }
  12529. /* check_indirection --- check the result of indirection production
  12530. *
  12531. * We only allow '*' at the end of the list, but it's hard to enforce that
  12532. * in the grammar, so do it here.
  12533. */
  12534. static List *
  12535. check_indirection(List *indirection, core_yyscan_t yyscanner)
  12536. {
  12537. ListCell *l;
  12538. foreach(l, indirection)
  12539. {
  12540. if (IsA(lfirst(l), A_Star))
  12541. {
  12542. if (lnext(l) != NULL)
  12543. parser_yyerror("improper use of \"*\"");
  12544. }
  12545. }
  12546. return indirection;
  12547. }
  12548. /* extractArgTypes()
  12549. * Given a list of FunctionParameter nodes, extract a list of just the
  12550. * argument types (TypeNames) for input parameters only. This is what
  12551. * is needed to look up an existing function, which is what is wanted by
  12552. * the productions that use this call.
  12553. */
  12554. static List *
  12555. extractArgTypes(List *parameters)
  12556. {
  12557. List *result = NIL;
  12558. ListCell *i;
  12559. foreach(i, parameters)
  12560. {
  12561. FunctionParameter *p = (FunctionParameter *) lfirst(i);
  12562. if (p->mode != FUNC_PARAM_OUT && p->mode != FUNC_PARAM_TABLE)
  12563. result = lappend(result, p->argType);
  12564. }
  12565. return result;
  12566. }
  12567. /* extractAggrArgTypes()
  12568. * As above, but work from the output of the aggr_args production.
  12569. */
  12570. static List *
  12571. extractAggrArgTypes(List *aggrargs)
  12572. {
  12573. Assert(list_length(aggrargs) == 2);
  12574. return extractArgTypes((List *) linitial(aggrargs));
  12575. }
  12576. /* makeOrderedSetArgs()
  12577. * Build the result of the aggr_args production (which see the comments for).
  12578. * This handles only the case where both given lists are nonempty, so that
  12579. * we have to deal with multiple VARIADIC arguments.
  12580. */
  12581. static List *
  12582. makeOrderedSetArgs(List *directargs, List *orderedargs,
  12583. core_yyscan_t yyscanner)
  12584. {
  12585. FunctionParameter *lastd = (FunctionParameter *) llast(directargs);
  12586. int ndirectargs;
  12587. /* No restriction unless last direct arg is VARIADIC */
  12588. if (lastd->mode == FUNC_PARAM_VARIADIC)
  12589. {
  12590. FunctionParameter *firsto = (FunctionParameter *) linitial(orderedargs);
  12591. /*
  12592. * We ignore the names, though the aggr_arg production allows them;
  12593. * it doesn't allow default values, so those need not be checked.
  12594. */
  12595. if (list_length(orderedargs) != 1 ||
  12596. firsto->mode != FUNC_PARAM_VARIADIC ||
  12597. !equal(lastd->argType, firsto->argType))
  12598. ereport(ERROR,
  12599. (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
  12600. errmsg("an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type"),
  12601. parser_errposition(exprLocation((Node *) firsto))));
  12602. /* OK, drop the duplicate VARIADIC argument from the internal form */
  12603. orderedargs = NIL;
  12604. }
  12605. /* don't merge into the next line, as list_concat changes directargs */
  12606. ndirectargs = list_length(directargs);
  12607. return list_make2(list_concat(directargs, orderedargs),
  12608. makeInteger(ndirectargs));
  12609. }
  12610. /* insertSelectOptions()
  12611. * Insert ORDER BY, etc into an already-constructed SelectStmt.
  12612. *
  12613. * This routine is just to avoid duplicating code in SelectStmt productions.
  12614. */
  12615. static void
  12616. insertSelectOptions(SelectStmt *stmt,
  12617. List *sortClause, List *lockingClause,
  12618. Node *limitOffset, Node *limitCount,
  12619. WithClause *withClause,
  12620. core_yyscan_t yyscanner)
  12621. {
  12622. Assert(IsA(stmt, SelectStmt));
  12623. /*
  12624. * Tests here are to reject constructs like
  12625. * (SELECT foo ORDER BY bar) ORDER BY baz
  12626. */
  12627. if (sortClause)
  12628. {
  12629. if (stmt->sortClause)
  12630. ereport(ERROR,
  12631. (errcode(ERRCODE_SYNTAX_ERROR),
  12632. errmsg("multiple ORDER BY clauses not allowed"),
  12633. parser_errposition(exprLocation((Node *) sortClause))));
  12634. stmt->sortClause = sortClause;
  12635. }
  12636. /* We can handle multiple locking clauses, though */
  12637. stmt->lockingClause = list_concat(stmt->lockingClause, lockingClause);
  12638. if (limitOffset)
  12639. {
  12640. if (stmt->limitOffset)
  12641. ereport(ERROR,
  12642. (errcode(ERRCODE_SYNTAX_ERROR),
  12643. errmsg("multiple OFFSET clauses not allowed"),
  12644. parser_errposition(exprLocation(limitOffset))));
  12645. stmt->limitOffset = limitOffset;
  12646. }
  12647. if (limitCount)
  12648. {
  12649. if (stmt->limitCount)
  12650. ereport(ERROR,
  12651. (errcode(ERRCODE_SYNTAX_ERROR),
  12652. errmsg("multiple LIMIT clauses not allowed"),
  12653. parser_errposition(exprLocation(limitCount))));
  12654. stmt->limitCount = limitCount;
  12655. }
  12656. if (withClause)
  12657. {
  12658. if (stmt->withClause)
  12659. ereport(ERROR,
  12660. (errcode(ERRCODE_SYNTAX_ERROR),
  12661. errmsg("multiple WITH clauses not allowed"),
  12662. parser_errposition(exprLocation((Node *) withClause))));
  12663. stmt->withClause = withClause;
  12664. }
  12665. }
  12666. static Node *
  12667. makeSetOp(SetOperation op, bool all, Node *larg, Node *rarg)
  12668. {
  12669. SelectStmt *n = makeNode(SelectStmt);
  12670. n->op = op;
  12671. n->all = all;
  12672. n->larg = (SelectStmt *) larg;
  12673. n->rarg = (SelectStmt *) rarg;
  12674. return (Node *) n;
  12675. }
  12676. /* SystemFuncName()
  12677. * Build a properly-qualified reference to a built-in function.
  12678. */
  12679. List *
  12680. SystemFuncName(char *name)
  12681. {
  12682. return list_make2(makeString("pg_catalog"), makeString(name));
  12683. }
  12684. /* SystemTypeName()
  12685. * Build a properly-qualified reference to a built-in type.
  12686. *
  12687. * typmod is defaulted, but may be changed afterwards by caller.
  12688. * Likewise for the location.
  12689. */
  12690. TypeName *
  12691. SystemTypeName(char *name)
  12692. {
  12693. return makeTypeNameFromNameList(list_make2(makeString("pg_catalog"),
  12694. makeString(name)));
  12695. }
  12696. /* doNegate()
  12697. * Handle negation of a numeric constant.
  12698. *
  12699. * Formerly, we did this here because the optimizer couldn't cope with
  12700. * indexquals that looked like "var = -4" --- it wants "var = const"
  12701. * and a unary minus operator applied to a constant didn't qualify.
  12702. * As of Postgres 7.0, that problem doesn't exist anymore because there
  12703. * is a constant-subexpression simplifier in the optimizer. However,
  12704. * there's still a good reason for doing this here, which is that we can
  12705. * postpone committing to a particular internal representation for simple
  12706. * negative constants. It's better to leave "-123.456" in string form
  12707. * until we know what the desired type is.
  12708. */
  12709. static Node *
  12710. doNegate(Node *n, int location)
  12711. {
  12712. if (IsA(n, A_Const))
  12713. {
  12714. A_Const *con = (A_Const *)n;
  12715. /* report the constant's location as that of the '-' sign */
  12716. con->location = location;
  12717. if (con->val.type == T_Integer)
  12718. {
  12719. con->val.val.ival = -con->val.val.ival;
  12720. return n;
  12721. }
  12722. if (con->val.type == T_Float)
  12723. {
  12724. doNegateFloat(&con->val);
  12725. return n;
  12726. }
  12727. }
  12728. return (Node *) makeSimpleA_Expr(AEXPR_OP, "-", NULL, n, location);
  12729. }
  12730. static void
  12731. doNegateFloat(Value *v)
  12732. {
  12733. char *oldval = v->val.str;
  12734. Assert(IsA(v, Float));
  12735. if (*oldval == '+')
  12736. oldval++;
  12737. if (*oldval == '-')
  12738. v->val.str = oldval+1; /* just strip the '-' */
  12739. else
  12740. v->val.str = psprintf("-%s", oldval);
  12741. }
  12742. static Node *
  12743. makeAArrayExpr(List *elements, int location)
  12744. {
  12745. A_ArrayExpr *n = makeNode(A_ArrayExpr);
  12746. n->elements = elements;
  12747. n->location = location;
  12748. return (Node *) n;
  12749. }
  12750. static Node *
  12751. makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args,
  12752. int location)
  12753. {
  12754. XmlExpr *x = makeNode(XmlExpr);
  12755. x->op = op;
  12756. x->name = name;
  12757. /*
  12758. * named_args is a list of ResTarget; it'll be split apart into separate
  12759. * expression and name lists in transformXmlExpr().
  12760. */
  12761. x->named_args = named_args;
  12762. x->arg_names = NIL;
  12763. x->args = args;
  12764. /* xmloption, if relevant, must be filled in by caller */
  12765. /* type and typmod will be filled in during parse analysis */
  12766. x->type = InvalidOid; /* marks the node as not analyzed */
  12767. x->location = location;
  12768. return (Node *) x;
  12769. }
  12770. /*
  12771. * Merge the input and output parameters of a table function.
  12772. */
  12773. static List *
  12774. mergeTableFuncParameters(List *func_args, List *columns)
  12775. {
  12776. ListCell *lc;
  12777. /* Explicit OUT and INOUT parameters shouldn't be used in this syntax */
  12778. foreach(lc, func_args)
  12779. {
  12780. FunctionParameter *p = (FunctionParameter *) lfirst(lc);
  12781. if (p->mode != FUNC_PARAM_IN && p->mode != FUNC_PARAM_VARIADIC)
  12782. ereport(ERROR,
  12783. (errcode(ERRCODE_SYNTAX_ERROR),
  12784. errmsg("OUT and INOUT arguments aren't allowed in TABLE functions")));
  12785. }
  12786. return list_concat(func_args, columns);
  12787. }
  12788. /*
  12789. * Determine return type of a TABLE function. A single result column
  12790. * returns setof that column's type; otherwise return setof record.
  12791. */
  12792. static TypeName *
  12793. TableFuncTypeName(List *columns)
  12794. {
  12795. TypeName *result;
  12796. if (list_length(columns) == 1)
  12797. {
  12798. FunctionParameter *p = (FunctionParameter *) linitial(columns);
  12799. result = (TypeName *) copyObject(p->argType);
  12800. }
  12801. else
  12802. result = SystemTypeName("record");
  12803. result->setof = true;
  12804. return result;
  12805. }
  12806. /*
  12807. * Convert a list of (dotted) names to a RangeVar (like
  12808. * makeRangeVarFromNameList, but with position support). The
  12809. * "AnyName" refers to the any_name production in the grammar.
  12810. */
  12811. static RangeVar *
  12812. makeRangeVarFromAnyName(List *names, int position, core_yyscan_t yyscanner)
  12813. {
  12814. RangeVar *r = makeNode(RangeVar);
  12815. switch (list_length(names))
  12816. {
  12817. case 1:
  12818. r->catalogname = NULL;
  12819. r->schemaname = NULL;
  12820. r->relname = strVal(linitial(names));
  12821. break;
  12822. case 2:
  12823. r->catalogname = NULL;
  12824. r->schemaname = strVal(linitial(names));
  12825. r->relname = strVal(lsecond(names));
  12826. break;
  12827. case 3:
  12828. r->catalogname = strVal(linitial(names));;
  12829. r->schemaname = strVal(lsecond(names));
  12830. r->relname = strVal(lthird(names));
  12831. break;
  12832. default:
  12833. ereport(ERROR,
  12834. (errcode(ERRCODE_SYNTAX_ERROR),
  12835. errmsg("improper qualified name (too many dotted names): %s",
  12836. NameListToString(names)),
  12837. parser_errposition(position)));
  12838. break;
  12839. }
  12840. r->relpersistence = RELPERSISTENCE_PERMANENT;
  12841. r->location = position;
  12842. return r;
  12843. }
  12844. /* Separate Constraint nodes from COLLATE clauses in a ColQualList */
  12845. static void
  12846. SplitColQualList(List *qualList,
  12847. List **constraintList, CollateClause **collClause,
  12848. core_yyscan_t yyscanner)
  12849. {
  12850. ListCell *cell;
  12851. ListCell *prev;
  12852. ListCell *next;
  12853. *collClause = NULL;
  12854. prev = NULL;
  12855. for (cell = list_head(qualList); cell; cell = next)
  12856. {
  12857. Node *n = (Node *) lfirst(cell);
  12858. next = lnext(cell);
  12859. if (IsA(n, Constraint))
  12860. {
  12861. /* keep it in list */
  12862. prev = cell;
  12863. continue;
  12864. }
  12865. if (IsA(n, CollateClause))
  12866. {
  12867. CollateClause *c = (CollateClause *) n;
  12868. if (*collClause)
  12869. ereport(ERROR,
  12870. (errcode(ERRCODE_SYNTAX_ERROR),
  12871. errmsg("multiple COLLATE clauses not allowed"),
  12872. parser_errposition(c->location)));
  12873. *collClause = c;
  12874. }
  12875. else
  12876. elog(ERROR, "unexpected node type %d", (int) n->type);
  12877. /* remove non-Constraint nodes from qualList */
  12878. qualList = list_delete_cell(qualList, cell, prev);
  12879. }
  12880. *constraintList = qualList;
  12881. }
  12882. /*
  12883. * Process result of ConstraintAttributeSpec, and set appropriate bool flags
  12884. * in the output command node. Pass NULL for any flags the particular
  12885. * command doesn't support.
  12886. */
  12887. static void
  12888. processCASbits(int cas_bits, int location, const char *constrType,
  12889. bool *deferrable, bool *initdeferred, bool *not_valid,
  12890. bool *no_inherit, core_yyscan_t yyscanner)
  12891. {
  12892. /* defaults */
  12893. if (deferrable)
  12894. *deferrable = false;
  12895. if (initdeferred)
  12896. *initdeferred = false;
  12897. if (not_valid)
  12898. *not_valid = false;
  12899. if (cas_bits & (CAS_DEFERRABLE | CAS_INITIALLY_DEFERRED))
  12900. {
  12901. if (deferrable)
  12902. *deferrable = true;
  12903. else
  12904. ereport(ERROR,
  12905. (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
  12906. /* translator: %s is CHECK, UNIQUE, or similar */
  12907. errmsg("%s constraints cannot be marked DEFERRABLE",
  12908. constrType),
  12909. parser_errposition(location)));
  12910. }
  12911. if (cas_bits & CAS_INITIALLY_DEFERRED)
  12912. {
  12913. if (initdeferred)
  12914. *initdeferred = true;
  12915. else
  12916. ereport(ERROR,
  12917. (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
  12918. /* translator: %s is CHECK, UNIQUE, or similar */
  12919. errmsg("%s constraints cannot be marked DEFERRABLE",
  12920. constrType),
  12921. parser_errposition(location)));
  12922. }
  12923. if (cas_bits & CAS_NOT_VALID)
  12924. {
  12925. if (not_valid)
  12926. *not_valid = true;
  12927. else
  12928. ereport(ERROR,
  12929. (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
  12930. /* translator: %s is CHECK, UNIQUE, or similar */
  12931. errmsg("%s constraints cannot be marked NOT VALID",
  12932. constrType),
  12933. parser_errposition(location)));
  12934. }
  12935. if (cas_bits & CAS_NO_INHERIT)
  12936. {
  12937. if (no_inherit)
  12938. *no_inherit = true;
  12939. else
  12940. ereport(ERROR,
  12941. (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
  12942. /* translator: %s is CHECK, UNIQUE, or similar */
  12943. errmsg("%s constraints cannot be marked NO INHERIT",
  12944. constrType),
  12945. parser_errposition(location)));
  12946. }
  12947. }
  12948. /*----------
  12949. * Recursive view transformation
  12950. *
  12951. * Convert
  12952. *
  12953. * CREATE RECURSIVE VIEW relname (aliases) AS query
  12954. *
  12955. * to
  12956. *
  12957. * CREATE VIEW relname (aliases) AS
  12958. * WITH RECURSIVE relname (aliases) AS (query)
  12959. * SELECT aliases FROM relname
  12960. *
  12961. * Actually, just the WITH ... part, which is then inserted into the original
  12962. * view definition as the query.
  12963. * ----------
  12964. */
  12965. static Node *
  12966. makeRecursiveViewSelect(char *relname, List *aliases, Node *query)
  12967. {
  12968. SelectStmt *s = makeNode(SelectStmt);
  12969. WithClause *w = makeNode(WithClause);
  12970. CommonTableExpr *cte = makeNode(CommonTableExpr);
  12971. List *tl = NIL;
  12972. ListCell *lc;
  12973. /* create common table expression */
  12974. cte->ctename = relname;
  12975. cte->aliascolnames = aliases;
  12976. cte->ctequery = query;
  12977. cte->location = -1;
  12978. /* create WITH clause and attach CTE */
  12979. w->recursive = true;
  12980. w->ctes = list_make1(cte);
  12981. w->location = -1;
  12982. /* create target list for the new SELECT from the alias list of the
  12983. * recursive view specification */
  12984. foreach (lc, aliases)
  12985. {
  12986. ResTarget *rt = makeNode(ResTarget);
  12987. rt->name = NULL;
  12988. rt->indirection = NIL;
  12989. rt->val = makeColumnRef(strVal(lfirst(lc)), NIL, -1, 0);
  12990. rt->location = -1;
  12991. tl = lappend(tl, rt);
  12992. }
  12993. /* create new SELECT combining WITH clause, target list, and fake FROM
  12994. * clause */
  12995. s->withClause = w;
  12996. s->targetList = tl;
  12997. s->fromClause = list_make1(makeRangeVar(NULL, relname, -1));
  12998. return (Node *) s;
  12999. }
  13000. /* parser_init()
  13001. * Initialize to parse one query string
  13002. */
  13003. void
  13004. parser_init(base_yy_extra_type *yyext)
  13005. {
  13006. yyext->parsetree = NIL; /* in case grammar forgets to set it */
  13007. }
  13008. /*
  13009. * Must undefine this stuff before including scan.c, since it has different
  13010. * definitions for these macros.
  13011. */
  13012. #undef yyerror
  13013. #undef yylval
  13014. #undef yylloc
  13015. #include "scan.c"