4 /*-------------------------------------------------------------------------
7 * POSTGRES SQL YACC rules/actions
9 * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
10 * Portions Copyright (c) 1994, Regents of the University of California
14 * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.614 2008/04/29 20:44:49 tgl Exp $
17 * AUTHOR DATE MAJOR EVENT
18 * Andrew Yu Sept, 1994 POSTQUEL to SQL conversion
19 * Andrew Yu Oct, 1994 lispy code conversion
22 * CAPITALS are used to represent terminal symbols.
23 * non-capitals are used to represent non-terminals.
24 * SQL92-specific syntax is separated from plain SQL/Postgres syntax
25 * to help isolate the non-extensible portions of the parser.
27 * In general, nothing in this file should initiate database accesses
28 * nor depend on changeable state (such as SET variables). If you do
29 * database accesses, your code will fail when we have aborted the
30 * current transaction and are just parsing commands to find the next
31 * ROLLBACK or COMMIT. If you make use of SET variables, then you
32 * will do the wrong thing in multi-query strings like this:
33 * SET SQL_inheritance TO off; SELECT * FROM foo;
34 * because the entire string is parsed by gram.y before the SET gets
35 * executed. Anything that depends on the database or changeable state
36 * should be handled during parse analysis so that it happens at the
37 * right time not the wrong time. The handling of SQL_inheritance is
41 * If you use a list, make sure the datum is a node so that the printing
44 * Sometimes we assign constants to makeStrings. Make sure we don't free
47 *-------------------------------------------------------------------------
54 #include "catalog/index.h"
55 #include "catalog/namespace.h"
56 #include "commands/defrem.h"
57 #include "nodes/makefuncs.h"
58 #include "parser/gramparse.h"
59 #include "storage/lmgr.h"
60 #include "utils/date.h"
61 #include "utils/datetime.h"
62 #include "utils/numeric.h"
63 #include "utils/xml.h"
66 /* Location tracking support --- simpler than bison's default */
67 #define YYLLOC_DEFAULT(Current, Rhs, N) \
70 (Current) = (Rhs)[1]; \
72 (Current) = (Rhs)[0]; \
76 * The %name-prefix option below will make bison call base_yylex, but we
77 * really want it to call filtered_base_yylex (see parser.c).
79 #define base_yylex filtered_base_yylex
81 extern List *parsetree; /* final parse result is delivered here */
83 static bool QueryIsRule = FALSE;
86 * If you need access to certain yacc-generated variables and find that
87 * they're static by default, uncomment the next line. (this is not a
90 /*#define __YYSCLASS*/
92 static Node *makeColumnRef(char *relname, List *indirection, int location);
93 static Node *makeTypeCast(Node *arg, TypeName *typename);
94 static Node *makeStringConst(char *str);
95 static Node *makeStringConstCast(char *str, TypeName *typename);
96 static Node *makeIntConst(int val);
97 static Node *makeFloatConst(char *str);
98 static Node *makeBitStringConst(char *str);
99 static Node *makeNullAConst(void);
100 static Node *makeAConst(Value *v);
101 static Node *makeBoolAConst(bool state);
102 static FuncCall *makeOverlaps(List *largs, List *rargs, int location);
103 static void check_qualified_name(List *names);
104 static List *check_func_name(List *names);
105 static List *extractArgTypes(List *parameters);
106 static SelectStmt *findLeftmostSelect(SelectStmt *node);
107 static void insertSelectOptions(SelectStmt *stmt,
108 List *sortClause, List *lockingClause,
109 Node *limitOffset, Node *limitCount);
110 static Node *makeSetOp(SetOperation op, bool all, Node *larg, Node *rarg);
111 static Node *doNegate(Node *n, int location);
112 static void doNegateFloat(Value *v);
113 static Node *makeAArrayExpr(List *elements);
114 static Node *makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args);
118 %name-prefix="base_yy"
129 DropBehavior dbehavior;
130 OnCommitAction oncommit;
137 FunctionParameter *fun_param;
138 FunctionParameterMode fun_param_mode;
139 FuncWithArgs *funwithargs;
149 PrivTarget *privtarget;
152 VariableSetStmt *vsetstmt;
155 %type <node> stmt schema_stmt
156 AlterDatabaseStmt AlterDatabaseSetStmt AlterDomainStmt AlterGroupStmt
157 AlterObjectSchemaStmt AlterOwnerStmt AlterSeqStmt AlterTableStmt
158 AlterUserStmt AlterUserSetStmt AlterRoleStmt AlterRoleSetStmt
159 AnalyzeStmt ClosePortalStmt ClusterStmt CommentStmt
160 ConstraintsSetStmt CopyStmt CreateAsStmt CreateCastStmt
161 CreateDomainStmt CreateGroupStmt CreateOpClassStmt
162 CreateOpFamilyStmt AlterOpFamilyStmt CreatePLangStmt
163 CreateSchemaStmt CreateSeqStmt CreateStmt CreateTableSpaceStmt
164 CreateAssertStmt CreateTrigStmt CreateUserStmt CreateRoleStmt
165 CreatedbStmt DeclareCursorStmt DefineStmt DeleteStmt DiscardStmt
166 DropGroupStmt DropOpClassStmt DropOpFamilyStmt DropPLangStmt DropStmt
167 DropAssertStmt DropTrigStmt DropRuleStmt DropCastStmt DropRoleStmt
168 DropUserStmt DropdbStmt DropTableSpaceStmt ExplainStmt FetchStmt
169 GrantStmt GrantRoleStmt IndexStmt InsertStmt ListenStmt LoadStmt
170 LockStmt NotifyStmt ExplainableStmt PreparableStmt
171 CreateFunctionStmt AlterFunctionStmt ReindexStmt RemoveAggrStmt
172 RemoveFuncStmt RemoveOperStmt RenameStmt RevokeStmt RevokeRoleStmt
173 RuleActionStmt RuleActionStmtOrEmpty RuleStmt
174 SelectStmt TransactionStmt TruncateStmt
175 UnlistenStmt UpdateStmt VacuumStmt
176 VariableResetStmt VariableSetStmt VariableShowStmt
177 ViewStmt CheckPointStmt CreateConversionStmt
178 DeallocateStmt PrepareStmt ExecuteStmt
179 DropOwnedStmt ReassignOwnedStmt
180 AlterTSConfigurationStmt AlterTSDictionaryStmt
182 %type <node> select_no_parens select_with_parens select_clause
183 simple_select values_clause
185 %type <node> alter_column_default opclass_item opclass_drop alter_using
186 %type <ival> add_drop opt_asc_desc opt_nulls_order
188 %type <node> alter_table_cmd alter_rel_cmd
189 %type <list> alter_table_cmds alter_rel_cmds
191 %type <dbehavior> opt_drop_behavior
193 %type <list> createdb_opt_list alterdb_opt_list copy_opt_list
194 transaction_mode_list
195 %type <defelt> createdb_opt_item alterdb_opt_item copy_opt_item
196 transaction_mode_item
198 %type <ival> opt_lock lock_type cast_context
199 %type <boolean> opt_force opt_or_replace
200 opt_grant_grant_option opt_grant_admin_option
201 opt_nowait opt_if_exists
203 %type <list> OptRoleList
204 %type <defelt> OptRoleElem
206 %type <str> OptSchemaName
207 %type <list> OptSchemaEltList
209 %type <boolean> TriggerActionTime TriggerForSpec opt_trusted
210 %type <str> opt_lancompiler
212 %type <str> TriggerEvents
213 %type <value> TriggerFuncArg
215 %type <str> relation_name copy_file_name
216 database_name access_method_clause access_method attr_name
217 index_name name file_name cluster_index_specification
219 %type <list> func_name handler_name qual_Op qual_all_Op subquery_Op
220 opt_class opt_validator
222 %type <range> qualified_name OptConstrFromTable
224 %type <str> all_Op MathOp SpecialRuleRelation
226 %type <str> iso_level opt_encoding
228 %type <list> grantee_list
229 %type <str> privilege
230 %type <list> privileges privilege_list
231 %type <privtarget> privilege_target
232 %type <funwithargs> function_with_argtypes
233 %type <list> function_with_argtypes_list
234 %type <chr> TriggerOneEvent
236 %type <list> stmtblock stmtmulti
237 OptTableElementList TableElementList OptInherit definition
238 OptWith opt_distinct opt_definition func_args func_args_list
239 func_as createfunc_opt_list alterfunc_opt_list
240 aggr_args old_aggr_definition old_aggr_list
241 oper_argtypes RuleActionList RuleActionMulti
242 opt_column_list columnList opt_name_list
243 sort_clause opt_sort_clause sortby_list index_params
244 name_list from_clause from_list opt_array_bounds
245 qualified_name_list any_name any_name_list
246 any_operator expr_list attrs
247 target_list insert_column_list set_target_list
248 set_clause_list set_clause multiple_set_clause
249 ctext_expr_list ctext_row def_list indirection opt_indirection
250 group_clause TriggerFuncArgs select_limit
251 opt_select_limit opclass_item_list opclass_drop_list
252 opt_opfamily transaction_mode_list_or_empty
253 TableFuncElementList opt_type_modifiers
255 execute_param_clause using_clause returning_clause
258 %type <range> OptTempTableName
259 %type <into> into_clause create_as_target
261 %type <defelt> createfunc_opt_item common_func_opt_item
262 %type <fun_param> func_arg
263 %type <fun_param_mode> arg_class
264 %type <typnam> func_return func_type
266 %type <boolean> TriggerForType OptTemp
267 %type <oncommit> OnCommitOption
269 %type <node> for_locking_item
270 %type <list> for_locking_clause opt_for_locking_clause for_locking_items
271 %type <list> locked_rels_list
272 %type <boolean> opt_all
274 %type <node> join_outer join_qual
275 %type <jtype> join_type
277 %type <list> extract_list overlay_list position_list
278 %type <list> substr_list trim_list
279 %type <ival> opt_interval
280 %type <node> overlay_placing substr_from substr_for
282 %type <boolean> opt_instead opt_analyze
283 %type <boolean> index_opt_unique opt_verbose opt_full
284 %type <boolean> opt_freeze opt_default opt_recheck
285 %type <defelt> opt_binary opt_oids copy_delimiter
287 %type <boolean> copy_from
289 %type <ival> opt_column event cursor_options opt_hold
290 %type <objtype> reindex_type drop_type comment_type
292 %type <node> fetch_direction select_limit_value select_offset_value
294 %type <list> OptSeqList
295 %type <defelt> OptSeqElem
297 %type <istmt> insert_rest
299 %type <vsetstmt> set_rest SetResetClause
301 %type <node> TableElement ConstraintElem TableFuncElement
302 %type <node> columnDef
303 %type <defelt> def_elem old_aggr_elem
304 %type <node> def_arg columnElem where_clause where_or_current_clause
305 a_expr b_expr c_expr func_expr AexprConst indirection_el
306 columnref in_expr having_clause func_table array_expr
307 %type <list> row type_list array_expr_list
308 %type <node> case_expr case_arg when_clause case_default
309 %type <list> when_clause_list
310 %type <ival> sub_type
311 %type <list> OptCreateAs CreateAsList
312 %type <node> CreateAsElement ctext_expr
313 %type <value> NumericOnly FloatOnly IntegerOnly
314 %type <alias> alias_clause
315 %type <sortby> sortby
316 %type <ielem> index_elem
317 %type <node> table_ref
318 %type <jexpr> joined_table
319 %type <range> relation_expr
320 %type <range> relation_expr_opt_alias
321 %type <target> target_el single_set_clause set_target insert_column_item
323 %type <typnam> Typename SimpleTypename ConstTypename
324 GenericType Numeric opt_float
325 Character ConstCharacter
326 CharacterWithLength CharacterWithoutLength
327 ConstDatetime ConstInterval
328 Bit ConstBit BitWithLength BitWithoutLength
329 %type <str> character
330 %type <str> extract_arg
331 %type <str> opt_charset
332 %type <boolean> opt_varying opt_timezone
334 %type <ival> Iconst SignedIconst
335 %type <str> Sconst comment_text
336 %type <str> RoleId opt_granted_by opt_boolean ColId_or_Sconst
337 %type <list> var_list
338 %type <str> ColId ColLabel var_name type_function_name param_name
339 %type <node> var_value zone_value
341 %type <keyword> unreserved_keyword type_func_name_keyword
342 %type <keyword> col_name_keyword reserved_keyword
344 %type <node> TableConstraint TableLikeClause
345 %type <list> TableLikeOptionList
346 %type <ival> TableLikeOption
347 %type <list> ColQualList
348 %type <node> ColConstraint ColConstraintElem ConstraintAttr
349 %type <ival> key_actions key_delete key_match key_update key_action
350 %type <ival> ConstraintAttributeSpec ConstraintDeferrabilitySpec
353 %type <list> constraints_set_list
354 %type <boolean> constraints_set_mode
355 %type <str> OptTableSpace OptConsTableSpace OptTableSpaceOwner
356 %type <list> opt_check_option
358 %type <target> xml_attribute_el
359 %type <list> xml_attribute_list xml_attributes
360 %type <node> xml_root_version opt_xml_root_standalone
361 %type <ival> document_or_content
362 %type <boolean> xml_whitespace_option
366 * If you make any token changes, update the keyword table in
367 * parser/keywords.c and add new keywords to the appropriate one of
368 * the reserved-or-not-so-reserved keyword lists, below; search
369 * this file for "Name classification hierarchy".
372 /* ordinary key words in alphabetical order */
373 %token <keyword> ABORT_P ABSOLUTE_P ACCESS ACTION ADD_P ADMIN AFTER
374 AGGREGATE ALL ALSO ALTER ALWAYS ANALYSE ANALYZE AND ANY ARRAY AS ASC
375 ASSERTION ASSIGNMENT ASYMMETRIC AT AUTHORIZATION
377 BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT
380 CACHE CALLED CASCADE CASCADED CASE CAST CHAIN CHAR_P
381 CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE
382 CLUSTER COALESCE COLLATE COLUMN COMMENT COMMIT
383 COMMITTED CONCURRENTLY CONFIGURATION CONNECTION CONSTRAINT CONSTRAINTS
384 CONTENT_P CONVERSION_P COPY COST CREATE CREATEDB
385 CREATEROLE CREATEUSER CROSS CSV CURRENT_P CURRENT_DATE CURRENT_ROLE
386 CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE
388 DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS
389 DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS DESC
390 DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P DOUBLE_P DROP
392 EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EXCEPT EXCLUDING
393 EXCLUSIVE EXECUTE EXISTS EXPLAIN EXTERNAL EXTRACT
395 FALSE_P FAMILY FETCH FIRST_P FLOAT_P FOR FORCE FOREIGN FORWARD
396 FREEZE FROM FULL FUNCTION
398 GLOBAL GRANT GRANTED GREATEST GROUP_P
400 HANDLER HAVING HEADER_P HOLD HOUR_P
402 IF_P ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IN_P INCLUDING INCREMENT
403 INDEX INDEXES INHERIT INHERITS INITIALLY INNER_P INOUT INPUT_P
404 INSENSITIVE INSERT INSTEAD INT_P INTEGER INTERSECT
405 INTERVAL INTO INVOKER IS ISNULL ISOLATION
411 LANCOMPILER LANGUAGE LARGE_P LAST_P LEADING LEAST LEFT LEVEL
412 LIKE LIMIT LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION
415 MAPPING MATCH MAXVALUE MINUTE_P MINVALUE MODE MONTH_P MOVE
417 NAME_P NAMES NATIONAL NATURAL NCHAR NEW NEXT NO NOCREATEDB
418 NOCREATEROLE NOCREATEUSER NOINHERIT NOLOGIN_P NONE NOSUPERUSER
419 NOT NOTHING NOTIFY NOTNULL NOWAIT NULL_P NULLIF NULLS_P NUMERIC
421 OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OR
422 ORDER OUT_P OUTER_P OVERLAPS OVERLAY OWNED OWNER
424 PARSER PARTIAL PASSWORD PLACING PLANS POSITION
425 PRECISION PRESERVE PREPARE PREPARED PRIMARY
426 PRIOR PRIVILEGES PROCEDURAL PROCEDURE
430 READ REAL REASSIGN RECHECK REFERENCES REINDEX RELATIVE_P RELEASE RENAME
431 REPEATABLE REPLACE REPLICA RESET RESTART RESTRICT RETURNING RETURNS REVOKE
432 RIGHT ROLE ROLLBACK ROW ROWS RULE
434 SAVEPOINT SCHEMA SCROLL SEARCH SECOND_P SECURITY SELECT SEQUENCE
435 SERIALIZABLE SESSION SESSION_USER SET SETOF SHARE
436 SHOW SIMILAR SIMPLE SMALLINT SOME STABLE STANDALONE_P START STATEMENT
437 STATISTICS STDIN STDOUT STORAGE STRICT_P STRIP_P SUBSTRING SUPERUSER_P
438 SYMMETRIC SYSID SYSTEM_P
440 TABLE TABLESPACE TEMP TEMPLATE TEMPORARY TEXT_P THEN TIME TIMESTAMP
441 TO TRAILING TRANSACTION TREAT TRIGGER TRIM TRUE_P
442 TRUNCATE TRUSTED TYPE_P
444 UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN UNLISTEN UNTIL
447 VACUUM VALID VALIDATOR VALUE_P VALUES VARCHAR VARYING
448 VERBOSE VERSION_P VIEW VOLATILE
450 WHEN WHERE WHITESPACE_P WITH WITHOUT WORK WRITE
452 XML_P XMLATTRIBUTES XMLCONCAT XMLELEMENT XMLFOREST XMLPARSE
453 XMLPI XMLROOT XMLSERIALIZE
459 /* The grammar thinks these are keywords, but they are not in the keywords.c
460 * list and so can never be entered directly. The filter in parser.c
461 * creates these tokens when required.
463 %token NULLS_FIRST NULLS_LAST WITH_CASCADED WITH_LOCAL WITH_CHECK
465 /* Special token types, not actually keywords - see the "lex" file */
466 %token <str> IDENT FCONST SCONST BCONST XCONST Op
467 %token <ival> ICONST PARAM
469 /* precedence: lowest to highest */
470 %nonassoc SET /* see relation_expr_opt_alias */
478 %nonassoc LIKE ILIKE SIMILAR
483 %left POSTFIXOP /* dummy for postfix Op rules */
484 %nonassoc IDENT /* to support target_el without AS */
485 %left Op OPERATOR /* multi-character ops and user-defined operators */
488 %nonassoc IS NULL_P TRUE_P FALSE_P UNKNOWN /* sets precedence for IS NULL, etc */
492 /* Unary Operators */
493 %left AT ZONE /* sets precedence for AT TIME ZONE */
500 * These might seem to be low-precedence, but actually they are not part
501 * of the arithmetic hierarchy at all in their use as JOIN operators.
502 * We make them high-precedence to support their use as function names.
503 * They wouldn't be given a precedence at all, were it not that we need
504 * left-associativity among the JOIN rules themselves.
506 %left JOIN CROSS LEFT FULL RIGHT INNER_P NATURAL
507 /* kluge to keep xml_whitespace_option from causing shift/reduce conflicts */
508 %right PRESERVE STRIP_P
512 * Handle comment-only lines, and ;; SELECT * FROM pg_class ;;;
513 * psql already handles such cases, but other interfaces don't.
516 stmtblock: stmtmulti { parsetree = $1; }
519 /* the thrashing around here is to discard "empty" statements... */
520 stmtmulti: stmtmulti ';' stmt
522 $$ = lappend($1, $3);
536 | AlterDatabaseSetStmt
540 | AlterObjectSchemaStmt
546 | AlterTSConfigurationStmt
547 | AlterTSDictionaryStmt
560 | CreateConversionStmt
571 | CreateTableSpaceStmt
630 /*****************************************************************************
632 * Create a new Postgres DBMS role
634 *****************************************************************************/
637 CREATE ROLE RoleId opt_with OptRoleList
639 CreateRoleStmt *n = makeNode(CreateRoleStmt);
640 n->stmt_type = ROLESTMT_ROLE;
653 * Options for CREATE ROLE and ALTER ROLE (also used by CREATE/ALTER USER
654 * for backwards compatibility). Note: the only option required by SQL99
655 * is "WITH ADMIN name".
658 OptRoleList OptRoleElem { $$ = lappend($1, $2); }
659 | /* EMPTY */ { $$ = NIL; }
665 $$ = makeDefElem("password",
666 (Node *)makeString($2));
670 $$ = makeDefElem("password", NULL);
672 | ENCRYPTED PASSWORD Sconst
674 $$ = makeDefElem("encryptedPassword",
675 (Node *)makeString($3));
677 | UNENCRYPTED PASSWORD Sconst
679 $$ = makeDefElem("unencryptedPassword",
680 (Node *)makeString($3));
684 $$ = makeDefElem("superuser", (Node *)makeInteger(TRUE));
688 $$ = makeDefElem("superuser", (Node *)makeInteger(FALSE));
692 $$ = makeDefElem("inherit", (Node *)makeInteger(TRUE));
696 $$ = makeDefElem("inherit", (Node *)makeInteger(FALSE));
700 $$ = makeDefElem("createdb", (Node *)makeInteger(TRUE));
704 $$ = makeDefElem("createdb", (Node *)makeInteger(FALSE));
708 $$ = makeDefElem("createrole", (Node *)makeInteger(TRUE));
712 $$ = makeDefElem("createrole", (Node *)makeInteger(FALSE));
716 /* For backwards compatibility, synonym for SUPERUSER */
717 $$ = makeDefElem("superuser", (Node *)makeInteger(TRUE));
721 $$ = makeDefElem("superuser", (Node *)makeInteger(FALSE));
725 $$ = makeDefElem("canlogin", (Node *)makeInteger(TRUE));
729 $$ = makeDefElem("canlogin", (Node *)makeInteger(FALSE));
731 | CONNECTION LIMIT SignedIconst
733 $$ = makeDefElem("connectionlimit", (Node *)makeInteger($3));
737 $$ = makeDefElem("validUntil", (Node *)makeString($3));
739 /* Supported but not documented for roles, for use by ALTER GROUP. */
742 $$ = makeDefElem("rolemembers", (Node *)$2);
744 /* The following are not supported by ALTER ROLE/USER/GROUP */
747 $$ = makeDefElem("sysid", (Node *)makeInteger($2));
751 $$ = makeDefElem("adminmembers", (Node *)$2);
755 $$ = makeDefElem("rolemembers", (Node *)$2);
757 | IN_P ROLE name_list
759 $$ = makeDefElem("addroleto", (Node *)$3);
761 | IN_P GROUP_P name_list
763 $$ = makeDefElem("addroleto", (Node *)$3);
768 /*****************************************************************************
770 * Create a new Postgres DBMS user (role with implied login ability)
772 *****************************************************************************/
775 CREATE USER RoleId opt_with OptRoleList
777 CreateRoleStmt *n = makeNode(CreateRoleStmt);
778 n->stmt_type = ROLESTMT_USER;
786 /*****************************************************************************
788 * Alter a postgresql DBMS role
790 *****************************************************************************/
793 ALTER ROLE RoleId opt_with OptRoleList
795 AlterRoleStmt *n = makeNode(AlterRoleStmt);
797 n->action = +1; /* add, if there are members */
804 ALTER ROLE RoleId SetResetClause
806 AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
814 /*****************************************************************************
816 * Alter a postgresql DBMS user
818 *****************************************************************************/
821 ALTER USER RoleId opt_with OptRoleList
823 AlterRoleStmt *n = makeNode(AlterRoleStmt);
825 n->action = +1; /* add, if there are members */
833 ALTER USER RoleId SetResetClause
835 AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
843 /*****************************************************************************
845 * Drop a postgresql DBMS role
847 * XXX Ideally this would have CASCADE/RESTRICT options, but since a role
848 * might own objects in multiple databases, there is presently no way to
849 * implement either cascading or restricting. Caveat DBA.
850 *****************************************************************************/
855 DropRoleStmt *n = makeNode(DropRoleStmt);
856 n->missing_ok = FALSE;
860 | DROP ROLE IF_P EXISTS name_list
862 DropRoleStmt *n = makeNode(DropRoleStmt);
863 n->missing_ok = TRUE;
869 /*****************************************************************************
871 * Drop a postgresql DBMS user
873 * XXX Ideally this would have CASCADE/RESTRICT options, but since a user
874 * might own objects in multiple databases, there is presently no way to
875 * implement either cascading or restricting. Caveat DBA.
876 *****************************************************************************/
881 DropRoleStmt *n = makeNode(DropRoleStmt);
882 n->missing_ok = FALSE;
886 | DROP USER IF_P EXISTS name_list
888 DropRoleStmt *n = makeNode(DropRoleStmt);
890 n->missing_ok = TRUE;
896 /*****************************************************************************
898 * Create a postgresql group (role without login ability)
900 *****************************************************************************/
903 CREATE GROUP_P RoleId opt_with OptRoleList
905 CreateRoleStmt *n = makeNode(CreateRoleStmt);
906 n->stmt_type = ROLESTMT_GROUP;
914 /*****************************************************************************
916 * Alter a postgresql group
918 *****************************************************************************/
921 ALTER GROUP_P RoleId add_drop USER name_list
923 AlterRoleStmt *n = makeNode(AlterRoleStmt);
926 n->options = list_make1(makeDefElem("rolemembers",
932 add_drop: ADD_P { $$ = +1; }
937 /*****************************************************************************
939 * Drop a postgresql group
941 * XXX see above notes about cascading DROP USER; groups have same problem.
942 *****************************************************************************/
945 DROP GROUP_P name_list
947 DropRoleStmt *n = makeNode(DropRoleStmt);
948 n->missing_ok = FALSE;
952 | DROP GROUP_P IF_P EXISTS name_list
954 DropRoleStmt *n = makeNode(DropRoleStmt);
955 n->missing_ok = TRUE;
962 /*****************************************************************************
964 * Manipulate a schema
966 *****************************************************************************/
969 CREATE SCHEMA OptSchemaName AUTHORIZATION RoleId OptSchemaEltList
971 CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
972 /* One can omit the schema name or the authorization id. */
981 | CREATE SCHEMA ColId OptSchemaEltList
983 CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
984 /* ...but not both */
994 | /* EMPTY */ { $$ = NULL; }
998 OptSchemaEltList schema_stmt { $$ = lappend($1, $2); }
999 | /* EMPTY */ { $$ = NIL; }
1003 * schema_stmt are the ones that can show up inside a CREATE SCHEMA
1004 * statement (in addition to by themselves).
1016 /*****************************************************************************
1018 * Set PG internal variable
1019 * SET name TO 'var_value'
1020 * Include SQL92 syntax (thomas 1997-10-22):
1021 * SET TIME ZONE 'var_value'
1023 *****************************************************************************/
1028 VariableSetStmt *n = $2;
1029 n->is_local = false;
1032 | SET LOCAL set_rest
1034 VariableSetStmt *n = $3;
1038 | SET SESSION set_rest
1040 VariableSetStmt *n = $3;
1041 n->is_local = false;
1046 set_rest: /* Generic SET syntaxes: */
1047 var_name TO var_list
1049 VariableSetStmt *n = makeNode(VariableSetStmt);
1050 n->kind = VAR_SET_VALUE;
1055 | var_name '=' var_list
1057 VariableSetStmt *n = makeNode(VariableSetStmt);
1058 n->kind = VAR_SET_VALUE;
1063 | var_name TO DEFAULT
1065 VariableSetStmt *n = makeNode(VariableSetStmt);
1066 n->kind = VAR_SET_DEFAULT;
1070 | var_name '=' DEFAULT
1072 VariableSetStmt *n = makeNode(VariableSetStmt);
1073 n->kind = VAR_SET_DEFAULT;
1077 | var_name FROM CURRENT_P
1079 VariableSetStmt *n = makeNode(VariableSetStmt);
1080 n->kind = VAR_SET_CURRENT;
1084 /* Special syntaxes mandated by SQL standard: */
1085 | TIME ZONE zone_value
1087 VariableSetStmt *n = makeNode(VariableSetStmt);
1088 n->kind = VAR_SET_VALUE;
1089 n->name = "timezone";
1091 n->args = list_make1($3);
1093 n->kind = VAR_SET_DEFAULT;
1096 | TRANSACTION transaction_mode_list
1098 VariableSetStmt *n = makeNode(VariableSetStmt);
1099 n->kind = VAR_SET_MULTI;
1100 n->name = "TRANSACTION";
1104 | SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list
1106 VariableSetStmt *n = makeNode(VariableSetStmt);
1107 n->kind = VAR_SET_MULTI;
1108 n->name = "SESSION CHARACTERISTICS";
1112 | NAMES opt_encoding
1114 VariableSetStmt *n = makeNode(VariableSetStmt);
1115 n->kind = VAR_SET_VALUE;
1116 n->name = "client_encoding";
1118 n->args = list_make1(makeStringConst($2));
1120 n->kind = VAR_SET_DEFAULT;
1123 | ROLE ColId_or_Sconst
1125 VariableSetStmt *n = makeNode(VariableSetStmt);
1126 n->kind = VAR_SET_VALUE;
1128 n->args = list_make1(makeStringConst($2));
1131 | SESSION AUTHORIZATION ColId_or_Sconst
1133 VariableSetStmt *n = makeNode(VariableSetStmt);
1134 n->kind = VAR_SET_VALUE;
1135 n->name = "session_authorization";
1136 n->args = list_make1(makeStringConst($3));
1139 | SESSION AUTHORIZATION DEFAULT
1141 VariableSetStmt *n = makeNode(VariableSetStmt);
1142 n->kind = VAR_SET_DEFAULT;
1143 n->name = "session_authorization";
1146 | XML_P OPTION document_or_content
1148 VariableSetStmt *n = makeNode(VariableSetStmt);
1149 n->kind = VAR_SET_VALUE;
1150 n->name = "xmloption";
1151 n->args = list_make1(makeStringConst($3 == XMLOPTION_DOCUMENT ? "DOCUMENT" : "CONTENT"));
1156 var_name: ColId { $$ = $1; }
1157 | var_name '.' ColId
1159 $$ = palloc(strlen($1) + strlen($3) + 2);
1160 sprintf($$, "%s.%s", $1, $3);
1164 var_list: var_value { $$ = list_make1($1); }
1165 | var_list ',' var_value { $$ = lappend($1, $3); }
1168 var_value: opt_boolean
1169 { $$ = makeStringConst($1); }
1171 { $$ = makeStringConst($1); }
1173 { $$ = makeAConst($1); }
1176 iso_level: READ UNCOMMITTED { $$ = "read uncommitted"; }
1177 | READ COMMITTED { $$ = "read committed"; }
1178 | REPEATABLE READ { $$ = "repeatable read"; }
1179 | SERIALIZABLE { $$ = "serializable"; }
1183 TRUE_P { $$ = "true"; }
1184 | FALSE_P { $$ = "false"; }
1186 | OFF { $$ = "off"; }
1189 /* Timezone values can be:
1190 * - a string such as 'pst8pdt'
1191 * - an identifier such as "pst8pdt"
1192 * - an integer or floating point number
1193 * - a time interval per SQL99
1194 * ColId gives reduce/reduce errors against ConstInterval and LOCAL,
1195 * so use IDENT and reject anything which is a reserved word.
1200 $$ = makeStringConst($1);
1204 $$ = makeStringConst($1);
1206 | ConstInterval Sconst opt_interval
1209 if ($3 != INTERVAL_FULL_RANGE)
1211 if (($3 & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0)
1213 (errcode(ERRCODE_SYNTAX_ERROR),
1214 errmsg("time zone interval must be HOUR or HOUR TO MINUTE")));
1215 t->typmods = list_make1(makeIntConst($3));
1217 $$ = makeStringConstCast($2, t);
1219 | ConstInterval '(' Iconst ')' Sconst opt_interval
1222 if (($6 != INTERVAL_FULL_RANGE)
1223 && (($6 & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0))
1225 (errcode(ERRCODE_SYNTAX_ERROR),
1226 errmsg("time zone interval must be HOUR or HOUR TO MINUTE")));
1227 t->typmods = list_make2(makeIntConst($6),
1229 $$ = makeStringConstCast($5, t);
1231 | NumericOnly { $$ = makeAConst($1); }
1232 | DEFAULT { $$ = NULL; }
1233 | LOCAL { $$ = NULL; }
1238 | DEFAULT { $$ = NULL; }
1239 | /*EMPTY*/ { $$ = NULL; }
1244 | SCONST { $$ = $1; }
1250 VariableSetStmt *n = makeNode(VariableSetStmt);
1251 n->kind = VAR_RESET;
1257 VariableSetStmt *n = makeNode(VariableSetStmt);
1258 n->kind = VAR_RESET;
1259 n->name = "timezone";
1262 | RESET TRANSACTION ISOLATION LEVEL
1264 VariableSetStmt *n = makeNode(VariableSetStmt);
1265 n->kind = VAR_RESET;
1266 n->name = "transaction_isolation";
1269 | RESET SESSION AUTHORIZATION
1271 VariableSetStmt *n = makeNode(VariableSetStmt);
1272 n->kind = VAR_RESET;
1273 n->name = "session_authorization";
1278 VariableSetStmt *n = makeNode(VariableSetStmt);
1279 n->kind = VAR_RESET_ALL;
1284 /* SetResetClause allows SET or RESET without LOCAL */
1286 SET set_rest { $$ = $2; }
1287 | VariableResetStmt { $$ = (VariableSetStmt *) $1; }
1294 VariableShowStmt *n = makeNode(VariableShowStmt);
1300 VariableShowStmt *n = makeNode(VariableShowStmt);
1301 n->name = "timezone";
1304 | SHOW TRANSACTION ISOLATION LEVEL
1306 VariableShowStmt *n = makeNode(VariableShowStmt);
1307 n->name = "transaction_isolation";
1310 | SHOW SESSION AUTHORIZATION
1312 VariableShowStmt *n = makeNode(VariableShowStmt);
1313 n->name = "session_authorization";
1318 VariableShowStmt *n = makeNode(VariableShowStmt);
1326 SET CONSTRAINTS constraints_set_list constraints_set_mode
1328 ConstraintsSetStmt *n = makeNode(ConstraintsSetStmt);
1329 n->constraints = $3;
1335 constraints_set_list:
1337 | qualified_name_list { $$ = $1; }
1340 constraints_set_mode:
1341 DEFERRED { $$ = TRUE; }
1342 | IMMEDIATE { $$ = FALSE; }
1347 * Checkpoint statement
1352 CheckPointStmt *n = makeNode(CheckPointStmt);
1358 /*****************************************************************************
1360 * DISCARD { ALL | TEMP | PLANS }
1362 *****************************************************************************/
1367 DiscardStmt *n = makeNode(DiscardStmt);
1368 n->target = DISCARD_ALL;
1373 DiscardStmt *n = makeNode(DiscardStmt);
1374 n->target = DISCARD_TEMP;
1379 DiscardStmt *n = makeNode(DiscardStmt);
1380 n->target = DISCARD_TEMP;
1385 DiscardStmt *n = makeNode(DiscardStmt);
1386 n->target = DISCARD_PLANS;
1392 /*****************************************************************************
1394 * ALTER [ TABLE | INDEX ] variations
1396 *****************************************************************************/
1399 ALTER TABLE relation_expr alter_table_cmds
1401 AlterTableStmt *n = makeNode(AlterTableStmt);
1404 n->relkind = OBJECT_TABLE;
1407 | ALTER INDEX relation_expr alter_rel_cmds
1409 AlterTableStmt *n = makeNode(AlterTableStmt);
1412 n->relkind = OBJECT_INDEX;
1418 alter_table_cmd { $$ = list_make1($1); }
1419 | alter_table_cmds ',' alter_table_cmd { $$ = lappend($1, $3); }
1422 /* Subcommands that are for ALTER TABLE only */
1424 /* ALTER TABLE <relation> ADD [COLUMN] <coldef> */
1425 ADD_P opt_column columnDef
1427 AlterTableCmd *n = makeNode(AlterTableCmd);
1428 n->subtype = AT_AddColumn;
1432 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> {SET DEFAULT <expr>|DROP DEFAULT} */
1433 | ALTER opt_column ColId alter_column_default
1435 AlterTableCmd *n = makeNode(AlterTableCmd);
1436 n->subtype = AT_ColumnDefault;
1441 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> DROP NOT NULL */
1442 | ALTER opt_column ColId DROP NOT NULL_P
1444 AlterTableCmd *n = makeNode(AlterTableCmd);
1445 n->subtype = AT_DropNotNull;
1449 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET NOT NULL */
1450 | ALTER opt_column ColId SET NOT NULL_P
1452 AlterTableCmd *n = makeNode(AlterTableCmd);
1453 n->subtype = AT_SetNotNull;
1457 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET STATISTICS <IntegerOnly> */
1458 | ALTER opt_column ColId SET STATISTICS IntegerOnly
1460 AlterTableCmd *n = makeNode(AlterTableCmd);
1461 n->subtype = AT_SetStatistics;
1463 n->def = (Node *) $6;
1466 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET STORAGE <storagemode> */
1467 | ALTER opt_column ColId SET STORAGE ColId
1469 AlterTableCmd *n = makeNode(AlterTableCmd);
1470 n->subtype = AT_SetStorage;
1472 n->def = (Node *) makeString($6);
1475 /* ALTER TABLE <relation> DROP [COLUMN] <colname> [RESTRICT|CASCADE] */
1476 | DROP opt_column ColId opt_drop_behavior
1478 AlterTableCmd *n = makeNode(AlterTableCmd);
1479 n->subtype = AT_DropColumn;
1485 * ALTER TABLE <relation> ALTER [COLUMN] <colname> TYPE <typename>
1486 * [ USING <expression> ]
1488 | ALTER opt_column ColId TYPE_P Typename alter_using
1490 AlterTableCmd *n = makeNode(AlterTableCmd);
1491 n->subtype = AT_AlterColumnType;
1493 n->def = (Node *) $5;
1497 /* ALTER TABLE <relation> ADD CONSTRAINT ... */
1498 | ADD_P TableConstraint
1500 AlterTableCmd *n = makeNode(AlterTableCmd);
1501 n->subtype = AT_AddConstraint;
1505 /* ALTER TABLE <relation> DROP CONSTRAINT <name> [RESTRICT|CASCADE] */
1506 | DROP CONSTRAINT name opt_drop_behavior
1508 AlterTableCmd *n = makeNode(AlterTableCmd);
1509 n->subtype = AT_DropConstraint;
1514 /* ALTER TABLE <relation> SET WITHOUT OIDS */
1517 AlterTableCmd *n = makeNode(AlterTableCmd);
1518 n->subtype = AT_DropOids;
1521 /* ALTER TABLE <name> CLUSTER ON <indexname> */
1524 AlterTableCmd *n = makeNode(AlterTableCmd);
1525 n->subtype = AT_ClusterOn;
1529 /* ALTER TABLE <name> SET WITHOUT CLUSTER */
1530 | SET WITHOUT CLUSTER
1532 AlterTableCmd *n = makeNode(AlterTableCmd);
1533 n->subtype = AT_DropCluster;
1537 /* ALTER TABLE <name> ENABLE TRIGGER <trig> */
1538 | ENABLE_P TRIGGER name
1540 AlterTableCmd *n = makeNode(AlterTableCmd);
1541 n->subtype = AT_EnableTrig;
1545 /* ALTER TABLE <name> ENABLE ALWAYS TRIGGER <trig> */
1546 | ENABLE_P ALWAYS TRIGGER name
1548 AlterTableCmd *n = makeNode(AlterTableCmd);
1549 n->subtype = AT_EnableAlwaysTrig;
1553 /* ALTER TABLE <name> ENABLE REPLICA TRIGGER <trig> */
1554 | ENABLE_P REPLICA TRIGGER name
1556 AlterTableCmd *n = makeNode(AlterTableCmd);
1557 n->subtype = AT_EnableReplicaTrig;
1561 /* ALTER TABLE <name> ENABLE TRIGGER ALL */
1562 | ENABLE_P TRIGGER ALL
1564 AlterTableCmd *n = makeNode(AlterTableCmd);
1565 n->subtype = AT_EnableTrigAll;
1568 /* ALTER TABLE <name> ENABLE TRIGGER USER */
1569 | ENABLE_P TRIGGER USER
1571 AlterTableCmd *n = makeNode(AlterTableCmd);
1572 n->subtype = AT_EnableTrigUser;
1575 /* ALTER TABLE <name> DISABLE TRIGGER <trig> */
1576 | DISABLE_P TRIGGER name
1578 AlterTableCmd *n = makeNode(AlterTableCmd);
1579 n->subtype = AT_DisableTrig;
1583 /* ALTER TABLE <name> DISABLE TRIGGER ALL */
1584 | DISABLE_P TRIGGER ALL
1586 AlterTableCmd *n = makeNode(AlterTableCmd);
1587 n->subtype = AT_DisableTrigAll;
1590 /* ALTER TABLE <name> DISABLE TRIGGER USER */
1591 | DISABLE_P TRIGGER USER
1593 AlterTableCmd *n = makeNode(AlterTableCmd);
1594 n->subtype = AT_DisableTrigUser;
1597 /* ALTER TABLE <name> ENABLE RULE <rule> */
1598 | ENABLE_P RULE name
1600 AlterTableCmd *n = makeNode(AlterTableCmd);
1601 n->subtype = AT_EnableRule;
1605 /* ALTER TABLE <name> ENABLE ALWAYS RULE <rule> */
1606 | ENABLE_P ALWAYS RULE name
1608 AlterTableCmd *n = makeNode(AlterTableCmd);
1609 n->subtype = AT_EnableAlwaysRule;
1613 /* ALTER TABLE <name> ENABLE REPLICA RULE <rule> */
1614 | ENABLE_P REPLICA RULE name
1616 AlterTableCmd *n = makeNode(AlterTableCmd);
1617 n->subtype = AT_EnableReplicaRule;
1621 /* ALTER TABLE <name> DISABLE RULE <rule> */
1622 | DISABLE_P RULE name
1624 AlterTableCmd *n = makeNode(AlterTableCmd);
1625 n->subtype = AT_DisableRule;
1629 /* ALTER TABLE <name> INHERIT <parent> */
1630 | INHERIT qualified_name
1632 AlterTableCmd *n = makeNode(AlterTableCmd);
1633 n->subtype = AT_AddInherit;
1634 n->def = (Node *) $2;
1637 /* ALTER TABLE <name> NO INHERIT <parent> */
1638 | NO INHERIT qualified_name
1640 AlterTableCmd *n = makeNode(AlterTableCmd);
1641 n->subtype = AT_DropInherit;
1642 n->def = (Node *) $3;
1652 alter_rel_cmd { $$ = list_make1($1); }
1653 | alter_rel_cmds ',' alter_rel_cmd { $$ = lappend($1, $3); }
1656 /* Subcommands that are for ALTER TABLE or ALTER INDEX */
1658 /* ALTER [TABLE|INDEX] <name> OWNER TO RoleId */
1661 AlterTableCmd *n = makeNode(AlterTableCmd);
1662 n->subtype = AT_ChangeOwner;
1666 /* ALTER [TABLE|INDEX] <name> SET TABLESPACE <tablespacename> */
1667 | SET TABLESPACE name
1669 AlterTableCmd *n = makeNode(AlterTableCmd);
1670 n->subtype = AT_SetTableSpace;
1674 /* ALTER [TABLE|INDEX] <name> SET (...) */
1677 AlterTableCmd *n = makeNode(AlterTableCmd);
1678 n->subtype = AT_SetRelOptions;
1679 n->def = (Node *)$2;
1682 /* ALTER [TABLE|INDEX] <name> RESET (...) */
1685 AlterTableCmd *n = makeNode(AlterTableCmd);
1686 n->subtype = AT_ResetRelOptions;
1687 n->def = (Node *)$2;
1692 alter_column_default:
1693 SET DEFAULT a_expr { $$ = $3; }
1694 | DROP DEFAULT { $$ = NULL; }
1698 CASCADE { $$ = DROP_CASCADE; }
1699 | RESTRICT { $$ = DROP_RESTRICT; }
1700 | /* EMPTY */ { $$ = DROP_RESTRICT; /* default */ }
1704 USING a_expr { $$ = $2; }
1705 | /* EMPTY */ { $$ = NULL; }
1710 /*****************************************************************************
1713 * close <portalname>
1715 *****************************************************************************/
1720 ClosePortalStmt *n = makeNode(ClosePortalStmt);
1726 ClosePortalStmt *n = makeNode(ClosePortalStmt);
1727 n->portalname = NULL;
1733 /*****************************************************************************
1736 * COPY relname ['(' columnList ')'] FROM/TO file [WITH options]
1738 * BINARY, OIDS, and DELIMITERS kept in old locations
1739 * for backward compatibility. 2002-06-18
1741 * COPY ( SELECT ... ) TO file [WITH options]
1742 * This form doesn't have the backwards-compatible option
1745 *****************************************************************************/
1747 CopyStmt: COPY opt_binary qualified_name opt_column_list opt_oids
1748 copy_from copy_file_name copy_delimiter opt_with copy_opt_list
1750 CopyStmt *n = makeNode(CopyStmt);
1758 /* Concatenate user-supplied flags */
1760 n->options = lappend(n->options, $2);
1762 n->options = lappend(n->options, $5);
1764 n->options = lappend(n->options, $8);
1766 n->options = list_concat(n->options, $10);
1769 | COPY select_with_parens TO copy_file_name opt_with
1772 CopyStmt *n = makeNode(CopyStmt);
1785 | TO { $$ = FALSE; }
1789 * copy_file_name NULL indicates stdio is used. Whether stdin or stdout is
1790 * used depends on the direction. (It really doesn't make sense to copy from
1791 * stdout. We silently correct the "typo".) - AY 9/94
1795 | STDIN { $$ = NULL; }
1796 | STDOUT { $$ = NULL; }
1802 copy_opt_list copy_opt_item { $$ = lappend($1, $2); }
1803 | /* EMPTY */ { $$ = NIL; }
1810 $$ = makeDefElem("binary", (Node *)makeInteger(TRUE));
1814 $$ = makeDefElem("oids", (Node *)makeInteger(TRUE));
1816 | DELIMITER opt_as Sconst
1818 $$ = makeDefElem("delimiter", (Node *)makeString($3));
1820 | NULL_P opt_as Sconst
1822 $$ = makeDefElem("null", (Node *)makeString($3));
1826 $$ = makeDefElem("csv", (Node *)makeInteger(TRUE));
1830 $$ = makeDefElem("header", (Node *)makeInteger(TRUE));
1832 | QUOTE opt_as Sconst
1834 $$ = makeDefElem("quote", (Node *)makeString($3));
1836 | ESCAPE opt_as Sconst
1838 $$ = makeDefElem("escape", (Node *)makeString($3));
1840 | FORCE QUOTE columnList
1842 $$ = makeDefElem("force_quote", (Node *)$3);
1844 | FORCE NOT NULL_P columnList
1846 $$ = makeDefElem("force_notnull", (Node *)$4);
1850 /* The following exist for backward compatibility */
1855 $$ = makeDefElem("binary", (Node *)makeInteger(TRUE));
1857 | /*EMPTY*/ { $$ = NULL; }
1863 $$ = makeDefElem("oids", (Node *)makeInteger(TRUE));
1865 | /*EMPTY*/ { $$ = NULL; }
1869 /* USING DELIMITERS kept for backward compatibility. 2002-06-15 */
1870 opt_using DELIMITERS Sconst
1872 $$ = makeDefElem("delimiter", (Node *)makeString($3));
1874 | /*EMPTY*/ { $$ = NULL; }
1883 /*****************************************************************************
1886 * CREATE TABLE relname
1888 *****************************************************************************/
1890 CreateStmt: CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')'
1891 OptInherit OptWith OnCommitOption OptTableSpace
1893 CreateStmt *n = makeNode(CreateStmt);
1897 n->inhRelations = $8;
1898 n->constraints = NIL;
1901 n->tablespacename = $11;
1904 | CREATE OptTemp TABLE qualified_name OF qualified_name
1905 '(' OptTableElementList ')' OptWith OnCommitOption OptTableSpace
1907 /* SQL99 CREATE TABLE OF <UDT> (cols) seems to be satisfied
1908 * by our inheritance capabilities. Let's try it...
1910 CreateStmt *n = makeNode(CreateStmt);
1914 n->inhRelations = list_make1($6);
1915 n->constraints = NIL;
1918 n->tablespacename = $12;
1924 * Redundancy here is needed to avoid shift/reduce conflicts,
1925 * since TEMP is not a reserved word. See also OptTempTableName.
1927 * NOTE: we accept both GLOBAL and LOCAL options; since we have no modules
1928 * the LOCAL keyword is really meaningless.
1930 OptTemp: TEMPORARY { $$ = TRUE; }
1931 | TEMP { $$ = TRUE; }
1932 | LOCAL TEMPORARY { $$ = TRUE; }
1933 | LOCAL TEMP { $$ = TRUE; }
1934 | GLOBAL TEMPORARY { $$ = TRUE; }
1935 | GLOBAL TEMP { $$ = TRUE; }
1936 | /*EMPTY*/ { $$ = FALSE; }
1939 OptTableElementList:
1940 TableElementList { $$ = $1; }
1941 | /*EMPTY*/ { $$ = NIL; }
1947 $$ = list_make1($1);
1949 | TableElementList ',' TableElement
1951 $$ = lappend($1, $3);
1956 columnDef { $$ = $1; }
1957 | TableLikeClause { $$ = $1; }
1958 | TableConstraint { $$ = $1; }
1961 columnDef: ColId Typename ColQualList
1963 ColumnDef *n = makeNode(ColumnDef);
1966 n->constraints = $3;
1973 ColQualList ColConstraint { $$ = lappend($1, $2); }
1974 | /*EMPTY*/ { $$ = NIL; }
1978 CONSTRAINT name ColConstraintElem
1980 switch (nodeTag($3))
1984 Constraint *n = (Constraint *)$3;
1988 case T_FkConstraint:
1990 FkConstraint *n = (FkConstraint *)$3;
1991 n->constr_name = $2;
1999 | ColConstraintElem { $$ = $1; }
2000 | ConstraintAttr { $$ = $1; }
2003 /* DEFAULT NULL is already the default for Postgres.
2004 * But define it here and carry it forward into the system
2005 * to make it explicit.
2006 * - thomas 1998-09-13
2008 * WITH NULL and NULL are not SQL92-standard syntax elements,
2009 * so leave them out. Use DEFAULT NULL to explicitly indicate
2010 * that a column may have that value. WITH NULL leads to
2011 * shift/reduce conflicts with WITH TIME ZONE anyway.
2012 * - thomas 1999-01-08
2014 * DEFAULT expression must be b_expr not a_expr to prevent shift/reduce
2015 * conflict on NOT (since NOT might start a subsequent NOT NULL constraint,
2016 * or be part of a_expr NOT LIKE or similar constructs).
2021 Constraint *n = makeNode(Constraint);
2022 n->contype = CONSTR_NOTNULL;
2025 n->cooked_expr = NULL;
2027 n->indexspace = NULL;
2032 Constraint *n = makeNode(Constraint);
2033 n->contype = CONSTR_NULL;
2036 n->cooked_expr = NULL;
2038 n->indexspace = NULL;
2041 | UNIQUE opt_definition OptConsTableSpace
2043 Constraint *n = makeNode(Constraint);
2044 n->contype = CONSTR_UNIQUE;
2047 n->cooked_expr = NULL;
2053 | PRIMARY KEY opt_definition OptConsTableSpace
2055 Constraint *n = makeNode(Constraint);
2056 n->contype = CONSTR_PRIMARY;
2059 n->cooked_expr = NULL;
2065 | CHECK '(' a_expr ')'
2067 Constraint *n = makeNode(Constraint);
2068 n->contype = CONSTR_CHECK;
2071 n->cooked_expr = NULL;
2073 n->indexspace = NULL;
2078 Constraint *n = makeNode(Constraint);
2079 n->contype = CONSTR_DEFAULT;
2082 n->cooked_expr = NULL;
2084 n->indexspace = NULL;
2087 | REFERENCES qualified_name opt_column_list key_match key_actions
2089 FkConstraint *n = makeNode(FkConstraint);
2090 n->constr_name = NULL;
2094 n->fk_matchtype = $4;
2095 n->fk_upd_action = (char) ($5 >> 8);
2096 n->fk_del_action = (char) ($5 & 0xFF);
2097 n->deferrable = FALSE;
2098 n->initdeferred = FALSE;
2104 * ConstraintAttr represents constraint attributes, which we parse as if
2105 * they were independent constraint clauses, in order to avoid shift/reduce
2106 * conflicts (since NOT might start either an independent NOT NULL clause
2107 * or an attribute). parse_utilcmd.c is responsible for attaching the
2108 * attribute information to the preceding "real" constraint node, and for
2109 * complaining if attribute clauses appear in the wrong place or wrong
2112 * See also ConstraintAttributeSpec, which can be used in places where
2113 * there is no parsing conflict.
2118 Constraint *n = makeNode(Constraint);
2119 n->contype = CONSTR_ATTR_DEFERRABLE;
2124 Constraint *n = makeNode(Constraint);
2125 n->contype = CONSTR_ATTR_NOT_DEFERRABLE;
2128 | INITIALLY DEFERRED
2130 Constraint *n = makeNode(Constraint);
2131 n->contype = CONSTR_ATTR_DEFERRED;
2134 | INITIALLY IMMEDIATE
2136 Constraint *n = makeNode(Constraint);
2137 n->contype = CONSTR_ATTR_IMMEDIATE;
2144 * SQL99 supports wholesale borrowing of a table definition via the LIKE clause.
2145 * This seems to be a poor man's inheritance capability, with the resulting
2146 * tables completely decoupled except for the original commonality in definitions.
2148 * This is very similar to CREATE TABLE AS except for the INCLUDING DEFAULTS extension
2149 * which is a part of SQL 200N
2152 LIKE qualified_name TableLikeOptionList
2154 InhRelation *n = makeNode(InhRelation);
2161 TableLikeOptionList:
2162 TableLikeOptionList TableLikeOption { $$ = lappend_int($1, $2); }
2163 | /* EMPTY */ { $$ = NIL; }
2167 INCLUDING DEFAULTS { $$ = CREATE_TABLE_LIKE_INCLUDING_DEFAULTS; }
2168 | EXCLUDING DEFAULTS { $$ = CREATE_TABLE_LIKE_EXCLUDING_DEFAULTS; }
2169 | INCLUDING CONSTRAINTS { $$ = CREATE_TABLE_LIKE_INCLUDING_CONSTRAINTS; }
2170 | EXCLUDING CONSTRAINTS { $$ = CREATE_TABLE_LIKE_EXCLUDING_CONSTRAINTS; }
2171 | INCLUDING INDEXES { $$ = CREATE_TABLE_LIKE_INCLUDING_INDEXES; }
2172 | EXCLUDING INDEXES { $$ = CREATE_TABLE_LIKE_EXCLUDING_INDEXES; }
2176 /* ConstraintElem specifies constraint syntax which is not embedded into
2177 * a column definition. ColConstraintElem specifies the embedded form.
2178 * - thomas 1997-12-03
2181 CONSTRAINT name ConstraintElem
2183 switch (nodeTag($3))
2187 Constraint *n = (Constraint *)$3;
2191 case T_FkConstraint:
2193 FkConstraint *n = (FkConstraint *)$3;
2194 n->constr_name = $2;
2202 | ConstraintElem { $$ = $1; }
2206 CHECK '(' a_expr ')'
2208 Constraint *n = makeNode(Constraint);
2209 n->contype = CONSTR_CHECK;
2212 n->cooked_expr = NULL;
2213 n->indexspace = NULL;
2216 | UNIQUE '(' columnList ')' opt_definition OptConsTableSpace
2218 Constraint *n = makeNode(Constraint);
2219 n->contype = CONSTR_UNIQUE;
2222 n->cooked_expr = NULL;
2228 | PRIMARY KEY '(' columnList ')' opt_definition OptConsTableSpace
2230 Constraint *n = makeNode(Constraint);
2231 n->contype = CONSTR_PRIMARY;
2234 n->cooked_expr = NULL;
2240 | FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
2241 opt_column_list key_match key_actions ConstraintAttributeSpec
2243 FkConstraint *n = makeNode(FkConstraint);
2244 n->constr_name = NULL;
2248 n->fk_matchtype = $9;
2249 n->fk_upd_action = (char) ($10 >> 8);
2250 n->fk_del_action = (char) ($10 & 0xFF);
2251 n->deferrable = ($11 & 1) != 0;
2252 n->initdeferred = ($11 & 2) != 0;
2258 '(' columnList ')' { $$ = $2; }
2259 | /*EMPTY*/ { $$ = NIL; }
2263 columnElem { $$ = list_make1($1); }
2264 | columnList ',' columnElem { $$ = lappend($1, $3); }
2269 $$ = (Node *) makeString($1);
2273 key_match: MATCH FULL
2275 $$ = FKCONSTR_MATCH_FULL;
2280 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2281 errmsg("MATCH PARTIAL not yet implemented")));
2282 $$ = FKCONSTR_MATCH_PARTIAL;
2286 $$ = FKCONSTR_MATCH_UNSPECIFIED;
2290 $$ = FKCONSTR_MATCH_UNSPECIFIED;
2295 * We combine the update and delete actions into one value temporarily
2296 * for simplicity of parsing, and then break them down again in the
2297 * calling production. update is in the left 8 bits, delete in the right.
2298 * Note that NOACTION is the default.
2302 { $$ = ($1 << 8) | (FKCONSTR_ACTION_NOACTION & 0xFF); }
2304 { $$ = (FKCONSTR_ACTION_NOACTION << 8) | ($1 & 0xFF); }
2305 | key_update key_delete
2306 { $$ = ($1 << 8) | ($2 & 0xFF); }
2307 | key_delete key_update
2308 { $$ = ($2 << 8) | ($1 & 0xFF); }
2310 { $$ = (FKCONSTR_ACTION_NOACTION << 8) | (FKCONSTR_ACTION_NOACTION & 0xFF); }
2313 key_update: ON UPDATE key_action { $$ = $3; }
2316 key_delete: ON DELETE_P key_action { $$ = $3; }
2320 NO ACTION { $$ = FKCONSTR_ACTION_NOACTION; }
2321 | RESTRICT { $$ = FKCONSTR_ACTION_RESTRICT; }
2322 | CASCADE { $$ = FKCONSTR_ACTION_CASCADE; }
2323 | SET NULL_P { $$ = FKCONSTR_ACTION_SETNULL; }
2324 | SET DEFAULT { $$ = FKCONSTR_ACTION_SETDEFAULT; }
2327 OptInherit: INHERITS '(' qualified_name_list ')' { $$ = $3; }
2328 | /*EMPTY*/ { $$ = NIL; }
2331 /* WITH (options) is preferred, WITH OIDS and WITHOUT OIDS are legacy forms */
2333 WITH definition { $$ = $2; }
2334 | WITH OIDS { $$ = list_make1(defWithOids(true)); }
2335 | WITHOUT OIDS { $$ = list_make1(defWithOids(false)); }
2336 | /*EMPTY*/ { $$ = NIL; }
2339 OnCommitOption: ON COMMIT DROP { $$ = ONCOMMIT_DROP; }
2340 | ON COMMIT DELETE_P ROWS { $$ = ONCOMMIT_DELETE_ROWS; }
2341 | ON COMMIT PRESERVE ROWS { $$ = ONCOMMIT_PRESERVE_ROWS; }
2342 | /*EMPTY*/ { $$ = ONCOMMIT_NOOP; }
2345 OptTableSpace: TABLESPACE name { $$ = $2; }
2346 | /*EMPTY*/ { $$ = NULL; }
2349 OptConsTableSpace: USING INDEX TABLESPACE name { $$ = $4; }
2350 | /*EMPTY*/ { $$ = NULL; }
2355 * Note: CREATE TABLE ... AS SELECT ... is just another spelling for
2360 CREATE OptTemp TABLE create_as_target AS SelectStmt
2363 * When the SelectStmt is a set-operation tree, we must
2364 * stuff the INTO information into the leftmost component
2365 * Select, because that's where analyze.c will expect
2366 * to find it. Similarly, the output column names must
2367 * be attached to that Select's target list.
2369 SelectStmt *n = findLeftmostSelect((SelectStmt *) $6);
2370 if (n->intoClause != NULL)
2372 (errcode(ERRCODE_SYNTAX_ERROR),
2373 errmsg("CREATE TABLE AS cannot specify INTO")));
2374 $4->rel->istemp = $2;
2381 qualified_name OptCreateAs OptWith OnCommitOption OptTableSpace
2383 $$ = makeNode(IntoClause);
2388 $$->tableSpaceName = $5;
2393 '(' CreateAsList ')' { $$ = $2; }
2394 | /*EMPTY*/ { $$ = NIL; }
2398 CreateAsElement { $$ = list_make1($1); }
2399 | CreateAsList ',' CreateAsElement { $$ = lappend($1, $3); }
2405 ColumnDef *n = makeNode(ColumnDef);
2410 n->is_not_null = false;
2411 n->raw_default = NULL;
2412 n->cooked_default = NULL;
2413 n->constraints = NIL;
2419 /*****************************************************************************
2422 * CREATE SEQUENCE seqname
2423 * ALTER SEQUENCE seqname
2425 *****************************************************************************/
2428 CREATE OptTemp SEQUENCE qualified_name OptSeqList
2430 CreateSeqStmt *n = makeNode(CreateSeqStmt);
2439 ALTER SEQUENCE qualified_name OptSeqList
2441 AlterSeqStmt *n = makeNode(AlterSeqStmt);
2448 OptSeqList: OptSeqList OptSeqElem { $$ = lappend($1, $2); }
2449 | /*EMPTY*/ { $$ = NIL; }
2452 OptSeqElem: CACHE NumericOnly
2454 $$ = makeDefElem("cache", (Node *)$2);
2458 $$ = makeDefElem("cycle", (Node *)makeInteger(TRUE));
2462 $$ = makeDefElem("cycle", (Node *)makeInteger(FALSE));
2464 | INCREMENT opt_by NumericOnly
2466 $$ = makeDefElem("increment", (Node *)$3);
2468 | MAXVALUE NumericOnly
2470 $$ = makeDefElem("maxvalue", (Node *)$2);
2472 | MINVALUE NumericOnly
2474 $$ = makeDefElem("minvalue", (Node *)$2);
2478 $$ = makeDefElem("maxvalue", NULL);
2482 $$ = makeDefElem("minvalue", NULL);
2486 $$ = makeDefElem("owned_by", (Node *)$3);
2488 | START opt_with NumericOnly
2490 $$ = makeDefElem("start", (Node *)$3);
2492 | RESTART opt_with NumericOnly
2494 $$ = makeDefElem("restart", (Node *)$3);
2503 FloatOnly { $$ = $1; }
2504 | IntegerOnly { $$ = $1; }
2507 FloatOnly: FCONST { $$ = makeFloat($1); }
2515 IntegerOnly: SignedIconst { $$ = makeInteger($1); };
2518 /*****************************************************************************
2521 * CREATE PROCEDURAL LANGUAGE ...
2522 * DROP PROCEDURAL LANGUAGE ...
2524 *****************************************************************************/
2527 CREATE opt_trusted opt_procedural LANGUAGE ColId_or_Sconst
2529 CreatePLangStmt *n = makeNode(CreatePLangStmt);
2531 /* parameters are all to be supplied by system */
2533 n->plvalidator = NIL;
2534 n->pltrusted = false;
2537 | CREATE opt_trusted opt_procedural LANGUAGE ColId_or_Sconst
2538 HANDLER handler_name opt_validator opt_lancompiler
2540 CreatePLangStmt *n = makeNode(CreatePLangStmt);
2543 n->plvalidator = $8;
2545 /* LANCOMPILER is now ignored entirely */
2551 TRUSTED { $$ = TRUE; }
2552 | /*EMPTY*/ { $$ = FALSE; }
2555 /* This ought to be just func_name, but that causes reduce/reduce conflicts
2556 * (CREATE LANGUAGE is the only place where func_name isn't followed by '(').
2557 * Work around by using simple names, instead.
2560 name { $$ = list_make1(makeString($1)); }
2561 | name attrs { $$ = lcons(makeString($1), $2); }
2565 VALIDATOR handler_name { $$ = $2; }
2566 | /*EMPTY*/ { $$ = NIL; }
2570 LANCOMPILER Sconst { $$ = $2; }
2571 | /*EMPTY*/ { $$ = NULL; }
2575 DROP opt_procedural LANGUAGE ColId_or_Sconst opt_drop_behavior
2577 DropPLangStmt *n = makeNode(DropPLangStmt);
2580 n->missing_ok = false;
2583 | DROP opt_procedural LANGUAGE IF_P EXISTS ColId_or_Sconst opt_drop_behavior
2585 DropPLangStmt *n = makeNode(DropPLangStmt);
2588 n->missing_ok = true;
2598 /*****************************************************************************
2601 * CREATE TABLESPACE tablespace LOCATION '/path/to/tablespace/'
2603 *****************************************************************************/
2605 CreateTableSpaceStmt: CREATE TABLESPACE name OptTableSpaceOwner LOCATION Sconst
2607 CreateTableSpaceStmt *n = makeNode(CreateTableSpaceStmt);
2608 n->tablespacename = $3;
2615 OptTableSpaceOwner: OWNER name { $$ = $2; }
2616 | /*EMPTY */ { $$ = NULL; }
2619 /*****************************************************************************
2622 * DROP TABLESPACE <tablespace>
2624 * No need for drop behaviour as we cannot implement dependencies for
2625 * objects in other databases; we can only support RESTRICT.
2627 ****************************************************************************/
2629 DropTableSpaceStmt: DROP TABLESPACE name
2631 DropTableSpaceStmt *n = makeNode(DropTableSpaceStmt);
2632 n->tablespacename = $3;
2633 n->missing_ok = false;
2636 | DROP TABLESPACE IF_P EXISTS name
2638 DropTableSpaceStmt *n = makeNode(DropTableSpaceStmt);
2639 n->tablespacename = $5;
2640 n->missing_ok = true;
2645 /*****************************************************************************
2648 * CREATE TRIGGER ...
2651 *****************************************************************************/
2654 CREATE TRIGGER name TriggerActionTime TriggerEvents ON
2655 qualified_name TriggerForSpec EXECUTE PROCEDURE
2656 func_name '(' TriggerFuncArgs ')'
2658 CreateTrigStmt *n = makeNode(CreateTrigStmt);
2665 memcpy(n->actions, $5, 4);
2666 n->isconstraint = FALSE;
2667 n->deferrable = FALSE;
2668 n->initdeferred = FALSE;
2669 n->constrrel = NULL;
2672 | CREATE CONSTRAINT TRIGGER name AFTER TriggerEvents ON
2673 qualified_name OptConstrFromTable
2674 ConstraintAttributeSpec
2675 FOR EACH ROW EXECUTE PROCEDURE
2676 func_name '(' TriggerFuncArgs ')'
2678 CreateTrigStmt *n = makeNode(CreateTrigStmt);
2685 memcpy(n->actions, $6, 4);
2686 n->isconstraint = TRUE;
2687 n->deferrable = ($10 & 1) != 0;
2688 n->initdeferred = ($10 & 2) != 0;
2696 BEFORE { $$ = TRUE; }
2697 | AFTER { $$ = FALSE; }
2703 char *e = palloc(4);
2704 e[0] = $1; e[1] = '\0';
2707 | TriggerOneEvent OR TriggerOneEvent
2709 char *e = palloc(4);
2710 e[0] = $1; e[1] = $3; e[2] = '\0';
2713 | TriggerOneEvent OR TriggerOneEvent OR TriggerOneEvent
2715 char *e = palloc(4);
2716 e[0] = $1; e[1] = $3; e[2] = $5; e[3] = '\0';
2722 INSERT { $$ = 'i'; }
2723 | DELETE_P { $$ = 'd'; }
2724 | UPDATE { $$ = 'u'; }
2725 | TRUNCATE { $$ = 't'; }
2729 FOR TriggerForOpt TriggerForType
2736 * If ROW/STATEMENT not specified, default to
2737 * STATEMENT, per SQL
2750 | STATEMENT { $$ = FALSE; }
2754 TriggerFuncArg { $$ = list_make1($1); }
2755 | TriggerFuncArgs ',' TriggerFuncArg { $$ = lappend($1, $3); }
2756 | /*EMPTY*/ { $$ = NIL; }
2763 snprintf(buf, sizeof(buf), "%d", $1);
2764 $$ = makeString(pstrdup(buf));
2766 | FCONST { $$ = makeString($1); }
2767 | Sconst { $$ = makeString($1); }
2768 | BCONST { $$ = makeString($1); }
2769 | XCONST { $$ = makeString($1); }
2770 | ColId { $$ = makeString($1); }
2774 FROM qualified_name { $$ = $2; }
2775 | /*EMPTY*/ { $$ = NULL; }
2778 ConstraintAttributeSpec:
2779 ConstraintDeferrabilitySpec
2781 | ConstraintDeferrabilitySpec ConstraintTimeSpec
2783 if ($1 == 0 && $2 != 0)
2785 (errcode(ERRCODE_SYNTAX_ERROR),
2786 errmsg("constraint declared INITIALLY DEFERRED must be DEFERRABLE")));
2789 | ConstraintTimeSpec
2796 | ConstraintTimeSpec ConstraintDeferrabilitySpec
2798 if ($2 == 0 && $1 != 0)
2800 (errcode(ERRCODE_SYNTAX_ERROR),
2801 errmsg("constraint declared INITIALLY DEFERRED must be DEFERRABLE")));
2808 ConstraintDeferrabilitySpec:
2809 NOT DEFERRABLE { $$ = 0; }
2810 | DEFERRABLE { $$ = 1; }
2814 INITIALLY IMMEDIATE { $$ = 0; }
2815 | INITIALLY DEFERRED { $$ = 2; }
2820 DROP TRIGGER name ON qualified_name opt_drop_behavior
2822 DropPropertyStmt *n = makeNode(DropPropertyStmt);
2826 n->removeType = OBJECT_TRIGGER;
2827 n->missing_ok = false;
2830 | DROP TRIGGER IF_P EXISTS name ON qualified_name opt_drop_behavior
2832 DropPropertyStmt *n = makeNode(DropPropertyStmt);
2836 n->removeType = OBJECT_TRIGGER;
2837 n->missing_ok = true;
2843 /*****************************************************************************
2846 * CREATE ASSERTION ...
2847 * DROP ASSERTION ...
2849 *****************************************************************************/
2852 CREATE ASSERTION name CHECK '(' a_expr ')'
2853 ConstraintAttributeSpec
2855 CreateTrigStmt *n = makeNode(CreateTrigStmt);
2857 n->args = list_make1($6);
2858 n->isconstraint = TRUE;
2859 n->deferrable = ($8 & 1) != 0;
2860 n->initdeferred = ($8 & 2) != 0;
2863 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2864 errmsg("CREATE ASSERTION is not yet implemented")));
2871 DROP ASSERTION name opt_drop_behavior
2873 DropPropertyStmt *n = makeNode(DropPropertyStmt);
2877 n->removeType = OBJECT_TRIGGER; /* XXX */
2879 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2880 errmsg("DROP ASSERTION is not yet implemented")));
2886 /*****************************************************************************
2889 * define (aggregate,operator,type)
2891 *****************************************************************************/
2894 CREATE AGGREGATE func_name aggr_args definition
2896 DefineStmt *n = makeNode(DefineStmt);
2897 n->kind = OBJECT_AGGREGATE;
2898 n->oldstyle = false;
2904 | CREATE AGGREGATE func_name old_aggr_definition
2906 /* old-style (pre-8.2) syntax for CREATE AGGREGATE */
2907 DefineStmt *n = makeNode(DefineStmt);
2908 n->kind = OBJECT_AGGREGATE;
2915 | CREATE OPERATOR any_operator definition
2917 DefineStmt *n = makeNode(DefineStmt);
2918 n->kind = OBJECT_OPERATOR;
2919 n->oldstyle = false;
2925 | CREATE TYPE_P any_name definition
2927 DefineStmt *n = makeNode(DefineStmt);
2928 n->kind = OBJECT_TYPE;
2929 n->oldstyle = false;
2935 | CREATE TYPE_P any_name
2937 /* Shell type (identified by lack of definition) */
2938 DefineStmt *n = makeNode(DefineStmt);
2939 n->kind = OBJECT_TYPE;
2940 n->oldstyle = false;
2943 n->definition = NIL;
2946 | CREATE TYPE_P any_name AS '(' TableFuncElementList ')'
2948 CompositeTypeStmt *n = makeNode(CompositeTypeStmt);
2949 RangeVar *r = makeNode(RangeVar);
2951 /* can't use qualified_name, sigh */
2952 switch (list_length($3))
2955 r->catalogname = NULL;
2956 r->schemaname = NULL;
2957 r->relname = strVal(linitial($3));
2960 r->catalogname = NULL;
2961 r->schemaname = strVal(linitial($3));
2962 r->relname = strVal(lsecond($3));
2965 r->catalogname = strVal(linitial($3));
2966 r->schemaname = strVal(lsecond($3));
2967 r->relname = strVal(lthird($3));
2971 (errcode(ERRCODE_SYNTAX_ERROR),
2972 errmsg("improper qualified name (too many dotted names): %s",
2973 NameListToString($3))));
2980 | CREATE TYPE_P any_name AS ENUM_P '(' enum_val_list ')'
2982 CreateEnumStmt *n = makeNode(CreateEnumStmt);
2987 | CREATE TEXT_P SEARCH PARSER any_name definition
2989 DefineStmt *n = makeNode(DefineStmt);
2990 n->kind = OBJECT_TSPARSER;
2996 | CREATE TEXT_P SEARCH DICTIONARY any_name definition
2998 DefineStmt *n = makeNode(DefineStmt);
2999 n->kind = OBJECT_TSDICTIONARY;
3005 | CREATE TEXT_P SEARCH TEMPLATE any_name definition
3007 DefineStmt *n = makeNode(DefineStmt);
3008 n->kind = OBJECT_TSTEMPLATE;
3014 | CREATE TEXT_P SEARCH CONFIGURATION any_name definition
3016 DefineStmt *n = makeNode(DefineStmt);
3017 n->kind = OBJECT_TSCONFIGURATION;
3025 definition: '(' def_list ')' { $$ = $2; }
3028 def_list: def_elem { $$ = list_make1($1); }
3029 | def_list ',' def_elem { $$ = lappend($1, $3); }
3032 def_elem: ColLabel '=' def_arg
3034 $$ = makeDefElem($1, (Node *)$3);
3038 $$ = makeDefElem($1, NULL);
3042 /* Note: any simple identifier will be returned as a type name! */
3043 def_arg: func_type { $$ = (Node *)$1; }
3044 | reserved_keyword { $$ = (Node *)makeString(pstrdup($1)); }
3045 | qual_all_Op { $$ = (Node *)$1; }
3046 | NumericOnly { $$ = (Node *)$1; }
3047 | Sconst { $$ = (Node *)makeString($1); }
3050 aggr_args: '(' type_list ')' { $$ = $2; }
3051 | '(' '*' ')' { $$ = NIL; }
3054 old_aggr_definition: '(' old_aggr_list ')' { $$ = $2; }
3057 old_aggr_list: old_aggr_elem { $$ = list_make1($1); }
3058 | old_aggr_list ',' old_aggr_elem { $$ = lappend($1, $3); }
3061 old_aggr_elem: IDENT '=' def_arg
3063 $$ = makeDefElem($1, (Node *)$3);
3067 enum_val_list: Sconst
3068 { $$ = list_make1(makeString($1)); }
3069 | enum_val_list ',' Sconst
3070 { $$ = lappend($1, makeString($3)); }
3074 /*****************************************************************************
3077 * CREATE OPERATOR CLASS ...
3078 * CREATE OPERATOR FAMILY ...
3079 * ALTER OPERATOR FAMILY ...
3080 * DROP OPERATOR CLASS ...
3081 * DROP OPERATOR FAMILY ...
3083 *****************************************************************************/
3086 CREATE OPERATOR CLASS any_name opt_default FOR TYPE_P Typename
3087 USING access_method opt_opfamily AS opclass_item_list
3089 CreateOpClassStmt *n = makeNode(CreateOpClassStmt);
3090 n->opclassname = $4;
3094 n->opfamilyname = $11;
3101 opclass_item { $$ = list_make1($1); }
3102 | opclass_item_list ',' opclass_item { $$ = lappend($1, $3); }
3106 OPERATOR Iconst any_operator opt_recheck
3108 CreateOpClassItem *n = makeNode(CreateOpClassItem);
3109 n->itemtype = OPCLASS_ITEM_OPERATOR;
3115 | OPERATOR Iconst any_operator '(' oper_argtypes ')' opt_recheck
3117 CreateOpClassItem *n = makeNode(CreateOpClassItem);
3118 n->itemtype = OPCLASS_ITEM_OPERATOR;
3124 | FUNCTION Iconst func_name func_args
3126 CreateOpClassItem *n = makeNode(CreateOpClassItem);
3127 n->itemtype = OPCLASS_ITEM_FUNCTION;
3129 n->args = extractArgTypes($4);
3133 | FUNCTION Iconst '(' type_list ')' func_name func_args
3135 CreateOpClassItem *n = makeNode(CreateOpClassItem);
3136 n->itemtype = OPCLASS_ITEM_FUNCTION;
3138 n->args = extractArgTypes($7);
3145 CreateOpClassItem *n = makeNode(CreateOpClassItem);
3146 n->itemtype = OPCLASS_ITEM_STORAGETYPE;
3152 opt_default: DEFAULT { $$ = TRUE; }
3153 | /*EMPTY*/ { $$ = FALSE; }
3156 opt_opfamily: FAMILY any_name { $$ = $2; }
3157 | /*EMPTY*/ { $$ = NIL; }
3160 opt_recheck: RECHECK
3163 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3164 errmsg("RECHECK is no longer supported"),
3165 errhint("Update your data type.")));
3168 | /*EMPTY*/ { $$ = FALSE; }
3173 CREATE OPERATOR FAMILY any_name USING access_method
3175 CreateOpFamilyStmt *n = makeNode(CreateOpFamilyStmt);
3176 n->opfamilyname = $4;
3183 ALTER OPERATOR FAMILY any_name USING access_method ADD_P opclass_item_list
3185 AlterOpFamilyStmt *n = makeNode(AlterOpFamilyStmt);
3186 n->opfamilyname = $4;
3192 | ALTER OPERATOR FAMILY any_name USING access_method DROP opclass_drop_list
3194 AlterOpFamilyStmt *n = makeNode(AlterOpFamilyStmt);
3195 n->opfamilyname = $4;
3204 opclass_drop { $$ = list_make1($1); }
3205 | opclass_drop_list ',' opclass_drop { $$ = lappend($1, $3); }
3209 OPERATOR Iconst '(' type_list ')'
3211 CreateOpClassItem *n = makeNode(CreateOpClassItem);
3212 n->itemtype = OPCLASS_ITEM_OPERATOR;
3217 | FUNCTION Iconst '(' type_list ')'
3219 CreateOpClassItem *n = makeNode(CreateOpClassItem);
3220 n->itemtype = OPCLASS_ITEM_FUNCTION;
3229 DROP OPERATOR CLASS any_name USING access_method opt_drop_behavior
3231 RemoveOpClassStmt *n = makeNode(RemoveOpClassStmt);
3232 n->opclassname = $4;
3235 n->missing_ok = false;
3238 | DROP OPERATOR CLASS IF_P EXISTS any_name USING access_method opt_drop_behavior
3240 RemoveOpClassStmt *n = makeNode(RemoveOpClassStmt);
3241 n->opclassname = $6;
3244 n->missing_ok = true;
3250 DROP OPERATOR FAMILY any_name USING access_method opt_drop_behavior
3252 RemoveOpFamilyStmt *n = makeNode(RemoveOpFamilyStmt);
3253 n->opfamilyname = $4;
3256 n->missing_ok = false;
3259 | DROP OPERATOR FAMILY IF_P EXISTS any_name USING access_method opt_drop_behavior
3261 RemoveOpFamilyStmt *n = makeNode(RemoveOpFamilyStmt);
3262 n->opfamilyname = $6;
3265 n->missing_ok = true;
3271 /*****************************************************************************
3275 * DROP OWNED BY username [, username ...] [ RESTRICT | CASCADE ]
3276 * REASSIGN OWNED BY username [, username ...] TO username
3278 *****************************************************************************/
3280 DROP OWNED BY name_list opt_drop_behavior
3282 DropOwnedStmt *n = makeNode(DropOwnedStmt);
3290 REASSIGN OWNED BY name_list TO name
3292 ReassignOwnedStmt *n = makeNode(ReassignOwnedStmt);
3299 /*****************************************************************************
3303 * DROP itemtype [ IF EXISTS ] itemname [, itemname ...]
3304 * [ RESTRICT | CASCADE ]
3306 *****************************************************************************/
3308 DropStmt: DROP drop_type IF_P EXISTS any_name_list opt_drop_behavior
3310 DropStmt *n = makeNode(DropStmt);
3312 n->missing_ok = TRUE;
3317 | DROP drop_type any_name_list opt_drop_behavior
3319 DropStmt *n = makeNode(DropStmt);
3321 n->missing_ok = FALSE;
3329 drop_type: TABLE { $$ = OBJECT_TABLE; }
3330 | SEQUENCE { $$ = OBJECT_SEQUENCE; }
3331 | VIEW { $$ = OBJECT_VIEW; }
3332 | INDEX { $$ = OBJECT_INDEX; }
3333 | TYPE_P { $$ = OBJECT_TYPE; }
3334 | DOMAIN_P { $$ = OBJECT_DOMAIN; }
3335 | CONVERSION_P { $$ = OBJECT_CONVERSION; }
3336 | SCHEMA { $$ = OBJECT_SCHEMA; }
3337 | TEXT_P SEARCH PARSER { $$ = OBJECT_TSPARSER; }
3338 | TEXT_P SEARCH DICTIONARY { $$ = OBJECT_TSDICTIONARY; }
3339 | TEXT_P SEARCH TEMPLATE { $$ = OBJECT_TSTEMPLATE; }
3340 | TEXT_P SEARCH CONFIGURATION { $$ = OBJECT_TSCONFIGURATION; }
3344 any_name { $$ = list_make1($1); }
3345 | any_name_list ',' any_name { $$ = lappend($1, $3); }
3348 any_name: ColId { $$ = list_make1(makeString($1)); }
3349 | ColId attrs { $$ = lcons(makeString($1), $2); }
3352 attrs: '.' attr_name
3353 { $$ = list_make1(makeString($2)); }
3354 | attrs '.' attr_name
3355 { $$ = lappend($1, makeString($3)); }
3359 /*****************************************************************************
3362 * truncate table relname1, relname2, ...
3364 *****************************************************************************/
3367 TRUNCATE opt_table qualified_name_list opt_drop_behavior
3369 TruncateStmt *n = makeNode(TruncateStmt);
3376 /*****************************************************************************
3378 * The COMMENT ON statement can take different forms based upon the type of
3379 * the object associated with the comment. The form of the statement is:
3381 * COMMENT ON [ [ DATABASE | DOMAIN | INDEX | SEQUENCE | TABLE | TYPE | VIEW |
3382 * CONVERSION | LANGUAGE | OPERATOR CLASS | LARGE OBJECT |
3383 * CAST | COLUMN | SCHEMA | TABLESPACE | ROLE |
3384 * TEXT SEARCH PARSER | TEXT SEARCH DICTIONARY |
3385 * TEXT SEARCH TEMPLATE |
3386 * TEXT SEARCH CONFIGURATION ] <objname> |
3387 * AGGREGATE <aggname> (arg1, ...) |
3388 * FUNCTION <funcname> (arg1, arg2, ...) |
3389 * OPERATOR <op> (leftoperand_typ, rightoperand_typ) |
3390 * TRIGGER <triggername> ON <relname> |
3391 * CONSTRAINT <constraintname> ON <relname> |
3392 * RULE <rulename> ON <relname> ]
3395 *****************************************************************************/
3398 COMMENT ON comment_type any_name IS comment_text
3400 CommentStmt *n = makeNode(CommentStmt);
3407 | COMMENT ON AGGREGATE func_name aggr_args IS comment_text
3409 CommentStmt *n = makeNode(CommentStmt);
3410 n->objtype = OBJECT_AGGREGATE;
3416 | COMMENT ON FUNCTION func_name func_args IS comment_text
3418 CommentStmt *n = makeNode(CommentStmt);
3419 n->objtype = OBJECT_FUNCTION;
3421 n->objargs = extractArgTypes($5);
3425 | COMMENT ON OPERATOR any_operator '(' oper_argtypes ')'
3428 CommentStmt *n = makeNode(CommentStmt);
3429 n->objtype = OBJECT_OPERATOR;
3435 | COMMENT ON CONSTRAINT name ON any_name IS comment_text
3437 CommentStmt *n = makeNode(CommentStmt);
3438 n->objtype = OBJECT_CONSTRAINT;
3439 n->objname = lappend($6, makeString($4));
3444 | COMMENT ON RULE name ON any_name IS comment_text
3446 CommentStmt *n = makeNode(CommentStmt);
3447 n->objtype = OBJECT_RULE;
3448 n->objname = lappend($6, makeString($4));
3453 | COMMENT ON RULE name IS comment_text
3455 /* Obsolete syntax supported for awhile for compatibility */
3456 CommentStmt *n = makeNode(CommentStmt);
3457 n->objtype = OBJECT_RULE;
3458 n->objname = list_make1(makeString($4));
3463 | COMMENT ON TRIGGER name ON any_name IS comment_text
3465 CommentStmt *n = makeNode(CommentStmt);
3466 n->objtype = OBJECT_TRIGGER;
3467 n->objname = lappend($6, makeString($4));
3472 | COMMENT ON OPERATOR CLASS any_name USING access_method IS comment_text
3474 CommentStmt *n = makeNode(CommentStmt);
3475 n->objtype = OBJECT_OPCLASS;
3477 n->objargs = list_make1(makeString($7));
3481 | COMMENT ON OPERATOR FAMILY any_name USING access_method IS comment_text
3483 CommentStmt *n = makeNode(CommentStmt);
3484 n->objtype = OBJECT_OPFAMILY;
3486 n->objargs = list_make1(makeString($7));
3490 | COMMENT ON LARGE_P OBJECT_P NumericOnly IS comment_text
3492 CommentStmt *n = makeNode(CommentStmt);
3493 n->objtype = OBJECT_LARGEOBJECT;
3494 n->objname = list_make1($5);
3499 | COMMENT ON CAST '(' Typename AS Typename ')' IS comment_text
3501 CommentStmt *n = makeNode(CommentStmt);
3502 n->objtype = OBJECT_CAST;
3503 n->objname = list_make1($5);
3504 n->objargs = list_make1($7);
3508 | COMMENT ON opt_procedural LANGUAGE any_name IS comment_text
3510 CommentStmt *n = makeNode(CommentStmt);
3511 n->objtype = OBJECT_LANGUAGE;
3517 | COMMENT ON TEXT_P SEARCH PARSER any_name IS comment_text
3519 CommentStmt *n = makeNode(CommentStmt);
3520 n->objtype = OBJECT_TSPARSER;
3525 | COMMENT ON TEXT_P SEARCH DICTIONARY any_name IS comment_text
3527 CommentStmt *n = makeNode(CommentStmt);
3528 n->objtype = OBJECT_TSDICTIONARY;
3533 | COMMENT ON TEXT_P SEARCH TEMPLATE any_name IS comment_text
3535 CommentStmt *n = makeNode(CommentStmt);
3536 n->objtype = OBJECT_TSTEMPLATE;
3541 | COMMENT ON TEXT_P SEARCH CONFIGURATION any_name IS comment_text
3543 CommentStmt *n = makeNode(CommentStmt);
3544 n->objtype = OBJECT_TSCONFIGURATION;
3552 COLUMN { $$ = OBJECT_COLUMN; }
3553 | DATABASE { $$ = OBJECT_DATABASE; }
3554 | SCHEMA { $$ = OBJECT_SCHEMA; }
3555 | INDEX { $$ = OBJECT_INDEX; }
3556 | SEQUENCE { $$ = OBJECT_SEQUENCE; }
3557 | TABLE { $$ = OBJECT_TABLE; }
3558 | DOMAIN_P { $$ = OBJECT_TYPE; }
3559 | TYPE_P { $$ = OBJECT_TYPE; }
3560 | VIEW { $$ = OBJECT_VIEW; }
3561 | CONVERSION_P { $$ = OBJECT_CONVERSION; }
3562 | TABLESPACE { $$ = OBJECT_TABLESPACE; }
3563 | ROLE { $$ = OBJECT_ROLE; }
3568 | NULL_P { $$ = NULL; }
3571 /*****************************************************************************
3576 *****************************************************************************/
3578 FetchStmt: FETCH fetch_direction from_in name
3580 FetchStmt *n = (FetchStmt *) $2;
3587 FetchStmt *n = makeNode(FetchStmt);
3588 n->direction = FETCH_FORWARD;
3594 | MOVE fetch_direction from_in name
3596 FetchStmt *n = (FetchStmt *) $2;
3603 FetchStmt *n = makeNode(FetchStmt);
3604 n->direction = FETCH_FORWARD;
3615 FetchStmt *n = makeNode(FetchStmt);
3616 n->direction = FETCH_FORWARD;
3622 FetchStmt *n = makeNode(FetchStmt);
3623 n->direction = FETCH_FORWARD;
3629 FetchStmt *n = makeNode(FetchStmt);
3630 n->direction = FETCH_BACKWARD;
3636 FetchStmt *n = makeNode(FetchStmt);
3637 n->direction = FETCH_ABSOLUTE;
3643 FetchStmt *n = makeNode(FetchStmt);
3644 n->direction = FETCH_ABSOLUTE;
3648 | ABSOLUTE_P SignedIconst
3650 FetchStmt *n = makeNode(FetchStmt);
3651 n->direction = FETCH_ABSOLUTE;
3655 | RELATIVE_P SignedIconst
3657 FetchStmt *n = makeNode(FetchStmt);
3658 n->direction = FETCH_RELATIVE;
3664 FetchStmt *n = makeNode(FetchStmt);
3665 n->direction = FETCH_FORWARD;
3671 FetchStmt *n = makeNode(FetchStmt);
3672 n->direction = FETCH_FORWARD;
3673 n->howMany = FETCH_ALL;
3678 FetchStmt *n = makeNode(FetchStmt);
3679 n->direction = FETCH_FORWARD;
3683 | FORWARD SignedIconst
3685 FetchStmt *n = makeNode(FetchStmt);
3686 n->direction = FETCH_FORWARD;
3692 FetchStmt *n = makeNode(FetchStmt);
3693 n->direction = FETCH_FORWARD;
3694 n->howMany = FETCH_ALL;
3699 FetchStmt *n = makeNode(FetchStmt);
3700 n->direction = FETCH_BACKWARD;
3704 | BACKWARD SignedIconst
3706 FetchStmt *n = makeNode(FetchStmt);
3707 n->direction = FETCH_BACKWARD;
3713 FetchStmt *n = makeNode(FetchStmt);
3714 n->direction = FETCH_BACKWARD;
3715 n->howMany = FETCH_ALL;
3725 /*****************************************************************************
3727 * GRANT and REVOKE statements
3729 *****************************************************************************/
3731 GrantStmt: GRANT privileges ON privilege_target TO grantee_list
3732 opt_grant_grant_option
3734 GrantStmt *n = makeNode(GrantStmt);
3737 n->objtype = ($4)->objtype;
3738 n->objects = ($4)->objs;
3740 n->grant_option = $7;
3746 REVOKE privileges ON privilege_target
3747 FROM grantee_list opt_drop_behavior
3749 GrantStmt *n = makeNode(GrantStmt);
3750 n->is_grant = false;
3751 n->grant_option = false;
3753 n->objtype = ($4)->objtype;
3754 n->objects = ($4)->objs;
3759 | REVOKE GRANT OPTION FOR privileges ON privilege_target
3760 FROM grantee_list opt_drop_behavior
3762 GrantStmt *n = makeNode(GrantStmt);
3763 n->is_grant = false;
3764 n->grant_option = true;
3766 n->objtype = ($7)->objtype;
3767 n->objects = ($7)->objs;
3776 * A privilege list is represented as a list of strings; the validity of
3777 * the privilege names gets checked at execution. This is a bit annoying
3778 * but we have little choice because of the syntactic conflict with lists
3779 * of role names in GRANT/REVOKE. What's more, we have to call out in
3780 * the "privilege" production any reserved keywords that need to be usable
3781 * as privilege names.
3784 /* either ALL [PRIVILEGES] or a list of individual privileges */
3785 privileges: privilege_list
3793 privilege_list: privilege
3794 { $$ = list_make1(makeString($1)); }
3795 | privilege_list ',' privilege
3796 { $$ = lappend($1, makeString($3)); }
3799 privilege: SELECT { $$ = pstrdup($1); }
3800 | REFERENCES { $$ = pstrdup($1); }
3801 | CREATE { $$ = pstrdup($1); }
3802 | ColId { $$ = $1; }
3806 /* Don't bother trying to fold the first two rules into one using
3807 * opt_table. You're going to get conflicts.
3812 PrivTarget *n = makeNode(PrivTarget);
3813 n->objtype = ACL_OBJECT_RELATION;
3817 | TABLE qualified_name_list
3819 PrivTarget *n = makeNode(PrivTarget);
3820 n->objtype = ACL_OBJECT_RELATION;
3824 | SEQUENCE qualified_name_list
3826 PrivTarget *n = makeNode(PrivTarget);
3827 n->objtype = ACL_OBJECT_SEQUENCE;
3831 | FUNCTION function_with_argtypes_list
3833 PrivTarget *n = makeNode(PrivTarget);
3834 n->objtype = ACL_OBJECT_FUNCTION;
3838 | DATABASE name_list
3840 PrivTarget *n = makeNode(PrivTarget);
3841 n->objtype = ACL_OBJECT_DATABASE;
3845 | LANGUAGE name_list
3847 PrivTarget *n = makeNode(PrivTarget);
3848 n->objtype = ACL_OBJECT_LANGUAGE;
3854 PrivTarget *n = makeNode(PrivTarget);
3855 n->objtype = ACL_OBJECT_NAMESPACE;
3859 | TABLESPACE name_list
3861 PrivTarget *n = makeNode(PrivTarget);
3862 n->objtype = ACL_OBJECT_TABLESPACE;
3870 grantee { $$ = list_make1($1); }
3871 | grantee_list ',' grantee { $$ = lappend($1, $3); }
3876 PrivGrantee *n = makeNode(PrivGrantee);
3877 /* This hack lets us avoid reserving PUBLIC as a keyword*/
3878 if (strcmp($1, "public") == 0)
3886 PrivGrantee *n = makeNode(PrivGrantee);
3887 /* Treat GROUP PUBLIC as a synonym for PUBLIC */
3888 if (strcmp($2, "public") == 0)
3897 opt_grant_grant_option:
3898 WITH GRANT OPTION { $$ = TRUE; }
3899 | /*EMPTY*/ { $$ = FALSE; }
3902 function_with_argtypes_list:
3903 function_with_argtypes { $$ = list_make1($1); }
3904 | function_with_argtypes_list ',' function_with_argtypes
3905 { $$ = lappend($1, $3); }
3908 function_with_argtypes:
3911 FuncWithArgs *n = makeNode(FuncWithArgs);
3913 n->funcargs = extractArgTypes($2);
3918 /*****************************************************************************
3920 * GRANT and REVOKE ROLE statements
3922 *****************************************************************************/
3925 GRANT privilege_list TO name_list opt_grant_admin_option opt_granted_by
3927 GrantRoleStmt *n = makeNode(GrantRoleStmt);
3929 n->granted_roles = $2;
3930 n->grantee_roles = $4;
3938 REVOKE privilege_list FROM name_list opt_granted_by opt_drop_behavior
3940 GrantRoleStmt *n = makeNode(GrantRoleStmt);
3941 n->is_grant = false;
3942 n->admin_opt = false;
3943 n->granted_roles = $2;
3944 n->grantee_roles = $4;
3948 | REVOKE ADMIN OPTION FOR privilege_list FROM name_list opt_granted_by opt_drop_behavior
3950 GrantRoleStmt *n = makeNode(GrantRoleStmt);
3951 n->is_grant = false;
3952 n->admin_opt = true;
3953 n->granted_roles = $5;
3954 n->grantee_roles = $7;
3960 opt_grant_admin_option: WITH ADMIN OPTION { $$ = TRUE; }
3961 | /*EMPTY*/ { $$ = FALSE; }
3964 opt_granted_by: GRANTED BY RoleId { $$ = $3; }
3965 | /*EMPTY*/ { $$ = NULL; }
3969 /*****************************************************************************
3971 * QUERY: CREATE INDEX
3973 * Note: we can't factor CONCURRENTLY into a separate production without
3974 * making it a reserved word.
3976 * Note: we cannot put TABLESPACE clause after WHERE clause unless we are
3977 * willing to make TABLESPACE a fully reserved word.
3978 *****************************************************************************/
3980 IndexStmt: CREATE index_opt_unique INDEX index_name
3981 ON qualified_name access_method_clause '(' index_params ')'
3982 opt_definition OptTableSpace where_clause
3984 IndexStmt *n = makeNode(IndexStmt);
3986 n->concurrent = false;
3989 n->accessMethod = $7;
3990 n->indexParams = $9;
3992 n->tableSpace = $12;
3993 n->whereClause = $13;
3996 | CREATE index_opt_unique INDEX CONCURRENTLY index_name
3997 ON qualified_name access_method_clause '(' index_params ')'
3998 opt_definition OptTableSpace where_clause
4000 IndexStmt *n = makeNode(IndexStmt);
4002 n->concurrent = true;
4005 n->accessMethod = $8;
4006 n->indexParams = $10;
4008 n->tableSpace = $13;
4009 n->whereClause = $14;
4015 UNIQUE { $$ = TRUE; }
4016 | /*EMPTY*/ { $$ = FALSE; }
4019 access_method_clause:
4020 USING access_method { $$ = $2; }
4021 | /*EMPTY*/ { $$ = DEFAULT_INDEX_TYPE; }
4024 index_params: index_elem { $$ = list_make1($1); }
4025 | index_params ',' index_elem { $$ = lappend($1, $3); }
4029 * Index attributes can be either simple column references, or arbitrary
4030 * expressions in parens. For backwards-compatibility reasons, we allow
4031 * an expression that's just a function call to be written without parens.
4033 index_elem: ColId opt_class opt_asc_desc opt_nulls_order
4035 $$ = makeNode(IndexElem);
4040 $$->nulls_ordering = $4;
4042 | func_expr opt_class opt_asc_desc opt_nulls_order
4044 $$ = makeNode(IndexElem);
4049 $$->nulls_ordering = $4;
4051 | '(' a_expr ')' opt_class opt_asc_desc opt_nulls_order
4053 $$ = makeNode(IndexElem);
4058 $$->nulls_ordering = $6;
4062 opt_class: any_name { $$ = $1; }
4063 | USING any_name { $$ = $2; }
4064 | /*EMPTY*/ { $$ = NIL; }
4067 opt_asc_desc: ASC { $$ = SORTBY_ASC; }
4068 | DESC { $$ = SORTBY_DESC; }
4069 | /*EMPTY*/ { $$ = SORTBY_DEFAULT; }
4072 opt_nulls_order: NULLS_FIRST { $$ = SORTBY_NULLS_FIRST; }
4073 | NULLS_LAST { $$ = SORTBY_NULLS_LAST; }
4074 | /*EMPTY*/ { $$ = SORTBY_NULLS_DEFAULT; }
4078 /*****************************************************************************
4081 * create [or replace] function <fname>
4082 * [(<type-1> { , <type-n>})]
4084 * as <filename or code in language as appropriate>
4085 * language <lang> [with parameters]
4087 *****************************************************************************/
4090 CREATE opt_or_replace FUNCTION func_name func_args
4091 RETURNS func_return createfunc_opt_list opt_definition
4093 CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
4102 | CREATE opt_or_replace FUNCTION func_name func_args
4103 createfunc_opt_list opt_definition
4105 CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
4109 n->returnType = NULL;
4117 OR REPLACE { $$ = TRUE; }
4118 | /*EMPTY*/ { $$ = FALSE; }
4121 func_args: '(' func_args_list ')' { $$ = $2; }
4122 | '(' ')' { $$ = NIL; }
4126 func_arg { $$ = list_make1($1); }
4127 | func_args_list ',' func_arg { $$ = lappend($1, $3); }
4131 * The style with arg_class first is SQL99 standard, but Oracle puts
4132 * param_name first; accept both since it's likely people will try both
4133 * anyway. Don't bother trying to save productions by letting arg_class
4134 * have an empty alternative ... you'll get shift/reduce conflicts.
4136 * We can catch over-specified arguments here if we want to,
4137 * but for now better to silently swallow typmod, etc.
4138 * - thomas 2000-03-22
4141 arg_class param_name func_type
4143 FunctionParameter *n = makeNode(FunctionParameter);
4149 | param_name arg_class func_type
4151 FunctionParameter *n = makeNode(FunctionParameter);
4157 | param_name func_type
4159 FunctionParameter *n = makeNode(FunctionParameter);
4162 n->mode = FUNC_PARAM_IN;
4165 | arg_class func_type
4167 FunctionParameter *n = makeNode(FunctionParameter);
4175 FunctionParameter *n = makeNode(FunctionParameter);
4178 n->mode = FUNC_PARAM_IN;
4183 /* INOUT is SQL99 standard, IN OUT is for Oracle compatibility */
4184 arg_class: IN_P { $$ = FUNC_PARAM_IN; }
4185 | OUT_P { $$ = FUNC_PARAM_OUT; }
4186 | INOUT { $$ = FUNC_PARAM_INOUT; }
4187 | IN_P OUT_P { $$ = FUNC_PARAM_INOUT; }
4191 * Ideally param_name should be ColId, but that causes too many conflicts.
4193 param_name: type_function_name
4199 /* We can catch over-specified results here if we want to,
4200 * but for now better to silently swallow typmod, etc.
4201 * - thomas 2000-03-22
4208 * We would like to make the %TYPE productions here be ColId attrs etc,
4209 * but that causes reduce/reduce conflicts. type_function_name
4210 * is next best choice.
4212 func_type: Typename { $$ = $1; }
4213 | type_function_name attrs '%' TYPE_P
4215 $$ = makeTypeNameFromNameList(lcons(makeString($1), $2));
4216 $$->pct_type = true;
4219 | SETOF type_function_name attrs '%' TYPE_P
4221 $$ = makeTypeNameFromNameList(lcons(makeString($2), $3));
4222 $$->pct_type = true;
4229 createfunc_opt_list:
4230 /* Must be at least one to prevent conflict */
4231 createfunc_opt_item { $$ = list_make1($1); }
4232 | createfunc_opt_list createfunc_opt_item { $$ = lappend($1, $2); }
4236 * Options common to both CREATE FUNCTION and ALTER FUNCTION
4238 common_func_opt_item:
4239 CALLED ON NULL_P INPUT_P
4241 $$ = makeDefElem("strict", (Node *)makeInteger(FALSE));
4243 | RETURNS NULL_P ON NULL_P INPUT_P
4245 $$ = makeDefElem("strict", (Node *)makeInteger(TRUE));
4249 $$ = makeDefElem("strict", (Node *)makeInteger(TRUE));
4253 $$ = makeDefElem("volatility", (Node *)makeString("immutable"));
4257 $$ = makeDefElem("volatility", (Node *)makeString("stable"));
4261 $$ = makeDefElem("volatility", (Node *)makeString("volatile"));
4263 | EXTERNAL SECURITY DEFINER
4265 $$ = makeDefElem("security", (Node *)makeInteger(TRUE));
4267 | EXTERNAL SECURITY INVOKER
4269 $$ = makeDefElem("security", (Node *)makeInteger(FALSE));
4273 $$ = makeDefElem("security", (Node *)makeInteger(TRUE));
4277 $$ = makeDefElem("security", (Node *)makeInteger(FALSE));
4281 $$ = makeDefElem("cost", (Node *)$2);
4285 $$ = makeDefElem("rows", (Node *)$2);
4289 /* we abuse the normal content of a DefElem here */
4290 $$ = makeDefElem("set", (Node *)$1);
4294 createfunc_opt_item:
4297 $$ = makeDefElem("as", (Node *)$2);
4299 | LANGUAGE ColId_or_Sconst
4301 $$ = makeDefElem("language", (Node *)makeString($2));
4303 | common_func_opt_item
4309 func_as: Sconst { $$ = list_make1(makeString($1)); }
4312 $$ = list_make2(makeString($1), makeString($3));
4317 WITH definition { $$ = $2; }
4318 | /*EMPTY*/ { $$ = NIL; }
4321 /*****************************************************************************
4324 * RENAME and OWNER subcommands are already provided by the generic
4325 * ALTER infrastructure, here we just specify alterations that can
4326 * only be applied to functions.
4328 *****************************************************************************/
4330 ALTER FUNCTION function_with_argtypes alterfunc_opt_list opt_restrict
4332 AlterFunctionStmt *n = makeNode(AlterFunctionStmt);
4340 /* At least one option must be specified */
4341 common_func_opt_item { $$ = list_make1($1); }
4342 | alterfunc_opt_list common_func_opt_item { $$ = lappend($1, $2); }
4345 /* Ignored, merely for SQL compliance */
4352 /*****************************************************************************
4356 * DROP FUNCTION funcname (arg1, arg2, ...) [ RESTRICT | CASCADE ]
4357 * DROP AGGREGATE aggname (arg1, ...) [ RESTRICT | CASCADE ]
4358 * DROP OPERATOR opname (leftoperand_typ, rightoperand_typ) [ RESTRICT | CASCADE ]
4360 *****************************************************************************/
4363 DROP FUNCTION func_name func_args opt_drop_behavior
4365 RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
4366 n->kind = OBJECT_FUNCTION;
4368 n->args = extractArgTypes($4);
4370 n->missing_ok = false;
4373 | DROP FUNCTION IF_P EXISTS func_name func_args opt_drop_behavior
4375 RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
4376 n->kind = OBJECT_FUNCTION;
4378 n->args = extractArgTypes($6);
4380 n->missing_ok = true;
4386 DROP AGGREGATE func_name aggr_args opt_drop_behavior
4388 RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
4389 n->kind = OBJECT_AGGREGATE;
4393 n->missing_ok = false;
4396 | DROP AGGREGATE IF_P EXISTS func_name aggr_args opt_drop_behavior
4398 RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
4399 n->kind = OBJECT_AGGREGATE;
4403 n->missing_ok = true;
4409 DROP OPERATOR any_operator '(' oper_argtypes ')' opt_drop_behavior
4411 RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
4412 n->kind = OBJECT_OPERATOR;
4416 n->missing_ok = false;
4419 | DROP OPERATOR IF_P EXISTS any_operator '(' oper_argtypes ')' opt_drop_behavior
4421 RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
4422 n->kind = OBJECT_OPERATOR;
4426 n->missing_ok = true;
4435 (errcode(ERRCODE_SYNTAX_ERROR),
4436 errmsg("missing argument"),
4437 errhint("Use NONE to denote the missing argument of a unary operator.")));
4439 | Typename ',' Typename
4440 { $$ = list_make2($1, $3); }
4441 | NONE ',' Typename /* left unary */
4442 { $$ = list_make2(NULL, $3); }
4443 | Typename ',' NONE /* right unary */
4444 { $$ = list_make2($1, NULL); }
4449 { $$ = list_make1(makeString($1)); }
4450 | ColId '.' any_operator
4451 { $$ = lcons(makeString($1), $3); }
4455 /*****************************************************************************
4457 * CREATE CAST / DROP CAST
4459 *****************************************************************************/
4461 CreateCastStmt: CREATE CAST '(' Typename AS Typename ')'
4462 WITH FUNCTION function_with_argtypes cast_context
4464 CreateCastStmt *n = makeNode(CreateCastStmt);
4468 n->context = (CoercionContext) $11;
4471 | CREATE CAST '(' Typename AS Typename ')'
4472 WITHOUT FUNCTION cast_context
4474 CreateCastStmt *n = makeNode(CreateCastStmt);
4478 n->context = (CoercionContext) $10;
4483 cast_context: AS IMPLICIT_P { $$ = COERCION_IMPLICIT; }
4484 | AS ASSIGNMENT { $$ = COERCION_ASSIGNMENT; }
4485 | /*EMPTY*/ { $$ = COERCION_EXPLICIT; }
4489 DropCastStmt: DROP CAST opt_if_exists '(' Typename AS Typename ')' opt_drop_behavior
4491 DropCastStmt *n = makeNode(DropCastStmt);
4500 opt_if_exists: IF_P EXISTS { $$ = TRUE; }
4501 | /*EMPTY*/ { $$ = FALSE; }
4505 /*****************************************************************************
4509 * REINDEX type <name> [FORCE]
4511 * FORCE no longer does anything, but we accept it for backwards compatibility
4512 *****************************************************************************/
4515 REINDEX reindex_type qualified_name opt_force
4517 ReindexStmt *n = makeNode(ReindexStmt);
4523 | REINDEX SYSTEM_P name opt_force
4525 ReindexStmt *n = makeNode(ReindexStmt);
4526 n->kind = OBJECT_DATABASE;
4529 n->do_system = true;
4533 | REINDEX DATABASE name opt_force
4535 ReindexStmt *n = makeNode(ReindexStmt);
4536 n->kind = OBJECT_DATABASE;
4539 n->do_system = true;
4546 INDEX { $$ = OBJECT_INDEX; }
4547 | TABLE { $$ = OBJECT_TABLE; }
4550 opt_force: FORCE { $$ = TRUE; }
4551 | /* EMPTY */ { $$ = FALSE; }
4555 /*****************************************************************************
4557 * ALTER THING name RENAME TO newname
4559 *****************************************************************************/
4561 RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name
4563 RenameStmt *n = makeNode(RenameStmt);
4564 n->renameType = OBJECT_AGGREGATE;
4570 | ALTER CONVERSION_P any_name RENAME TO name
4572 RenameStmt *n = makeNode(RenameStmt);
4573 n->renameType = OBJECT_CONVERSION;
4578 | ALTER DATABASE database_name RENAME TO database_name
4580 RenameStmt *n = makeNode(RenameStmt);
4581 n->renameType = OBJECT_DATABASE;
4586 | ALTER FUNCTION function_with_argtypes RENAME TO name
4588 RenameStmt *n = makeNode(RenameStmt);
4589 n->renameType = OBJECT_FUNCTION;
4590 n->object = $3->funcname;
4591 n->objarg = $3->funcargs;
4595 | ALTER GROUP_P RoleId RENAME TO RoleId
4597 RenameStmt *n = makeNode(RenameStmt);
4598 n->renameType = OBJECT_ROLE;
4603 | ALTER opt_procedural LANGUAGE name RENAME TO name
4605 RenameStmt *n = makeNode(RenameStmt);
4606 n->renameType = OBJECT_LANGUAGE;
4611 | ALTER OPERATOR CLASS any_name USING access_method RENAME TO name
4613 RenameStmt *n = makeNode(RenameStmt);
4614 n->renameType = OBJECT_OPCLASS;
4620 | ALTER OPERATOR FAMILY any_name USING access_method RENAME TO name
4622 RenameStmt *n = makeNode(RenameStmt);
4623 n->renameType = OBJECT_OPFAMILY;
4629 | ALTER SCHEMA name RENAME TO name
4631 RenameStmt *n = makeNode(RenameStmt);
4632 n->renameType = OBJECT_SCHEMA;
4637 | ALTER TABLE relation_expr RENAME TO name
4639 RenameStmt *n = makeNode(RenameStmt);
4640 n->renameType = OBJECT_TABLE;
4646 | ALTER SEQUENCE relation_expr RENAME TO name
4648 RenameStmt *n = makeNode(RenameStmt);
4649 n->renameType = OBJECT_SEQUENCE;
4655 | ALTER VIEW relation_expr RENAME TO name
4657 RenameStmt *n = makeNode(RenameStmt);
4658 n->renameType = OBJECT_VIEW;
4664 | ALTER INDEX relation_expr RENAME TO name
4666 RenameStmt *n = makeNode(RenameStmt);
4667 n->renameType = OBJECT_INDEX;
4673 | ALTER TABLE relation_expr RENAME opt_column name TO name
4675 RenameStmt *n = makeNode(RenameStmt);
4676 n->renameType = OBJECT_COLUMN;
4682 | ALTER TRIGGER name ON relation_expr RENAME TO name
4684 RenameStmt *n = makeNode(RenameStmt);
4685 n->renameType = OBJECT_TRIGGER;
4691 | ALTER ROLE RoleId RENAME TO RoleId
4693 RenameStmt *n = makeNode(RenameStmt);
4694 n->renameType = OBJECT_ROLE;
4699 | ALTER USER RoleId RENAME TO RoleId
4701 RenameStmt *n = makeNode(RenameStmt);
4702 n->renameType = OBJECT_ROLE;
4707 | ALTER TABLESPACE name RENAME TO name
4709 RenameStmt *n = makeNode(RenameStmt);
4710 n->renameType = OBJECT_TABLESPACE;
4715 | ALTER TEXT_P SEARCH PARSER any_name RENAME TO name
4717 RenameStmt *n = makeNode(RenameStmt);
4718 n->renameType = OBJECT_TSPARSER;
4723 | ALTER TEXT_P SEARCH DICTIONARY any_name RENAME TO name
4725 RenameStmt *n = makeNode(RenameStmt);
4726 n->renameType = OBJECT_TSDICTIONARY;
4731 | ALTER TEXT_P SEARCH TEMPLATE any_name RENAME TO name
4733 RenameStmt *n = makeNode(RenameStmt);
4734 n->renameType = OBJECT_TSTEMPLATE;
4739 | ALTER TEXT_P SEARCH CONFIGURATION any_name RENAME TO name
4741 RenameStmt *n = makeNode(RenameStmt);
4742 n->renameType = OBJECT_TSCONFIGURATION;
4747 | ALTER TYPE_P any_name RENAME TO name
4749 RenameStmt *n = makeNode(RenameStmt);
4750 n->renameType = OBJECT_TYPE;
4757 opt_column: COLUMN { $$ = COLUMN; }
4758 | /*EMPTY*/ { $$ = 0; }
4761 /*****************************************************************************
4763 * ALTER THING name SET SCHEMA name
4765 *****************************************************************************/
4767 AlterObjectSchemaStmt:
4768 ALTER AGGREGATE func_name aggr_args SET SCHEMA name
4770 AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
4771 n->objectType = OBJECT_AGGREGATE;
4777 | ALTER DOMAIN_P any_name SET SCHEMA name
4779 AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
4780 n->objectType = OBJECT_DOMAIN;
4785 | ALTER FUNCTION function_with_argtypes SET SCHEMA name
4787 AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
4788 n->objectType = OBJECT_FUNCTION;
4789 n->object = $3->funcname;
4790 n->objarg = $3->funcargs;
4794 | ALTER SEQUENCE relation_expr SET SCHEMA name
4796 AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
4797 n->objectType = OBJECT_SEQUENCE;
4802 | ALTER TABLE relation_expr SET SCHEMA name
4804 AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
4805 n->objectType = OBJECT_TABLE;
4810 | ALTER TYPE_P any_name SET SCHEMA name
4812 AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
4813 n->objectType = OBJECT_TYPE;
4820 /*****************************************************************************
4822 * ALTER THING name OWNER TO newname
4824 *****************************************************************************/
4826 AlterOwnerStmt: ALTER AGGREGATE func_name aggr_args OWNER TO RoleId
4828 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4829 n->objectType = OBJECT_AGGREGATE;
4835 | ALTER CONVERSION_P any_name OWNER TO RoleId
4837 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4838 n->objectType = OBJECT_CONVERSION;
4843 | ALTER DATABASE database_name OWNER TO RoleId
4845 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4846 n->objectType = OBJECT_DATABASE;
4847 n->object = list_make1(makeString($3));
4851 | ALTER DOMAIN_P any_name OWNER TO RoleId
4853 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4854 n->objectType = OBJECT_DOMAIN;
4859 | ALTER FUNCTION function_with_argtypes OWNER TO RoleId
4861 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4862 n->objectType = OBJECT_FUNCTION;
4863 n->object = $3->funcname;
4864 n->objarg = $3->funcargs;
4868 | ALTER opt_procedural LANGUAGE name OWNER TO RoleId
4870 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4871 n->objectType = OBJECT_LANGUAGE;
4872 n->object = list_make1(makeString($4));
4876 | ALTER OPERATOR any_operator '(' oper_argtypes ')' OWNER TO RoleId
4878 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4879 n->objectType = OBJECT_OPERATOR;
4885 | ALTER OPERATOR CLASS any_name USING access_method OWNER TO RoleId
4887 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4888 n->objectType = OBJECT_OPCLASS;
4894 | ALTER OPERATOR FAMILY any_name USING access_method OWNER TO RoleId
4896 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4897 n->objectType = OBJECT_OPFAMILY;
4903 | ALTER SCHEMA name OWNER TO RoleId
4905 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4906 n->objectType = OBJECT_SCHEMA;
4907 n->object = list_make1(makeString($3));
4911 | ALTER TYPE_P any_name OWNER TO RoleId
4913 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4914 n->objectType = OBJECT_TYPE;
4919 | ALTER TABLESPACE name OWNER TO RoleId
4921 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4922 n->objectType = OBJECT_TABLESPACE;
4923 n->object = list_make1(makeString($3));
4927 | ALTER TEXT_P SEARCH DICTIONARY any_name OWNER TO RoleId
4929 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4930 n->objectType = OBJECT_TSDICTIONARY;
4935 | ALTER TEXT_P SEARCH CONFIGURATION any_name OWNER TO RoleId
4937 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4938 n->objectType = OBJECT_TSCONFIGURATION;
4946 /*****************************************************************************
4948 * QUERY: Define Rewrite Rule
4950 *****************************************************************************/
4952 RuleStmt: CREATE opt_or_replace RULE name AS
4953 { QueryIsRule=TRUE; }
4954 ON event TO qualified_name where_clause
4955 DO opt_instead RuleActionList
4957 RuleStmt *n = makeNode(RuleStmt);
4961 n->whereClause = $11;
4971 NOTHING { $$ = NIL; }
4972 | RuleActionStmt { $$ = list_make1($1); }
4973 | '(' RuleActionMulti ')' { $$ = $2; }
4976 /* the thrashing around here is to discard "empty" statements... */
4978 RuleActionMulti ';' RuleActionStmtOrEmpty
4980 $$ = lappend($1, $3);
4984 | RuleActionStmtOrEmpty
4986 $$ = list_make1($1);
5000 RuleActionStmtOrEmpty:
5001 RuleActionStmt { $$ = $1; }
5002 | /*EMPTY*/ { $$ = NULL; }
5005 event: SELECT { $$ = CMD_SELECT; }
5006 | UPDATE { $$ = CMD_UPDATE; }
5007 | DELETE_P { $$ = CMD_DELETE; }
5008 | INSERT { $$ = CMD_INSERT; }
5012 INSTEAD { $$ = TRUE; }
5013 | ALSO { $$ = FALSE; }
5014 | /*EMPTY*/ { $$ = FALSE; }
5019 DROP RULE name ON qualified_name opt_drop_behavior
5021 DropPropertyStmt *n = makeNode(DropPropertyStmt);
5025 n->removeType = OBJECT_RULE;
5026 n->missing_ok = false;
5029 | DROP RULE IF_P EXISTS name ON qualified_name opt_drop_behavior
5031 DropPropertyStmt *n = makeNode(DropPropertyStmt);
5035 n->removeType = OBJECT_RULE;
5036 n->missing_ok = true;
5042 /*****************************************************************************
5045 * NOTIFY <qualified_name> can appear both in rule bodies and
5046 * as a query-level command
5048 *****************************************************************************/
5050 NotifyStmt: NOTIFY ColId
5052 NotifyStmt *n = makeNode(NotifyStmt);
5053 n->relation = makeNode(RangeVar);
5054 n->relation->relname = $2;
5055 n->relation->schemaname = NULL;
5060 ListenStmt: LISTEN ColId
5062 ListenStmt *n = makeNode(ListenStmt);
5063 n->relation = makeNode(RangeVar);
5064 n->relation->relname = $2;
5065 n->relation->schemaname = NULL;
5073 UnlistenStmt *n = makeNode(UnlistenStmt);
5074 n->relation = makeNode(RangeVar);
5075 n->relation->relname = $2;
5076 n->relation->schemaname = NULL;
5081 UnlistenStmt *n = makeNode(UnlistenStmt);
5082 n->relation = makeNode(RangeVar);
5083 n->relation->relname = "*";
5084 n->relation->schemaname = NULL;
5090 /*****************************************************************************
5094 * BEGIN / COMMIT / ROLLBACK
5095 * (also older versions END / ABORT)
5097 *****************************************************************************/
5100 ABORT_P opt_transaction
5102 TransactionStmt *n = makeNode(TransactionStmt);
5103 n->kind = TRANS_STMT_ROLLBACK;
5107 | BEGIN_P opt_transaction transaction_mode_list_or_empty
5109 TransactionStmt *n = makeNode(TransactionStmt);
5110 n->kind = TRANS_STMT_BEGIN;
5114 | START TRANSACTION transaction_mode_list_or_empty
5116 TransactionStmt *n = makeNode(TransactionStmt);
5117 n->kind = TRANS_STMT_START;
5121 | COMMIT opt_transaction
5123 TransactionStmt *n = makeNode(TransactionStmt);
5124 n->kind = TRANS_STMT_COMMIT;
5128 | END_P opt_transaction
5130 TransactionStmt *n = makeNode(TransactionStmt);
5131 n->kind = TRANS_STMT_COMMIT;
5135 | ROLLBACK opt_transaction
5137 TransactionStmt *n = makeNode(TransactionStmt);
5138 n->kind = TRANS_STMT_ROLLBACK;
5144 TransactionStmt *n = makeNode(TransactionStmt);
5145 n->kind = TRANS_STMT_SAVEPOINT;
5146 n->options = list_make1(makeDefElem("savepoint_name",
5147 (Node *)makeString($2)));
5150 | RELEASE SAVEPOINT ColId
5152 TransactionStmt *n = makeNode(TransactionStmt);
5153 n->kind = TRANS_STMT_RELEASE;
5154 n->options = list_make1(makeDefElem("savepoint_name",
5155 (Node *)makeString($3)));
5160 TransactionStmt *n = makeNode(TransactionStmt);
5161 n->kind = TRANS_STMT_RELEASE;
5162 n->options = list_make1(makeDefElem("savepoint_name",
5163 (Node *)makeString($2)));
5166 | ROLLBACK opt_transaction TO SAVEPOINT ColId
5168 TransactionStmt *n = makeNode(TransactionStmt);
5169 n->kind = TRANS_STMT_ROLLBACK_TO;
5170 n->options = list_make1(makeDefElem("savepoint_name",
5171 (Node *)makeString($5)));
5174 | ROLLBACK opt_transaction TO ColId
5176 TransactionStmt *n = makeNode(TransactionStmt);
5177 n->kind = TRANS_STMT_ROLLBACK_TO;
5178 n->options = list_make1(makeDefElem("savepoint_name",
5179 (Node *)makeString($4)));
5182 | PREPARE TRANSACTION Sconst
5184 TransactionStmt *n = makeNode(TransactionStmt);
5185 n->kind = TRANS_STMT_PREPARE;
5189 | COMMIT PREPARED Sconst
5191 TransactionStmt *n = makeNode(TransactionStmt);
5192 n->kind = TRANS_STMT_COMMIT_PREPARED;
5196 | ROLLBACK PREPARED Sconst
5198 TransactionStmt *n = makeNode(TransactionStmt);
5199 n->kind = TRANS_STMT_ROLLBACK_PREPARED;
5205 opt_transaction: WORK {}
5210 transaction_mode_item:
5211 ISOLATION LEVEL iso_level
5212 { $$ = makeDefElem("transaction_isolation",
5213 makeStringConst($3)); }
5215 { $$ = makeDefElem("transaction_read_only",
5216 makeIntConst(TRUE)); }
5218 { $$ = makeDefElem("transaction_read_only",
5219 makeIntConst(FALSE)); }
5222 /* Syntax with commas is SQL-spec, without commas is Postgres historical */
5223 transaction_mode_list:
5224 transaction_mode_item
5225 { $$ = list_make1($1); }
5226 | transaction_mode_list ',' transaction_mode_item
5227 { $$ = lappend($1, $3); }
5228 | transaction_mode_list transaction_mode_item
5229 { $$ = lappend($1, $2); }
5232 transaction_mode_list_or_empty:
5233 transaction_mode_list
5239 /*****************************************************************************
5242 * CREATE [ OR REPLACE ] [ TEMP ] VIEW <viewname> '('target-list ')'
5243 * AS <query> [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
5245 *****************************************************************************/
5247 ViewStmt: CREATE OptTemp VIEW qualified_name opt_column_list
5248 AS SelectStmt opt_check_option
5250 ViewStmt *n = makeNode(ViewStmt);
5252 n->view->istemp = $2;
5258 | CREATE OR REPLACE OptTemp VIEW qualified_name opt_column_list
5259 AS SelectStmt opt_check_option
5261 ViewStmt *n = makeNode(ViewStmt);
5263 n->view->istemp = $4;
5272 * We use merged tokens here to avoid creating shift/reduce conflicts against
5273 * a whole lot of other uses of WITH.
5279 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5280 errmsg("WITH CHECK OPTION is not implemented")));
5282 | WITH_CASCADED CHECK OPTION
5285 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5286 errmsg("WITH CHECK OPTION is not implemented")));
5288 | WITH_LOCAL CHECK OPTION
5291 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5292 errmsg("WITH CHECK OPTION is not implemented")));
5294 | /* EMPTY */ { $$ = NIL; }
5297 /*****************************************************************************
5302 *****************************************************************************/
5304 LoadStmt: LOAD file_name
5306 LoadStmt *n = makeNode(LoadStmt);
5313 /*****************************************************************************
5317 *****************************************************************************/
5320 CREATE DATABASE database_name opt_with createdb_opt_list
5322 CreatedbStmt *n = makeNode(CreatedbStmt);
5330 createdb_opt_list createdb_opt_item { $$ = lappend($1, $2); }
5331 | /* EMPTY */ { $$ = NIL; }
5335 TABLESPACE opt_equal name
5337 $$ = makeDefElem("tablespace", (Node *)makeString($3));
5339 | TABLESPACE opt_equal DEFAULT
5341 $$ = makeDefElem("tablespace", NULL);
5343 | LOCATION opt_equal Sconst
5345 $$ = makeDefElem("location", (Node *)makeString($3));
5347 | LOCATION opt_equal DEFAULT
5349 $$ = makeDefElem("location", NULL);
5351 | TEMPLATE opt_equal name
5353 $$ = makeDefElem("template", (Node *)makeString($3));
5355 | TEMPLATE opt_equal DEFAULT
5357 $$ = makeDefElem("template", NULL);
5359 | ENCODING opt_equal Sconst
5361 $$ = makeDefElem("encoding", (Node *)makeString($3));
5363 | ENCODING opt_equal Iconst
5365 $$ = makeDefElem("encoding", (Node *)makeInteger($3));
5367 | ENCODING opt_equal DEFAULT
5369 $$ = makeDefElem("encoding", NULL);
5371 | CONNECTION LIMIT opt_equal SignedIconst
5373 $$ = makeDefElem("connectionlimit", (Node *)makeInteger($4));
5375 | OWNER opt_equal name
5377 $$ = makeDefElem("owner", (Node *)makeString($3));
5379 | OWNER opt_equal DEFAULT
5381 $$ = makeDefElem("owner", NULL);
5386 * Though the equals sign doesn't match other WITH options, pg_dump uses
5387 * equals for backward compatibility, and it doesn't seem worth removing it.
5394 /*****************************************************************************
5398 *****************************************************************************/
5401 ALTER DATABASE database_name opt_with alterdb_opt_list
5403 AlterDatabaseStmt *n = makeNode(AlterDatabaseStmt);
5410 AlterDatabaseSetStmt:
5411 ALTER DATABASE database_name SetResetClause
5413 AlterDatabaseSetStmt *n = makeNode(AlterDatabaseSetStmt);
5422 alterdb_opt_list alterdb_opt_item { $$ = lappend($1, $2); }
5423 | /* EMPTY */ { $$ = NIL; }
5427 CONNECTION LIMIT opt_equal SignedIconst
5429 $$ = makeDefElem("connectionlimit", (Node *)makeInteger($4));
5434 /*****************************************************************************
5436 * DROP DATABASE [ IF EXISTS ]
5438 * This is implicitly CASCADE, no need for drop behavior
5439 *****************************************************************************/
5441 DropdbStmt: DROP DATABASE database_name
5443 DropdbStmt *n = makeNode(DropdbStmt);
5445 n->missing_ok = FALSE;
5448 | DROP DATABASE IF_P EXISTS database_name
5450 DropdbStmt *n = makeNode(DropdbStmt);
5452 n->missing_ok = TRUE;
5458 /*****************************************************************************
5460 * Manipulate a domain
5462 *****************************************************************************/
5465 CREATE DOMAIN_P any_name opt_as Typename ColQualList
5467 CreateDomainStmt *n = makeNode(CreateDomainStmt);
5470 n->constraints = $6;
5476 /* ALTER DOMAIN <domain> {SET DEFAULT <expr>|DROP DEFAULT} */
5477 ALTER DOMAIN_P any_name alter_column_default
5479 AlterDomainStmt *n = makeNode(AlterDomainStmt);
5485 /* ALTER DOMAIN <domain> DROP NOT NULL */
5486 | ALTER DOMAIN_P any_name DROP NOT NULL_P
5488 AlterDomainStmt *n = makeNode(AlterDomainStmt);
5493 /* ALTER DOMAIN <domain> SET NOT NULL */
5494 | ALTER DOMAIN_P any_name SET NOT NULL_P
5496 AlterDomainStmt *n = makeNode(AlterDomainStmt);
5501 /* ALTER DOMAIN <domain> ADD CONSTRAINT ... */
5502 | ALTER DOMAIN_P any_name ADD_P TableConstraint
5504 AlterDomainStmt *n = makeNode(AlterDomainStmt);
5510 /* ALTER DOMAIN <domain> DROP CONSTRAINT <name> [RESTRICT|CASCADE] */
5511 | ALTER DOMAIN_P any_name DROP CONSTRAINT name opt_drop_behavior
5513 AlterDomainStmt *n = makeNode(AlterDomainStmt);
5527 /*****************************************************************************
5529 * Manipulate a text search dictionary or configuration
5531 *****************************************************************************/
5533 AlterTSDictionaryStmt:
5534 ALTER TEXT_P SEARCH DICTIONARY any_name definition
5536 AlterTSDictionaryStmt *n = makeNode(AlterTSDictionaryStmt);
5543 AlterTSConfigurationStmt:
5544 ALTER TEXT_P SEARCH CONFIGURATION any_name ADD_P MAPPING FOR name_list WITH any_name_list
5546 AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
5550 n->override = false;
5554 | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING FOR name_list WITH any_name_list
5556 AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
5564 | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING REPLACE any_name WITH any_name
5566 AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
5569 n->dicts = list_make2($9,$11);
5570 n->override = false;
5574 | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING FOR name_list REPLACE any_name WITH any_name
5576 AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
5579 n->dicts = list_make2($11,$13);
5580 n->override = false;
5584 | ALTER TEXT_P SEARCH CONFIGURATION any_name DROP MAPPING FOR name_list
5586 AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
5589 n->missing_ok = false;
5592 | ALTER TEXT_P SEARCH CONFIGURATION any_name DROP MAPPING IF_P EXISTS FOR name_list
5594 AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
5597 n->missing_ok = true;
5603 /*****************************************************************************
5605 * Manipulate a conversion
5607 * CREATE [DEFAULT] CONVERSION <conversion_name>
5608 * FOR <encoding_name> TO <encoding_name> FROM <func_name>
5610 *****************************************************************************/
5612 CreateConversionStmt:
5613 CREATE opt_default CONVERSION_P any_name FOR Sconst
5614 TO Sconst FROM any_name
5616 CreateConversionStmt *n = makeNode(CreateConversionStmt);
5617 n->conversion_name = $4;
5618 n->for_encoding_name = $6;
5619 n->to_encoding_name = $8;
5626 /*****************************************************************************
5629 * CLUSTER <qualified_name> [ USING <index_name> ]
5631 * CLUSTER <index_name> ON <qualified_name> (for pre-8.3)
5633 *****************************************************************************/
5636 CLUSTER qualified_name cluster_index_specification
5638 ClusterStmt *n = makeNode(ClusterStmt);
5645 ClusterStmt *n = makeNode(ClusterStmt);
5647 n->indexname = NULL;
5650 /* kept for pre-8.3 compatibility */
5651 | CLUSTER index_name ON qualified_name
5653 ClusterStmt *n = makeNode(ClusterStmt);
5660 cluster_index_specification:
5661 USING index_name { $$ = $2; }
5662 | /*EMPTY*/ { $$ = NULL; }
5666 /*****************************************************************************
5672 *****************************************************************************/
5674 VacuumStmt: VACUUM opt_full opt_freeze opt_verbose
5676 VacuumStmt *n = makeNode(VacuumStmt);
5680 n->freeze_min_age = $3 ? 0 : -1;
5686 | VACUUM opt_full opt_freeze opt_verbose qualified_name
5688 VacuumStmt *n = makeNode(VacuumStmt);
5692 n->freeze_min_age = $3 ? 0 : -1;
5698 | VACUUM opt_full opt_freeze opt_verbose AnalyzeStmt
5700 VacuumStmt *n = (VacuumStmt *) $5;
5703 n->freeze_min_age = $3 ? 0 : -1;
5710 analyze_keyword opt_verbose
5712 VacuumStmt *n = makeNode(VacuumStmt);
5716 n->freeze_min_age = -1;
5722 | analyze_keyword opt_verbose qualified_name opt_name_list
5724 VacuumStmt *n = makeNode(VacuumStmt);
5728 n->freeze_min_age = -1;
5738 | ANALYSE /* British */ {}
5742 VERBOSE { $$ = TRUE; }
5743 | /*EMPTY*/ { $$ = FALSE; }
5746 opt_full: FULL { $$ = TRUE; }
5747 | /*EMPTY*/ { $$ = FALSE; }
5750 opt_freeze: FREEZE { $$ = TRUE; }
5751 | /*EMPTY*/ { $$ = FALSE; }
5755 '(' name_list ')' { $$ = $2; }
5756 | /*EMPTY*/ { $$ = NIL; }
5760 /*****************************************************************************
5763 * EXPLAIN [ANALYZE] [VERBOSE] query
5765 *****************************************************************************/
5767 ExplainStmt: EXPLAIN opt_analyze opt_verbose ExplainableStmt
5769 ExplainStmt *n = makeNode(ExplainStmt);
5783 | ExecuteStmt /* by default all are $$=$1 */
5787 analyze_keyword { $$ = TRUE; }
5788 | /* EMPTY */ { $$ = FALSE; }
5791 /*****************************************************************************
5794 * PREPARE <plan_name> [(args, ...)] AS <query>
5796 *****************************************************************************/
5798 PrepareStmt: PREPARE name prep_type_clause AS PreparableStmt
5800 PrepareStmt *n = makeNode(PrepareStmt);
5808 prep_type_clause: '(' type_list ')' { $$ = $2; }
5809 | /* EMPTY */ { $$ = NIL; }
5816 | DeleteStmt /* by default all are $$=$1 */
5819 /*****************************************************************************
5821 * EXECUTE <plan_name> [(params, ...)]
5822 * CREATE TABLE <name> AS EXECUTE <plan_name> [(params, ...)]
5824 *****************************************************************************/
5826 ExecuteStmt: EXECUTE name execute_param_clause
5828 ExecuteStmt *n = makeNode(ExecuteStmt);
5834 | CREATE OptTemp TABLE create_as_target AS
5835 EXECUTE name execute_param_clause
5837 ExecuteStmt *n = makeNode(ExecuteStmt);
5840 $4->rel->istemp = $2;
5844 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5845 errmsg("column name list not allowed in CREATE TABLE / AS EXECUTE")));
5846 /* ... because it's not implemented, but it could be */
5851 execute_param_clause: '(' expr_list ')' { $$ = $2; }
5852 | /* EMPTY */ { $$ = NIL; }
5855 /*****************************************************************************
5858 * DEALLOCATE [PREPARE] <plan_name>
5860 *****************************************************************************/
5862 DeallocateStmt: DEALLOCATE name
5864 DeallocateStmt *n = makeNode(DeallocateStmt);
5868 | DEALLOCATE PREPARE name
5870 DeallocateStmt *n = makeNode(DeallocateStmt);
5876 DeallocateStmt *n = makeNode(DeallocateStmt);
5880 | DEALLOCATE PREPARE ALL
5882 DeallocateStmt *n = makeNode(DeallocateStmt);
5888 /*****************************************************************************
5893 *****************************************************************************/
5896 INSERT INTO qualified_name insert_rest returning_clause
5899 $4->returningList = $5;
5907 $$ = makeNode(InsertStmt);
5909 $$->selectStmt = $1;
5911 | '(' insert_column_list ')' SelectStmt
5913 $$ = makeNode(InsertStmt);
5915 $$->selectStmt = $4;
5919 $$ = makeNode(InsertStmt);
5921 $$->selectStmt = NULL;
5927 { $$ = list_make1($1); }
5928 | insert_column_list ',' insert_column_item
5929 { $$ = lappend($1, $3); }
5933 ColId opt_indirection
5935 $$ = makeNode(ResTarget);
5937 $$->indirection = $2;
5944 RETURNING target_list { $$ = $2; }
5945 | /* EMPTY */ { $$ = NIL; }
5949 /*****************************************************************************
5954 *****************************************************************************/
5956 DeleteStmt: DELETE_P FROM relation_expr_opt_alias
5957 using_clause where_or_current_clause returning_clause
5959 DeleteStmt *n = makeNode(DeleteStmt);
5961 n->usingClause = $4;
5962 n->whereClause = $5;
5963 n->returningList = $6;
5969 USING from_list { $$ = $2; }
5970 | /*EMPTY*/ { $$ = NIL; }
5973 LockStmt: LOCK_P opt_table qualified_name_list opt_lock opt_nowait
5975 LockStmt *n = makeNode(LockStmt);
5984 opt_lock: IN_P lock_type MODE { $$ = $2; }
5985 | /*EMPTY*/ { $$ = AccessExclusiveLock; }
5988 lock_type: ACCESS SHARE { $$ = AccessShareLock; }
5989 | ROW SHARE { $$ = RowShareLock; }
5990 | ROW EXCLUSIVE { $$ = RowExclusiveLock; }
5991 | SHARE UPDATE EXCLUSIVE { $$ = ShareUpdateExclusiveLock; }
5992 | SHARE { $$ = ShareLock; }
5993 | SHARE ROW EXCLUSIVE { $$ = ShareRowExclusiveLock; }
5994 | EXCLUSIVE { $$ = ExclusiveLock; }
5995 | ACCESS EXCLUSIVE { $$ = AccessExclusiveLock; }
5998 opt_nowait: NOWAIT { $$ = TRUE; }
5999 | /*EMPTY*/ { $$ = FALSE; }
6003 /*****************************************************************************
6006 * UpdateStmt (UPDATE)
6008 *****************************************************************************/
6010 UpdateStmt: UPDATE relation_expr_opt_alias
6013 where_or_current_clause
6016 UpdateStmt *n = makeNode(UpdateStmt);
6020 n->whereClause = $6;
6021 n->returningList = $7;
6027 set_clause { $$ = $1; }
6028 | set_clause_list ',' set_clause { $$ = list_concat($1,$3); }
6032 single_set_clause { $$ = list_make1($1); }
6033 | multiple_set_clause { $$ = $1; }
6037 set_target '=' ctext_expr
6040 $$->val = (Node *) $3;
6044 multiple_set_clause:
6045 '(' set_target_list ')' '=' ctext_row
6051 * Break the ctext_row apart, merge individual expressions
6052 * into the destination ResTargets. XXX this approach
6053 * cannot work for general row expressions as sources.
6055 if (list_length($2) != list_length($5))
6057 (errcode(ERRCODE_SYNTAX_ERROR),
6058 errmsg("number of columns does not match number of values")));
6059 forboth(col_cell, $2, val_cell, $5)
6061 ResTarget *res_col = (ResTarget *) lfirst(col_cell);
6062 Node *res_val = (Node *) lfirst(val_cell);
6064 res_col->val = res_val;
6072 ColId opt_indirection
6074 $$ = makeNode(ResTarget);
6076 $$->indirection = $2;
6077 $$->val = NULL; /* upper production sets this */
6083 set_target { $$ = list_make1($1); }
6084 | set_target_list ',' set_target { $$ = lappend($1,$3); }
6088 /*****************************************************************************
6093 *****************************************************************************/
6094 DeclareCursorStmt: DECLARE name cursor_options CURSOR opt_hold FOR SelectStmt
6096 DeclareCursorStmt *n = makeNode(DeclareCursorStmt);
6098 /* currently we always set FAST_PLAN option */
6099 n->options = $3 | $5 | CURSOR_OPT_FAST_PLAN;
6105 cursor_options: /*EMPTY*/ { $$ = 0; }
6106 | cursor_options NO SCROLL { $$ = $1 | CURSOR_OPT_NO_SCROLL; }
6107 | cursor_options SCROLL { $$ = $1 | CURSOR_OPT_SCROLL; }
6108 | cursor_options BINARY { $$ = $1 | CURSOR_OPT_BINARY; }
6109 | cursor_options INSENSITIVE { $$ = $1 | CURSOR_OPT_INSENSITIVE; }
6112 opt_hold: /* EMPTY */ { $$ = 0; }
6113 | WITH HOLD { $$ = CURSOR_OPT_HOLD; }
6114 | WITHOUT HOLD { $$ = 0; }
6117 /*****************************************************************************
6122 *****************************************************************************/
6124 /* A complete SELECT statement looks like this.
6126 * The rule returns either a single SelectStmt node or a tree of them,
6127 * representing a set-operation tree.
6129 * There is an ambiguity when a sub-SELECT is within an a_expr and there
6130 * are excess parentheses: do the parentheses belong to the sub-SELECT or
6131 * to the surrounding a_expr? We don't really care, but yacc wants to know.
6132 * To resolve the ambiguity, we are careful to define the grammar so that
6133 * the decision is staved off as long as possible: as long as we can keep
6134 * absorbing parentheses into the sub-SELECT, we will do so, and only when
6135 * it's no longer possible to do that will we decide that parens belong to
6136 * the expression. For example, in "SELECT (((SELECT 2)) + 3)" the extra
6137 * parentheses are treated as part of the sub-select. The necessity of doing
6138 * it that way is shown by "SELECT (((SELECT 2)) UNION SELECT 2)". Had we
6139 * parsed "((SELECT 2))" as an a_expr, it'd be too late to go back to the
6140 * SELECT viewpoint when we see the UNION.
6142 * This approach is implemented by defining a nonterminal select_with_parens,
6143 * which represents a SELECT with at least one outer layer of parentheses,
6144 * and being careful to use select_with_parens, never '(' SelectStmt ')',
6145 * in the expression grammar. We will then have shift-reduce conflicts
6146 * which we can resolve in favor of always treating '(' <select> ')' as
6147 * a select_with_parens. To resolve the conflicts, the productions that
6148 * conflict with the select_with_parens productions are manually given
6149 * precedences lower than the precedence of ')', thereby ensuring that we
6150 * shift ')' (and then reduce to select_with_parens) rather than trying to
6151 * reduce the inner <select> nonterminal to something else. We use UMINUS
6152 * precedence for this, which is a fairly arbitrary choice.
6154 * To be able to define select_with_parens itself without ambiguity, we need
6155 * a nonterminal select_no_parens that represents a SELECT structure with no
6156 * outermost parentheses. This is a little bit tedious, but it works.
6158 * In non-expression contexts, we use SelectStmt which can represent a SELECT
6159 * with or without outer parentheses.
6162 SelectStmt: select_no_parens %prec UMINUS
6163 | select_with_parens %prec UMINUS
6167 '(' select_no_parens ')' { $$ = $2; }
6168 | '(' select_with_parens ')' { $$ = $2; }
6172 * FOR UPDATE/SHARE may be before or after LIMIT/OFFSET.
6173 * In <=7.2.X, LIMIT/OFFSET had to be after FOR UPDATE
6174 * We now support both orderings, but prefer LIMIT/OFFSET before FOR UPDATE/SHARE
6178 simple_select { $$ = $1; }
6179 | select_clause sort_clause
6181 insertSelectOptions((SelectStmt *) $1, $2, NIL,
6185 | select_clause opt_sort_clause for_locking_clause opt_select_limit
6187 insertSelectOptions((SelectStmt *) $1, $2, $3,
6188 list_nth($4, 0), list_nth($4, 1));
6191 | select_clause opt_sort_clause select_limit opt_for_locking_clause
6193 insertSelectOptions((SelectStmt *) $1, $2, $4,
6194 list_nth($3, 0), list_nth($3, 1));
6200 simple_select { $$ = $1; }
6201 | select_with_parens { $$ = $1; }
6205 * This rule parses SELECT statements that can appear within set operations,
6206 * including UNION, INTERSECT and EXCEPT. '(' and ')' can be used to specify
6207 * the ordering of the set operations. Without '(' and ')' we want the
6208 * operations to be ordered per the precedence specs at the head of this file.
6210 * As with select_no_parens, simple_select cannot have outer parentheses,
6211 * but can have parenthesized subclauses.
6213 * Note that sort clauses cannot be included at this level --- SQL92 requires
6214 * SELECT foo UNION SELECT bar ORDER BY baz
6216 * (SELECT foo UNION SELECT bar) ORDER BY baz
6218 * SELECT foo UNION (SELECT bar ORDER BY baz)
6219 * Likewise FOR UPDATE and LIMIT. Therefore, those clauses are described
6220 * as part of the select_no_parens production, not simple_select.
6221 * This does not limit functionality, because you can reintroduce sort and
6222 * limit clauses inside parentheses.
6224 * NOTE: only the leftmost component SelectStmt should have INTO.
6225 * However, this is not checked by the grammar; parse analysis must check it.
6228 SELECT opt_distinct target_list
6229 into_clause from_clause where_clause
6230 group_clause having_clause
6232 SelectStmt *n = makeNode(SelectStmt);
6233 n->distinctClause = $2;
6237 n->whereClause = $6;
6238 n->groupClause = $7;
6239 n->havingClause = $8;
6242 | values_clause { $$ = $1; }
6243 | select_clause UNION opt_all select_clause
6245 $$ = makeSetOp(SETOP_UNION, $3, $1, $4);
6247 | select_clause INTERSECT opt_all select_clause
6249 $$ = makeSetOp(SETOP_INTERSECT, $3, $1, $4);
6251 | select_clause EXCEPT opt_all select_clause
6253 $$ = makeSetOp(SETOP_EXCEPT, $3, $1, $4);
6258 INTO OptTempTableName
6260 $$ = makeNode(IntoClause);
6264 $$->onCommit = ONCOMMIT_NOOP;
6265 $$->tableSpaceName = NULL;
6272 * Redundancy here is needed to avoid shift/reduce conflicts,
6273 * since TEMP is not a reserved word. See also OptTemp.
6276 TEMPORARY opt_table qualified_name
6281 | TEMP opt_table qualified_name
6286 | LOCAL TEMPORARY opt_table qualified_name
6291 | LOCAL TEMP opt_table qualified_name
6296 | GLOBAL TEMPORARY opt_table qualified_name
6301 | GLOBAL TEMP opt_table qualified_name
6306 | TABLE qualified_name
6322 opt_all: ALL { $$ = TRUE; }
6323 | DISTINCT { $$ = FALSE; }
6324 | /*EMPTY*/ { $$ = FALSE; }
6327 /* We use (NIL) as a placeholder to indicate that all target expressions
6328 * should be placed in the DISTINCT list during parsetree analysis.
6331 DISTINCT { $$ = list_make1(NIL); }
6332 | DISTINCT ON '(' expr_list ')' { $$ = $4; }
6334 | /*EMPTY*/ { $$ = NIL; }
6338 sort_clause { $$ = $1;}
6339 | /*EMPTY*/ { $$ = NIL; }
6343 ORDER BY sortby_list { $$ = $3; }
6347 sortby { $$ = list_make1($1); }
6348 | sortby_list ',' sortby { $$ = lappend($1, $3); }
6351 sortby: a_expr USING qual_all_Op opt_nulls_order
6353 $$ = makeNode(SortBy);
6355 $$->sortby_dir = SORTBY_USING;
6356 $$->sortby_nulls = $4;
6359 | a_expr opt_asc_desc opt_nulls_order
6361 $$ = makeNode(SortBy);
6363 $$->sortby_dir = $2;
6364 $$->sortby_nulls = $3;
6371 LIMIT select_limit_value OFFSET select_offset_value
6372 { $$ = list_make2($4, $2); }
6373 | OFFSET select_offset_value LIMIT select_limit_value
6374 { $$ = list_make2($2, $4); }
6375 | LIMIT select_limit_value
6376 { $$ = list_make2(NULL, $2); }
6377 | OFFSET select_offset_value
6378 { $$ = list_make2($2, NULL); }
6379 | LIMIT select_limit_value ',' select_offset_value
6381 /* Disabled because it was too confusing, bjm 2002-02-18 */
6383 (errcode(ERRCODE_SYNTAX_ERROR),
6384 errmsg("LIMIT #,# syntax is not supported"),
6385 errhint("Use separate LIMIT and OFFSET clauses.")));
6390 select_limit { $$ = $1; }
6392 { $$ = list_make2(NULL,NULL); }
6399 /* LIMIT ALL is represented as a NULL constant */
6400 $$ = makeNullAConst();
6404 select_offset_value:
6409 GROUP_P BY expr_list { $$ = $3; }
6410 | /*EMPTY*/ { $$ = NIL; }
6414 HAVING a_expr { $$ = $2; }
6415 | /*EMPTY*/ { $$ = NULL; }
6419 for_locking_items { $$ = $1; }
6420 | FOR READ ONLY { $$ = NIL; }
6423 opt_for_locking_clause:
6424 for_locking_clause { $$ = $1; }
6425 | /* EMPTY */ { $$ = NIL; }
6429 for_locking_item { $$ = list_make1($1); }
6430 | for_locking_items for_locking_item { $$ = lappend($1, $2); }
6434 FOR UPDATE locked_rels_list opt_nowait
6436 LockingClause *n = makeNode(LockingClause);
6438 n->forUpdate = TRUE;
6442 | FOR SHARE locked_rels_list opt_nowait
6444 LockingClause *n = makeNode(LockingClause);
6446 n->forUpdate = FALSE;
6453 OF name_list { $$ = $2; }
6454 | /* EMPTY */ { $$ = NIL; }
6461 SelectStmt *n = makeNode(SelectStmt);
6462 n->valuesLists = list_make1($2);
6465 | values_clause ',' ctext_row
6467 SelectStmt *n = (SelectStmt *) $1;
6468 n->valuesLists = lappend(n->valuesLists, $3);
6474 /*****************************************************************************
6476 * clauses common to all Optimizable Stmts:
6477 * from_clause - allow list of both JOIN expressions and table names
6478 * where_clause - qualifications for joins or restrictions
6480 *****************************************************************************/
6483 FROM from_list { $$ = $2; }
6484 | /*EMPTY*/ { $$ = NIL; }
6488 table_ref { $$ = list_make1($1); }
6489 | from_list ',' table_ref { $$ = lappend($1, $3); }
6493 * table_ref is where an alias clause can be attached. Note we cannot make
6494 * alias_clause have an empty production because that causes parse conflicts
6495 * between table_ref := '(' joined_table ')' alias_clause
6496 * and joined_table := '(' joined_table ')'. So, we must have the
6497 * redundant-looking productions here instead.
6499 table_ref: relation_expr
6503 | relation_expr alias_clause
6510 RangeFunction *n = makeNode(RangeFunction);
6511 n->funccallnode = $1;
6512 n->coldeflist = NIL;
6515 | func_table alias_clause
6517 RangeFunction *n = makeNode(RangeFunction);
6518 n->funccallnode = $1;
6520 n->coldeflist = NIL;
6523 | func_table AS '(' TableFuncElementList ')'
6525 RangeFunction *n = makeNode(RangeFunction);
6526 n->funccallnode = $1;
6530 | func_table AS ColId '(' TableFuncElementList ')'
6532 RangeFunction *n = makeNode(RangeFunction);
6533 Alias *a = makeNode(Alias);
6534 n->funccallnode = $1;
6540 | func_table ColId '(' TableFuncElementList ')'
6542 RangeFunction *n = makeNode(RangeFunction);
6543 Alias *a = makeNode(Alias);
6544 n->funccallnode = $1;
6550 | select_with_parens
6553 * The SQL spec does not permit a subselect
6554 * (<derived_table>) without an alias clause,
6555 * so we don't either. This avoids the problem
6556 * of needing to invent a unique refname for it.
6557 * That could be surmounted if there's sufficient
6558 * popular demand, but for now let's just implement
6559 * the spec and see if anyone complains.
6560 * However, it does seem like a good idea to emit
6561 * an error message that's better than "syntax error".
6563 if (IsA($1, SelectStmt) &&
6564 ((SelectStmt *) $1)->valuesLists)
6566 (errcode(ERRCODE_SYNTAX_ERROR),
6567 errmsg("VALUES in FROM must have an alias"),
6568 errhint("For example, FROM (VALUES ...) [AS] foo.")));
6571 (errcode(ERRCODE_SYNTAX_ERROR),
6572 errmsg("subquery in FROM must have an alias"),
6573 errhint("For example, FROM (SELECT ...) [AS] foo.")));
6576 | select_with_parens alias_clause
6578 RangeSubselect *n = makeNode(RangeSubselect);
6587 | '(' joined_table ')' alias_clause
6596 * It may seem silly to separate joined_table from table_ref, but there is
6597 * method in SQL92's madness: if you don't do it this way you get reduce-
6598 * reduce conflicts, because it's not clear to the parser generator whether
6599 * to expect alias_clause after ')' or not. For the same reason we must
6600 * treat 'JOIN' and 'join_type JOIN' separately, rather than allowing
6601 * join_type to expand to empty; if we try it, the parser generator can't
6602 * figure out when to reduce an empty join_type right after table_ref.
6604 * Note that a CROSS JOIN is the same as an unqualified
6605 * INNER JOIN, and an INNER JOIN/ON has the same shape
6606 * but a qualification expression to limit membership.
6607 * A NATURAL JOIN implicitly matches column names between
6608 * tables and the shape is determined by which columns are
6609 * in common. We'll collect columns during the later transformations.
6613 '(' joined_table ')'
6617 | table_ref CROSS JOIN table_ref
6619 /* CROSS JOIN is same as unqualified inner join */
6620 JoinExpr *n = makeNode(JoinExpr);
6621 n->jointype = JOIN_INNER;
6622 n->isNatural = FALSE;
6629 | table_ref join_type JOIN table_ref join_qual
6631 JoinExpr *n = makeNode(JoinExpr);
6633 n->isNatural = FALSE;
6636 if ($5 != NULL && IsA($5, List))
6637 n->using = (List *) $5; /* USING clause */
6639 n->quals = $5; /* ON clause */
6642 | table_ref JOIN table_ref join_qual
6644 /* letting join_type reduce to empty doesn't work */
6645 JoinExpr *n = makeNode(JoinExpr);
6646 n->jointype = JOIN_INNER;
6647 n->isNatural = FALSE;
6650 if ($4 != NULL && IsA($4, List))
6651 n->using = (List *) $4; /* USING clause */
6653 n->quals = $4; /* ON clause */
6656 | table_ref NATURAL join_type JOIN table_ref
6658 JoinExpr *n = makeNode(JoinExpr);
6660 n->isNatural = TRUE;
6663 n->using = NIL; /* figure out which columns later... */
6664 n->quals = NULL; /* fill later */
6667 | table_ref NATURAL JOIN table_ref
6669 /* letting join_type reduce to empty doesn't work */
6670 JoinExpr *n = makeNode(JoinExpr);
6671 n->jointype = JOIN_INNER;
6672 n->isNatural = TRUE;
6675 n->using = NIL; /* figure out which columns later... */
6676 n->quals = NULL; /* fill later */
6682 AS ColId '(' name_list ')'
6684 $$ = makeNode(Alias);
6690 $$ = makeNode(Alias);
6693 | ColId '(' name_list ')'
6695 $$ = makeNode(Alias);
6701 $$ = makeNode(Alias);
6706 join_type: FULL join_outer { $$ = JOIN_FULL; }
6707 | LEFT join_outer { $$ = JOIN_LEFT; }
6708 | RIGHT join_outer { $$ = JOIN_RIGHT; }
6709 | INNER_P { $$ = JOIN_INNER; }
6712 /* OUTER is just noise... */
6713 join_outer: OUTER_P { $$ = NULL; }
6714 | /*EMPTY*/ { $$ = NULL; }
6717 /* JOIN qualification clauses
6718 * Possibilities are:
6719 * USING ( column list ) allows only unqualified column names,
6720 * which must match between tables.
6721 * ON expr allows more general qualifications.
6723 * We return USING as a List node, while an ON-expr will not be a List.
6726 join_qual: USING '(' name_list ')' { $$ = (Node *) $3; }
6727 | ON a_expr { $$ = $2; }
6734 /* default inheritance */
6736 $$->inhOpt = INH_DEFAULT;
6739 | qualified_name '*'
6741 /* inheritance query */
6743 $$->inhOpt = INH_YES;
6746 | ONLY qualified_name
6748 /* no inheritance */
6750 $$->inhOpt = INH_NO;
6753 | ONLY '(' qualified_name ')'
6755 /* no inheritance, SQL99-style syntax */
6757 $$->inhOpt = INH_NO;
6764 * Given "UPDATE foo set set ...", we have to decide without looking any
6765 * further ahead whether the first "set" is an alias or the UPDATE's SET
6766 * keyword. Since "set" is allowed as a column name both interpretations
6767 * are feasible. We resolve the shift/reduce conflict by giving the first
6768 * relation_expr_opt_alias production a higher precedence than the SET token
6769 * has, causing the parser to prefer to reduce, in effect assuming that the
6770 * SET is not an alias.
6772 relation_expr_opt_alias: relation_expr %prec UMINUS
6776 | relation_expr ColId
6778 Alias *alias = makeNode(Alias);
6779 alias->aliasname = $2;
6783 | relation_expr AS ColId
6785 Alias *alias = makeNode(Alias);
6786 alias->aliasname = $3;
6793 func_table: func_expr { $$ = $1; }
6798 WHERE a_expr { $$ = $2; }
6799 | /*EMPTY*/ { $$ = NULL; }
6802 /* variant for UPDATE and DELETE */
6803 where_or_current_clause:
6804 WHERE a_expr { $$ = $2; }
6805 | WHERE CURRENT_P OF name
6807 CurrentOfExpr *n = makeNode(CurrentOfExpr);
6808 /* cvarno is filled in by parse analysis */
6809 n->cursor_name = $4;
6810 n->cursor_param = 0;
6813 | WHERE CURRENT_P OF PARAM
6815 CurrentOfExpr *n = makeNode(CurrentOfExpr);
6816 /* cvarno is filled in by parse analysis */
6817 n->cursor_name = NULL;
6818 n->cursor_param = $4;
6821 | /*EMPTY*/ { $$ = NULL; }
6825 TableFuncElementList:
6828 $$ = list_make1($1);
6830 | TableFuncElementList ',' TableFuncElement
6832 $$ = lappend($1, $3);
6836 TableFuncElement: ColId Typename
6838 ColumnDef *n = makeNode(ColumnDef);
6841 n->constraints = NIL;
6847 /*****************************************************************************
6850 * SQL92 introduces a large amount of type-specific syntax.
6851 * Define individual clauses to handle these cases, and use
6852 * the generic case to handle regular type-extensible Postgres syntax.
6853 * - thomas 1997-10-10
6855 *****************************************************************************/
6857 Typename: SimpleTypename opt_array_bounds
6860 $$->arrayBounds = $2;
6862 | SETOF SimpleTypename opt_array_bounds
6865 $$->arrayBounds = $3;
6868 | SimpleTypename ARRAY '[' Iconst ']'
6870 /* SQL99's redundant syntax */
6872 $$->arrayBounds = list_make1(makeInteger($4));
6874 | SETOF SimpleTypename ARRAY '[' Iconst ']'
6876 /* SQL99's redundant syntax */
6878 $$->arrayBounds = list_make1(makeInteger($5));
6884 opt_array_bounds '[' ']'
6885 { $$ = lappend($1, makeInteger(-1)); }
6886 | opt_array_bounds '[' Iconst ']'
6887 { $$ = lappend($1, makeInteger($3)); }
6893 GenericType { $$ = $1; }
6894 | Numeric { $$ = $1; }
6896 | Character { $$ = $1; }
6897 | ConstDatetime { $$ = $1; }
6898 | ConstInterval opt_interval
6901 if ($2 != INTERVAL_FULL_RANGE)
6902 $$->typmods = list_make1(makeIntConst($2));
6904 | ConstInterval '(' Iconst ')' opt_interval
6907 $$->typmods = list_make2(makeIntConst($5),
6912 /* We have a separate ConstTypename to allow defaulting fixed-length
6913 * types such as CHAR() and BIT() to an unspecified length.
6914 * SQL9x requires that these default to a length of one, but this
6915 * makes no sense for constructs like CHAR 'hi' and BIT '0101',
6916 * where there is an obvious better choice to make.
6917 * Note that ConstInterval is not included here since it must
6918 * be pushed up higher in the rules to accomodate the postfix
6919 * options (e.g. INTERVAL '1' YEAR). Likewise, we have to handle
6920 * the generic-type-name case in AExprConst to avoid premature
6921 * reduce/reduce conflicts against function names.
6924 Numeric { $$ = $1; }
6925 | ConstBit { $$ = $1; }
6926 | ConstCharacter { $$ = $1; }
6927 | ConstDatetime { $$ = $1; }
6931 * GenericType covers all type names that don't have special syntax mandated
6932 * by the standard, including qualified names. We also allow type modifiers.
6933 * To avoid parsing conflicts against function invocations, the modifiers
6934 * have to be shown as expr_list here, but parse analysis will only accept
6935 * constants for them.
6938 type_function_name opt_type_modifiers
6940 $$ = makeTypeName($1);
6944 | type_function_name attrs opt_type_modifiers
6946 $$ = makeTypeNameFromNameList(lcons(makeString($1), $2));
6952 opt_type_modifiers: '(' expr_list ')' { $$ = $2; }
6953 | /* EMPTY */ { $$ = NIL; }
6957 * SQL92 numeric data types
6961 $$ = SystemTypeName("int4");
6966 $$ = SystemTypeName("int4");
6971 $$ = SystemTypeName("int2");
6976 $$ = SystemTypeName("int8");
6981 $$ = SystemTypeName("float4");
6989 | DOUBLE_P PRECISION
6991 $$ = SystemTypeName("float8");
6994 | DECIMAL_P opt_type_modifiers
6996 $$ = SystemTypeName("numeric");
7000 | DEC opt_type_modifiers
7002 $$ = SystemTypeName("numeric");
7006 | NUMERIC opt_type_modifiers
7008 $$ = SystemTypeName("numeric");
7014 $$ = SystemTypeName("bool");
7019 opt_float: '(' Iconst ')'
7022 * Check FLOAT() precision limits assuming IEEE floating
7023 * types - thomas 1997-09-18
7027 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
7028 errmsg("precision for type float must be at least 1 bit")));
7030 $$ = SystemTypeName("float4");
7032 $$ = SystemTypeName("float8");
7035 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
7036 errmsg("precision for type float must be less than 54 bits")));
7040 $$ = SystemTypeName("float8");
7045 * SQL92 bit-field data types
7046 * The following implements BIT() and BIT VARYING().
7058 /* ConstBit is like Bit except "BIT" defaults to unspecified length */
7059 /* See notes for ConstCharacter, which addresses same issue for "CHAR" */
7060 ConstBit: BitWithLength
7072 BIT opt_varying '(' expr_list ')'
7076 typname = $2 ? "varbit" : "bit";
7077 $$ = SystemTypeName(typname);
7086 /* bit defaults to bit(1), varbit to no limit */
7089 $$ = SystemTypeName("varbit");
7093 $$ = SystemTypeName("bit");
7094 $$->typmods = list_make1(makeIntConst(1));
7102 * SQL92 character data types
7103 * The following implements CHAR() and VARCHAR().
7105 Character: CharacterWithLength
7109 | CharacterWithoutLength
7115 ConstCharacter: CharacterWithLength
7119 | CharacterWithoutLength
7121 /* Length was not specified so allow to be unrestricted.
7122 * This handles problems with fixed-length (bpchar) strings
7123 * which in column definitions must default to a length
7124 * of one, but should not be constrained if the length
7125 * was not specified.
7132 CharacterWithLength: character '(' Iconst ')' opt_charset
7134 if (($5 != NULL) && (strcmp($5, "sql_text") != 0))
7138 type = palloc(strlen($1) + 1 + strlen($5) + 1);
7145 $$ = SystemTypeName($1);
7146 $$->typmods = list_make1(makeIntConst($3));
7151 CharacterWithoutLength: character opt_charset
7153 if (($2 != NULL) && (strcmp($2, "sql_text") != 0))
7157 type = palloc(strlen($1) + 1 + strlen($2) + 1);
7164 $$ = SystemTypeName($1);
7166 /* char defaults to char(1), varchar to no limit */
7167 if (strcmp($1, "bpchar") == 0)
7168 $$->typmods = list_make1(makeIntConst(1));
7174 character: CHARACTER opt_varying
7175 { $$ = $2 ? "varchar": "bpchar"; }
7176 | CHAR_P opt_varying
7177 { $$ = $2 ? "varchar": "bpchar"; }
7180 | NATIONAL CHARACTER opt_varying
7181 { $$ = $3 ? "varchar": "bpchar"; }
7182 | NATIONAL CHAR_P opt_varying
7183 { $$ = $3 ? "varchar": "bpchar"; }
7185 { $$ = $2 ? "varchar": "bpchar"; }
7189 VARYING { $$ = TRUE; }
7190 | /*EMPTY*/ { $$ = FALSE; }
7194 CHARACTER SET ColId { $$ = $3; }
7195 | /*EMPTY*/ { $$ = NULL; }
7199 * SQL92 date/time types
7202 TIMESTAMP '(' Iconst ')' opt_timezone
7205 $$ = SystemTypeName("timestamptz");
7207 $$ = SystemTypeName("timestamp");
7208 $$->typmods = list_make1(makeIntConst($3));
7211 | TIMESTAMP opt_timezone
7214 $$ = SystemTypeName("timestamptz");
7216 $$ = SystemTypeName("timestamp");
7219 | TIME '(' Iconst ')' opt_timezone
7222 $$ = SystemTypeName("timetz");
7224 $$ = SystemTypeName("time");
7225 $$->typmods = list_make1(makeIntConst($3));
7231 $$ = SystemTypeName("timetz");
7233 $$ = SystemTypeName("time");
7241 $$ = SystemTypeName("interval");
7247 WITH TIME ZONE { $$ = TRUE; }
7248 | WITHOUT TIME ZONE { $$ = FALSE; }
7249 | /*EMPTY*/ { $$ = FALSE; }
7253 YEAR_P { $$ = INTERVAL_MASK(YEAR); }
7254 | MONTH_P { $$ = INTERVAL_MASK(MONTH); }
7255 | DAY_P { $$ = INTERVAL_MASK(DAY); }
7256 | HOUR_P { $$ = INTERVAL_MASK(HOUR); }
7257 | MINUTE_P { $$ = INTERVAL_MASK(MINUTE); }
7258 | SECOND_P { $$ = INTERVAL_MASK(SECOND); }
7260 { $$ = INTERVAL_MASK(YEAR) | INTERVAL_MASK(MONTH); }
7262 { $$ = INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR); }
7264 { $$ = INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR)
7265 | INTERVAL_MASK(MINUTE); }
7267 { $$ = INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR)
7268 | INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND); }
7269 | HOUR_P TO MINUTE_P
7270 { $$ = INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE); }
7271 | HOUR_P TO SECOND_P
7272 { $$ = INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE)
7273 | INTERVAL_MASK(SECOND); }
7274 | MINUTE_P TO SECOND_P
7275 { $$ = INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND); }
7276 | /*EMPTY*/ { $$ = INTERVAL_FULL_RANGE; }
7280 /*****************************************************************************
7282 * expression grammar
7284 *****************************************************************************/
7287 * General expressions
7288 * This is the heart of the expression syntax.
7290 * We have two expression types: a_expr is the unrestricted kind, and
7291 * b_expr is a subset that must be used in some places to avoid shift/reduce
7292 * conflicts. For example, we can't do BETWEEN as "BETWEEN a_expr AND a_expr"
7293 * because that use of AND conflicts with AND as a boolean operator. So,
7294 * b_expr is used in BETWEEN and we remove boolean keywords from b_expr.
7296 * Note that '(' a_expr ')' is a b_expr, so an unrestricted expression can
7297 * always be used by surrounding it with parens.
7299 * c_expr is all the productions that are common to a_expr and b_expr;
7300 * it's factored out just to eliminate redundant coding.
7302 a_expr: c_expr { $$ = $1; }
7303 | a_expr TYPECAST Typename
7304 { $$ = makeTypeCast($1, $3); }
7305 | a_expr AT TIME ZONE a_expr
7307 FuncCall *n = makeNode(FuncCall);
7308 n->funcname = SystemFuncName("timezone");
7309 n->args = list_make2($5, $1);
7310 n->agg_star = FALSE;
7311 n->agg_distinct = FALSE;
7316 * These operators must be called out explicitly in order to make use
7317 * of yacc/bison's automatic operator-precedence handling. All other
7318 * operator names are handled by the generic productions using "Op",
7319 * below; and all those operators will have the same precedence.
7321 * If you add more explicitly-known operators, be sure to add them
7322 * also to b_expr and to the MathOp list above.
7324 | '+' a_expr %prec UMINUS
7325 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2, @1); }
7326 | '-' a_expr %prec UMINUS
7327 { $$ = doNegate($2, @1); }
7329 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", $1, $3, @2); }
7331 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "-", $1, $3, @2); }
7333 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "*", $1, $3, @2); }
7335 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "/", $1, $3, @2); }
7337 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, $3, @2); }
7339 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, $3, @2); }
7341 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $3, @2); }
7343 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $3, @2); }
7345 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "=", $1, $3, @2); }
7347 | a_expr qual_Op a_expr %prec Op
7348 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, $3, @2); }
7349 | qual_Op a_expr %prec Op
7350 { $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2, @1); }
7351 | a_expr qual_Op %prec POSTFIXOP
7352 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, NULL, @2); }
7355 { $$ = (Node *) makeA_Expr(AEXPR_AND, NIL, $1, $3, @2); }
7357 { $$ = (Node *) makeA_Expr(AEXPR_OR, NIL, $1, $3, @2); }
7359 { $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL, $2, @1); }
7361 | a_expr LIKE a_expr
7362 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~", $1, $3, @2); }
7363 | a_expr LIKE a_expr ESCAPE a_expr
7365 FuncCall *n = makeNode(FuncCall);
7366 n->funcname = SystemFuncName("like_escape");
7367 n->args = list_make2($3, $5);
7368 n->agg_star = FALSE;
7369 n->agg_distinct = FALSE;
7371 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~", $1, (Node *) n, @2);
7373 | a_expr NOT LIKE a_expr
7374 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~", $1, $4, @2); }
7375 | a_expr NOT LIKE a_expr ESCAPE a_expr
7377 FuncCall *n = makeNode(FuncCall);
7378 n->funcname = SystemFuncName("like_escape");
7379 n->args = list_make2($4, $6);
7380 n->agg_star = FALSE;
7381 n->agg_distinct = FALSE;
7383 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~", $1, (Node *) n, @2);
7385 | a_expr ILIKE a_expr
7386 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~*", $1, $3, @2); }
7387 | a_expr ILIKE a_expr ESCAPE a_expr
7389 FuncCall *n = makeNode(FuncCall);
7390 n->funcname = SystemFuncName("like_escape");
7391 n->args = list_make2($3, $5);
7392 n->agg_star = FALSE;
7393 n->agg_distinct = FALSE;
7395 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~*", $1, (Node *) n, @2);
7397 | a_expr NOT ILIKE a_expr
7398 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~*", $1, $4, @2); }
7399 | a_expr NOT ILIKE a_expr ESCAPE a_expr
7401 FuncCall *n = makeNode(FuncCall);
7402 n->funcname = SystemFuncName("like_escape");
7403 n->args = list_make2($4, $6);
7404 n->agg_star = FALSE;
7405 n->agg_distinct = FALSE;
7407 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~*", $1, (Node *) n, @2);
7410 | a_expr SIMILAR TO a_expr %prec SIMILAR
7412 FuncCall *n = makeNode(FuncCall);
7413 n->funcname = SystemFuncName("similar_escape");
7414 n->args = list_make2($4, makeNullAConst());
7415 n->agg_star = FALSE;
7416 n->agg_distinct = FALSE;
7418 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~", $1, (Node *) n, @2);
7420 | a_expr SIMILAR TO a_expr ESCAPE a_expr
7422 FuncCall *n = makeNode(FuncCall);
7423 n->funcname = SystemFuncName("similar_escape");
7424 n->args = list_make2($4, $6);
7425 n->agg_star = FALSE;
7426 n->agg_distinct = FALSE;
7428 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~", $1, (Node *) n, @2);
7430 | a_expr NOT SIMILAR TO a_expr %prec SIMILAR
7432 FuncCall *n = makeNode(FuncCall);
7433 n->funcname = SystemFuncName("similar_escape");
7434 n->args = list_make2($5, makeNullAConst());
7435 n->agg_star = FALSE;
7436 n->agg_distinct = FALSE;
7438 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~", $1, (Node *) n, @2);
7440 | a_expr NOT SIMILAR TO a_expr ESCAPE a_expr
7442 FuncCall *n = makeNode(FuncCall);
7443 n->funcname = SystemFuncName("similar_escape");
7444 n->args = list_make2($5, $7);
7445 n->agg_star = FALSE;
7446 n->agg_distinct = FALSE;
7448 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~", $1, (Node *) n, @2);
7452 * Define SQL92-style Null test clause.
7453 * Allow two forms described in the standard:
7456 * Allow two SQL extensions
7462 NullTest *n = makeNode(NullTest);
7463 n->arg = (Expr *) $1;
7464 n->nulltesttype = IS_NULL;
7469 NullTest *n = makeNode(NullTest);
7470 n->arg = (Expr *) $1;
7471 n->nulltesttype = IS_NULL;
7474 | a_expr IS NOT NULL_P
7476 NullTest *n = makeNode(NullTest);
7477 n->arg = (Expr *) $1;
7478 n->nulltesttype = IS_NOT_NULL;
7483 NullTest *n = makeNode(NullTest);
7484 n->arg = (Expr *) $1;
7485 n->nulltesttype = IS_NOT_NULL;
7490 $$ = (Node *)makeOverlaps($1, $3, @2);
7494 BooleanTest *b = makeNode(BooleanTest);
7495 b->arg = (Expr *) $1;
7496 b->booltesttype = IS_TRUE;
7499 | a_expr IS NOT TRUE_P
7501 BooleanTest *b = makeNode(BooleanTest);
7502 b->arg = (Expr *) $1;
7503 b->booltesttype = IS_NOT_TRUE;
7508 BooleanTest *b = makeNode(BooleanTest);
7509 b->arg = (Expr *) $1;
7510 b->booltesttype = IS_FALSE;
7513 | a_expr IS NOT FALSE_P
7515 BooleanTest *b = makeNode(BooleanTest);
7516 b->arg = (Expr *) $1;
7517 b->booltesttype = IS_NOT_FALSE;
7522 BooleanTest *b = makeNode(BooleanTest);
7523 b->arg = (Expr *) $1;
7524 b->booltesttype = IS_UNKNOWN;
7527 | a_expr IS NOT UNKNOWN
7529 BooleanTest *b = makeNode(BooleanTest);
7530 b->arg = (Expr *) $1;
7531 b->booltesttype = IS_NOT_UNKNOWN;
7534 | a_expr IS DISTINCT FROM a_expr %prec IS
7536 $$ = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $5, @2);
7538 | a_expr IS NOT DISTINCT FROM a_expr %prec IS
7540 $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL,
7541 (Node *) makeSimpleA_Expr(AEXPR_DISTINCT,
7546 | a_expr IS OF '(' type_list ')' %prec IS
7548 $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "=", $1, (Node *) $5, @2);
7550 | a_expr IS NOT OF '(' type_list ')' %prec IS
7552 $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "<>", $1, (Node *) $6, @2);
7554 | a_expr BETWEEN opt_asymmetric b_expr AND b_expr %prec BETWEEN
7556 $$ = (Node *) makeA_Expr(AEXPR_AND, NIL,
7557 (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $4, @2),
7558 (Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $6, @2),
7561 | a_expr NOT BETWEEN opt_asymmetric b_expr AND b_expr %prec BETWEEN
7563 $$ = (Node *) makeA_Expr(AEXPR_OR, NIL,
7564 (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $5, @2),
7565 (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $7, @2),
7568 | a_expr BETWEEN SYMMETRIC b_expr AND b_expr %prec BETWEEN
7570 $$ = (Node *) makeA_Expr(AEXPR_OR, NIL,
7571 (Node *) makeA_Expr(AEXPR_AND, NIL,
7572 (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $4, @2),
7573 (Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $6, @2),
7575 (Node *) makeA_Expr(AEXPR_AND, NIL,
7576 (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $6, @2),
7577 (Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $4, @2),
7581 | a_expr NOT BETWEEN SYMMETRIC b_expr AND b_expr %prec BETWEEN
7583 $$ = (Node *) makeA_Expr(AEXPR_AND, NIL,
7584 (Node *) makeA_Expr(AEXPR_OR, NIL,
7585 (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $5, @2),
7586 (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $7, @2),
7588 (Node *) makeA_Expr(AEXPR_OR, NIL,
7589 (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $7, @2),
7590 (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $5, @2),
7594 | a_expr IN_P in_expr
7596 /* in_expr returns a SubLink or a list of a_exprs */
7597 if (IsA($3, SubLink))
7599 /* generate foo = ANY (subquery) */
7600 SubLink *n = (SubLink *) $3;
7601 n->subLinkType = ANY_SUBLINK;
7603 n->operName = list_make1(makeString("="));
7608 /* generate scalar IN expression */
7609 $$ = (Node *) makeSimpleA_Expr(AEXPR_IN, "=", $1, $3, @2);
7612 | a_expr NOT IN_P in_expr
7614 /* in_expr returns a SubLink or a list of a_exprs */
7615 if (IsA($4, SubLink))
7617 /* generate NOT (foo = ANY (subquery)) */
7618 /* Make an = ANY node */
7619 SubLink *n = (SubLink *) $4;
7620 n->subLinkType = ANY_SUBLINK;
7622 n->operName = list_make1(makeString("="));
7623 /* Stick a NOT on top */
7624 $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL, (Node *) n, @2);
7628 /* generate scalar NOT IN expression */
7629 $$ = (Node *) makeSimpleA_Expr(AEXPR_IN, "<>", $1, $4, @2);
7632 | a_expr subquery_Op sub_type select_with_parens %prec Op
7634 SubLink *n = makeNode(SubLink);
7635 n->subLinkType = $3;
7641 | a_expr subquery_Op sub_type '(' a_expr ')' %prec Op
7643 if ($3 == ANY_SUBLINK)
7644 $$ = (Node *) makeA_Expr(AEXPR_OP_ANY, $2, $1, $5, @2);
7646 $$ = (Node *) makeA_Expr(AEXPR_OP_ALL, $2, $1, $5, @2);
7648 | UNIQUE select_with_parens
7650 /* Not sure how to get rid of the parentheses
7651 * but there are lots of shift/reduce errors without them.
7653 * Should be able to implement this by plopping the entire
7654 * select into a node, then transforming the target expressions
7655 * from whatever they are into count(*), and testing the
7656 * entire result equal to one.
7657 * But, will probably implement a separate node in the executor.
7660 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7661 errmsg("UNIQUE predicate is not yet implemented")));
7663 | a_expr IS DOCUMENT_P %prec IS
7665 $$ = makeXmlExpr(IS_DOCUMENT, NULL, NIL, list_make1($1));
7667 | a_expr IS NOT DOCUMENT_P %prec IS
7669 $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL,
7670 makeXmlExpr(IS_DOCUMENT, NULL, NIL, list_make1($1)),
7676 * Restricted expressions
7678 * b_expr is a subset of the complete expression syntax defined by a_expr.
7680 * Presently, AND, NOT, IS, and IN are the a_expr keywords that would
7681 * cause trouble in the places where b_expr is used. For simplicity, we
7682 * just eliminate all the boolean-keyword-operator productions from b_expr.
7686 | b_expr TYPECAST Typename
7687 { $$ = makeTypeCast($1, $3); }
7688 | '+' b_expr %prec UMINUS
7689 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2, @1); }
7690 | '-' b_expr %prec UMINUS
7691 { $$ = doNegate($2, @1); }
7693 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", $1, $3, @2); }
7695 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "-", $1, $3, @2); }
7697 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "*", $1, $3, @2); }
7699 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "/", $1, $3, @2); }
7701 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, $3, @2); }
7703 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, $3, @2); }
7705 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $3, @2); }
7707 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $3, @2); }
7709 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "=", $1, $3, @2); }
7710 | b_expr qual_Op b_expr %prec Op
7711 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, $3, @2); }
7712 | qual_Op b_expr %prec Op
7713 { $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2, @1); }
7714 | b_expr qual_Op %prec POSTFIXOP
7715 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, NULL, @2); }
7716 | b_expr IS DISTINCT FROM b_expr %prec IS
7718 $$ = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $5, @2);
7720 | b_expr IS NOT DISTINCT FROM b_expr %prec IS
7722 $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL,
7723 NULL, (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $6, @2), @2);
7725 | b_expr IS OF '(' type_list ')' %prec IS
7727 $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "=", $1, (Node *) $5, @2);
7729 | b_expr IS NOT OF '(' type_list ')' %prec IS
7731 $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "<>", $1, (Node *) $6, @2);
7733 | b_expr IS DOCUMENT_P %prec IS
7735 $$ = makeXmlExpr(IS_DOCUMENT, NULL, NIL, list_make1($1));
7737 | b_expr IS NOT DOCUMENT_P %prec IS
7739 $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL,
7740 makeXmlExpr(IS_DOCUMENT, NULL, NIL, list_make1($1)),
7746 * Productions that can be used in both a_expr and b_expr.
7748 * Note: productions that refer recursively to a_expr or b_expr mostly
7749 * cannot appear here. However, it's OK to refer to a_exprs that occur
7750 * inside parentheses, such as function arguments; that cannot introduce
7751 * ambiguity to the b_expr syntax.
7753 c_expr: columnref { $$ = $1; }
7754 | AexprConst { $$ = $1; }
7755 | PARAM opt_indirection
7757 ParamRef *p = makeNode(ParamRef);
7761 A_Indirection *n = makeNode(A_Indirection);
7762 n->arg = (Node *) p;
7763 n->indirection = $2;
7769 | '(' a_expr ')' opt_indirection
7773 A_Indirection *n = makeNode(A_Indirection);
7775 n->indirection = $4;
7785 | select_with_parens %prec UMINUS
7787 SubLink *n = makeNode(SubLink);
7788 n->subLinkType = EXPR_SUBLINK;
7794 | EXISTS select_with_parens
7796 SubLink *n = makeNode(SubLink);
7797 n->subLinkType = EXISTS_SUBLINK;
7803 | ARRAY select_with_parens
7805 SubLink *n = makeNode(SubLink);
7806 n->subLinkType = ARRAY_SUBLINK;
7816 RowExpr *r = makeNode(RowExpr);
7818 r->row_typeid = InvalidOid; /* not analyzed yet */
7824 * func_expr is split out from c_expr just so that we have a classification
7825 * for "everything that is a function call or looks like one". This isn't
7826 * very important, but it saves us having to document which variants are
7827 * legal in the backwards-compatible functional-index syntax for CREATE INDEX.
7828 * (Note that many of the special SQL functions wouldn't actually make any
7829 * sense as functional index entries, but we ignore that consideration here.)
7831 func_expr: func_name '(' ')'
7833 FuncCall *n = makeNode(FuncCall);
7836 n->agg_star = FALSE;
7837 n->agg_distinct = FALSE;
7841 | func_name '(' expr_list ')'
7843 FuncCall *n = makeNode(FuncCall);
7846 n->agg_star = FALSE;
7847 n->agg_distinct = FALSE;
7851 | func_name '(' ALL expr_list ')'
7853 FuncCall *n = makeNode(FuncCall);
7856 n->agg_star = FALSE;
7857 n->agg_distinct = FALSE;
7858 /* Ideally we'd mark the FuncCall node to indicate
7859 * "must be an aggregate", but there's no provision
7860 * for that in FuncCall at the moment.
7865 | func_name '(' DISTINCT expr_list ')'
7867 FuncCall *n = makeNode(FuncCall);
7870 n->agg_star = FALSE;
7871 n->agg_distinct = TRUE;
7875 | func_name '(' '*' ')'
7878 * We consider AGGREGATE(*) to invoke a parameterless
7879 * aggregate. This does the right thing for COUNT(*),
7880 * and there are no other aggregates in SQL92 that accept
7883 * The FuncCall node is also marked agg_star = true,
7884 * so that later processing can detect what the argument
7887 FuncCall *n = makeNode(FuncCall);
7891 n->agg_distinct = FALSE;
7898 * Translate as "'now'::text::date".
7900 * We cannot use "'now'::date" because coerce_type() will
7901 * immediately reduce that to a constant representing
7902 * today's date. We need to delay the conversion until
7903 * runtime, else the wrong things will happen when
7904 * CURRENT_DATE is used in a column default value or rule.
7906 * This could be simplified if we had a way to generate
7907 * an expression tree representing runtime application
7908 * of type-input conversion functions. (As of PG 7.3
7909 * that is actually possible, but not clear that we want
7913 n = makeStringConstCast("now", SystemTypeName("text"));
7914 $$ = makeTypeCast(n, SystemTypeName("date"));
7919 * Translate as "'now'::text::timetz".
7920 * See comments for CURRENT_DATE.
7923 n = makeStringConstCast("now", SystemTypeName("text"));
7924 $$ = makeTypeCast(n, SystemTypeName("timetz"));
7926 | CURRENT_TIME '(' Iconst ')'
7929 * Translate as "'now'::text::timetz(n)".
7930 * See comments for CURRENT_DATE.
7934 n = makeStringConstCast("now", SystemTypeName("text"));
7935 d = SystemTypeName("timetz");
7936 d->typmods = list_make1(makeIntConst($3));
7937 $$ = makeTypeCast(n, d);
7942 * Translate as "now()", since we have a function that
7943 * does exactly what is needed.
7945 FuncCall *n = makeNode(FuncCall);
7946 n->funcname = SystemFuncName("now");
7948 n->agg_star = FALSE;
7949 n->agg_distinct = FALSE;
7953 | CURRENT_TIMESTAMP '(' Iconst ')'
7956 * Translate as "'now'::text::timestamptz(n)".
7957 * See comments for CURRENT_DATE.
7961 n = makeStringConstCast("now", SystemTypeName("text"));
7962 d = SystemTypeName("timestamptz");
7963 d->typmods = list_make1(makeIntConst($3));
7964 $$ = makeTypeCast(n, d);
7969 * Translate as "'now'::text::time".
7970 * See comments for CURRENT_DATE.
7973 n = makeStringConstCast("now", SystemTypeName("text"));
7974 $$ = makeTypeCast((Node *)n, SystemTypeName("time"));
7976 | LOCALTIME '(' Iconst ')'
7979 * Translate as "'now'::text::time(n)".
7980 * See comments for CURRENT_DATE.
7984 n = makeStringConstCast("now", SystemTypeName("text"));
7985 d = SystemTypeName("time");
7986 d->typmods = list_make1(makeIntConst($3));
7987 $$ = makeTypeCast((Node *)n, d);
7992 * Translate as "'now'::text::timestamp".
7993 * See comments for CURRENT_DATE.
7996 n = makeStringConstCast("now", SystemTypeName("text"));
7997 $$ = makeTypeCast(n, SystemTypeName("timestamp"));
7999 | LOCALTIMESTAMP '(' Iconst ')'
8002 * Translate as "'now'::text::timestamp(n)".
8003 * See comments for CURRENT_DATE.
8007 n = makeStringConstCast("now", SystemTypeName("text"));
8008 d = SystemTypeName("timestamp");
8009 d->typmods = list_make1(makeIntConst($3));
8010 $$ = makeTypeCast(n, d);
8014 FuncCall *n = makeNode(FuncCall);
8015 n->funcname = SystemFuncName("current_user");
8017 n->agg_star = FALSE;
8018 n->agg_distinct = FALSE;
8024 FuncCall *n = makeNode(FuncCall);
8025 n->funcname = SystemFuncName("current_user");
8027 n->agg_star = FALSE;
8028 n->agg_distinct = FALSE;
8034 FuncCall *n = makeNode(FuncCall);
8035 n->funcname = SystemFuncName("session_user");
8037 n->agg_star = FALSE;
8038 n->agg_distinct = FALSE;
8044 FuncCall *n = makeNode(FuncCall);
8045 n->funcname = SystemFuncName("current_user");
8047 n->agg_star = FALSE;
8048 n->agg_distinct = FALSE;
8052 | CAST '(' a_expr AS Typename ')'
8053 { $$ = makeTypeCast($3, $5); }
8054 | EXTRACT '(' extract_list ')'
8056 FuncCall *n = makeNode(FuncCall);
8057 n->funcname = SystemFuncName("date_part");
8059 n->agg_star = FALSE;
8060 n->agg_distinct = FALSE;
8064 | OVERLAY '(' overlay_list ')'
8066 /* overlay(A PLACING B FROM C FOR D) is converted to
8067 * substring(A, 1, C-1) || B || substring(A, C+1, C+D)
8068 * overlay(A PLACING B FROM C) is converted to
8069 * substring(A, 1, C-1) || B || substring(A, C+1, C+char_length(B))
8071 FuncCall *n = makeNode(FuncCall);
8072 n->funcname = SystemFuncName("overlay");
8074 n->agg_star = FALSE;
8075 n->agg_distinct = FALSE;
8079 | POSITION '(' position_list ')'
8081 /* position(A in B) is converted to position(B, A) */
8082 FuncCall *n = makeNode(FuncCall);
8083 n->funcname = SystemFuncName("position");
8085 n->agg_star = FALSE;
8086 n->agg_distinct = FALSE;
8090 | SUBSTRING '(' substr_list ')'
8092 /* substring(A from B for C) is converted to
8093 * substring(A, B, C) - thomas 2000-11-28
8095 FuncCall *n = makeNode(FuncCall);
8096 n->funcname = SystemFuncName("substring");
8098 n->agg_star = FALSE;
8099 n->agg_distinct = FALSE;
8103 | TREAT '(' a_expr AS Typename ')'
8105 /* TREAT(expr AS target) converts expr of a particular type to target,
8106 * which is defined to be a subtype of the original expression.
8107 * In SQL99, this is intended for use with structured UDTs,
8108 * but let's make this a generally useful form allowing stronger
8109 * coercions than are handled by implicit casting.
8111 FuncCall *n = makeNode(FuncCall);
8112 /* Convert SystemTypeName() to SystemFuncName() even though
8113 * at the moment they result in the same thing.
8115 n->funcname = SystemFuncName(((Value *)llast($5->names))->val.str);
8116 n->args = list_make1($3);
8117 n->agg_star = FALSE;
8118 n->agg_distinct = FALSE;
8122 | TRIM '(' BOTH trim_list ')'
8124 /* various trim expressions are defined in SQL92
8125 * - thomas 1997-07-19
8127 FuncCall *n = makeNode(FuncCall);
8128 n->funcname = SystemFuncName("btrim");
8130 n->agg_star = FALSE;
8131 n->agg_distinct = FALSE;
8135 | TRIM '(' LEADING trim_list ')'
8137 FuncCall *n = makeNode(FuncCall);
8138 n->funcname = SystemFuncName("ltrim");
8140 n->agg_star = FALSE;
8141 n->agg_distinct = FALSE;
8145 | TRIM '(' TRAILING trim_list ')'
8147 FuncCall *n = makeNode(FuncCall);
8148 n->funcname = SystemFuncName("rtrim");
8150 n->agg_star = FALSE;
8151 n->agg_distinct = FALSE;
8155 | TRIM '(' trim_list ')'
8157 FuncCall *n = makeNode(FuncCall);
8158 n->funcname = SystemFuncName("btrim");
8160 n->agg_star = FALSE;
8161 n->agg_distinct = FALSE;
8165 | NULLIF '(' a_expr ',' a_expr ')'
8167 $$ = (Node *) makeSimpleA_Expr(AEXPR_NULLIF, "=", $3, $5, @1);
8169 | COALESCE '(' expr_list ')'
8171 CoalesceExpr *c = makeNode(CoalesceExpr);
8175 | GREATEST '(' expr_list ')'
8177 MinMaxExpr *v = makeNode(MinMaxExpr);
8179 v->op = IS_GREATEST;
8182 | LEAST '(' expr_list ')'
8184 MinMaxExpr *v = makeNode(MinMaxExpr);
8189 | XMLCONCAT '(' expr_list ')'
8191 $$ = makeXmlExpr(IS_XMLCONCAT, NULL, NIL, $3);
8193 | XMLELEMENT '(' NAME_P ColLabel ')'
8195 $$ = makeXmlExpr(IS_XMLELEMENT, $4, NIL, NIL);
8197 | XMLELEMENT '(' NAME_P ColLabel ',' xml_attributes ')'
8199 $$ = makeXmlExpr(IS_XMLELEMENT, $4, $6, NIL);
8201 | XMLELEMENT '(' NAME_P ColLabel ',' expr_list ')'
8203 $$ = makeXmlExpr(IS_XMLELEMENT, $4, NIL, $6);
8205 | XMLELEMENT '(' NAME_P ColLabel ',' xml_attributes ',' expr_list ')'
8207 $$ = makeXmlExpr(IS_XMLELEMENT, $4, $6, $8);
8209 | XMLFOREST '(' xml_attribute_list ')'
8211 $$ = makeXmlExpr(IS_XMLFOREST, NULL, $3, NIL);
8213 | XMLPARSE '(' document_or_content a_expr xml_whitespace_option ')'
8215 XmlExpr *x = (XmlExpr *) makeXmlExpr(IS_XMLPARSE, NULL, NIL,
8217 makeBoolAConst($5)));
8221 | XMLPI '(' NAME_P ColLabel ')'
8223 $$ = makeXmlExpr(IS_XMLPI, $4, NULL, NIL);
8225 | XMLPI '(' NAME_P ColLabel ',' a_expr ')'
8227 $$ = makeXmlExpr(IS_XMLPI, $4, NULL, list_make1($6));
8229 | XMLROOT '(' a_expr ',' xml_root_version opt_xml_root_standalone ')'
8231 $$ = makeXmlExpr(IS_XMLROOT, NULL, NIL,
8232 list_make3($3, $5, $6));
8234 | XMLSERIALIZE '(' document_or_content a_expr AS SimpleTypename ')'
8236 XmlSerialize *n = makeNode(XmlSerialize);
8247 xml_root_version: VERSION_P a_expr
8249 | VERSION_P NO VALUE_P
8250 { $$ = makeNullAConst(); }
8253 opt_xml_root_standalone: ',' STANDALONE_P YES_P
8254 { $$ = makeIntConst(XML_STANDALONE_YES); }
8255 | ',' STANDALONE_P NO
8256 { $$ = makeIntConst(XML_STANDALONE_NO); }
8257 | ',' STANDALONE_P NO VALUE_P
8258 { $$ = makeIntConst(XML_STANDALONE_NO_VALUE); }
8260 { $$ = makeIntConst(XML_STANDALONE_OMITTED); }
8263 xml_attributes: XMLATTRIBUTES '(' xml_attribute_list ')' { $$ = $3; }
8266 xml_attribute_list: xml_attribute_el { $$ = list_make1($1); }
8267 | xml_attribute_list ',' xml_attribute_el { $$ = lappend($1, $3); }
8270 xml_attribute_el: a_expr AS ColLabel
8272 $$ = makeNode(ResTarget);
8274 $$->indirection = NULL;
8275 $$->val = (Node *) $1;
8280 $$ = makeNode(ResTarget);
8282 $$->indirection = NULL;
8283 $$->val = (Node *) $1;
8288 document_or_content: DOCUMENT_P { $$ = XMLOPTION_DOCUMENT; }
8289 | CONTENT_P { $$ = XMLOPTION_CONTENT; }
8292 xml_whitespace_option: PRESERVE WHITESPACE_P { $$ = TRUE; }
8293 | STRIP_P WHITESPACE_P { $$ = FALSE; }
8294 | /*EMPTY*/ { $$ = FALSE; }
8298 * Supporting nonterminals for expressions.
8301 /* Explicit row production.
8303 * SQL99 allows an optional ROW keyword, so we can now do single-element rows
8304 * without conflicting with the parenthesized a_expr production. Without the
8305 * ROW keyword, there must be more than one a_expr inside the parens.
8307 row: ROW '(' expr_list ')' { $$ = $3; }
8308 | ROW '(' ')' { $$ = NIL; }
8309 | '(' expr_list ',' a_expr ')' { $$ = lappend($2, $4); }
8312 sub_type: ANY { $$ = ANY_SUBLINK; }
8313 | SOME { $$ = ANY_SUBLINK; }
8314 | ALL { $$ = ALL_SUBLINK; }
8317 all_Op: Op { $$ = $1; }
8318 | MathOp { $$ = $1; }
8321 MathOp: '+' { $$ = "+"; }
8333 { $$ = list_make1(makeString($1)); }
8334 | OPERATOR '(' any_operator ')'
8340 { $$ = list_make1(makeString($1)); }
8341 | OPERATOR '(' any_operator ')'
8347 { $$ = list_make1(makeString($1)); }
8348 | OPERATOR '(' any_operator ')'
8351 { $$ = list_make1(makeString("~~")); }
8353 { $$ = list_make1(makeString("!~~")); }
8355 { $$ = list_make1(makeString("~~*")); }
8357 { $$ = list_make1(makeString("!~~*")); }
8358 /* cannot put SIMILAR TO here, because SIMILAR TO is a hack.
8359 * the regular expression is preprocessed by a function (similar_escape),
8360 * and the ~ operator for posix regular expressions is used.
8361 * x SIMILAR TO y -> x ~ similar_escape(y)
8362 * this transformation is made on the fly by the parser upwards.
8363 * however the SubLink structure which handles any/some/all stuff
8364 * is not ready for such a thing.
8370 $$ = list_make1($1);
8372 | expr_list ',' a_expr
8374 $$ = lappend($1, $3);
8378 type_list: Typename { $$ = list_make1($1); }
8379 | type_list ',' Typename { $$ = lappend($1, $3); }
8382 array_expr: '[' expr_list ']'
8384 $$ = makeAArrayExpr($2);
8386 | '[' array_expr_list ']'
8388 $$ = makeAArrayExpr($2);
8392 $$ = makeAArrayExpr(NIL);
8396 array_expr_list: array_expr { $$ = list_make1($1); }
8397 | array_expr_list ',' array_expr { $$ = lappend($1, $3); }
8402 extract_arg FROM a_expr
8404 $$ = list_make2(makeStringConst($1), $3);
8406 | /*EMPTY*/ { $$ = NIL; }
8409 /* Allow delimited string SCONST in extract_arg as an SQL extension.
8410 * - thomas 2001-04-12
8414 | YEAR_P { $$ = "year"; }
8415 | MONTH_P { $$ = "month"; }
8416 | DAY_P { $$ = "day"; }
8417 | HOUR_P { $$ = "hour"; }
8418 | MINUTE_P { $$ = "minute"; }
8419 | SECOND_P { $$ = "second"; }
8420 | SCONST { $$ = $1; }
8423 /* OVERLAY() arguments
8424 * SQL99 defines the OVERLAY() function:
8425 * o overlay(text placing text from int for int)
8426 * o overlay(text placing text from int)
8429 a_expr overlay_placing substr_from substr_for
8431 $$ = list_make4($1, $2, $3, $4);
8433 | a_expr overlay_placing substr_from
8435 $$ = list_make3($1, $2, $3);
8444 /* position_list uses b_expr not a_expr to avoid conflict with general IN */
8447 b_expr IN_P b_expr { $$ = list_make2($3, $1); }
8448 | /*EMPTY*/ { $$ = NIL; }
8451 /* SUBSTRING() arguments
8452 * SQL9x defines a specific syntax for arguments to SUBSTRING():
8453 * o substring(text from int for int)
8454 * o substring(text from int) get entire string from starting point "int"
8455 * o substring(text for int) get first "int" characters of string
8456 * o substring(text from pattern) get entire string matching pattern
8457 * o substring(text from pattern for escape) same with specified escape char
8458 * We also want to support generic substring functions which accept
8459 * the usual generic list of arguments. So we will accept both styles
8460 * here, and convert the SQL9x style to the generic list for further
8461 * processing. - thomas 2000-11-28
8464 a_expr substr_from substr_for
8466 $$ = list_make3($1, $2, $3);
8468 | a_expr substr_for substr_from
8470 /* not legal per SQL99, but might as well allow it */
8471 $$ = list_make3($1, $3, $2);
8473 | a_expr substr_from
8475 $$ = list_make2($1, $2);
8480 * Since there are no cases where this syntax allows
8481 * a textual FOR value, we forcibly cast the argument
8482 * to int4. The possible matches in pg_proc are
8483 * substring(text,int4) and substring(text,text),
8484 * and we don't want the parser to choose the latter,
8485 * which it is likely to do if the second argument
8486 * is unknown or doesn't have an implicit cast to int4.
8488 $$ = list_make3($1, makeIntConst(1),
8489 makeTypeCast($2, SystemTypeName("int4")));
8500 FROM a_expr { $$ = $2; }
8503 substr_for: FOR a_expr { $$ = $2; }
8506 trim_list: a_expr FROM expr_list { $$ = lappend($3, $1); }
8507 | FROM expr_list { $$ = $2; }
8508 | expr_list { $$ = $1; }
8511 in_expr: select_with_parens
8513 SubLink *n = makeNode(SubLink);
8515 /* other fields will be filled later */
8518 | '(' expr_list ')' { $$ = (Node *)$2; }
8522 * Define SQL92-style case clause.
8523 * - Full specification
8524 * CASE WHEN a = b THEN c ... ELSE d END
8525 * - Implicit argument
8526 * CASE a WHEN b THEN c ... ELSE d END
8528 case_expr: CASE case_arg when_clause_list case_default END_P
8530 CaseExpr *c = makeNode(CaseExpr);
8531 c->casetype = InvalidOid; /* not analyzed yet */
8532 c->arg = (Expr *) $2;
8534 c->defresult = (Expr *) $4;
8540 /* There must be at least one */
8541 when_clause { $$ = list_make1($1); }
8542 | when_clause_list when_clause { $$ = lappend($1, $2); }
8546 WHEN a_expr THEN a_expr
8548 CaseWhen *w = makeNode(CaseWhen);
8549 w->expr = (Expr *) $2;
8550 w->result = (Expr *) $4;
8556 ELSE a_expr { $$ = $2; }
8557 | /*EMPTY*/ { $$ = NULL; }
8560 case_arg: a_expr { $$ = $1; }
8561 | /*EMPTY*/ { $$ = NULL; }
8565 * columnref starts with relation_name not ColId, so that OLD and NEW
8566 * references can be accepted. Note that when there are more than two
8567 * dotted names, the first name is not actually a relation name...
8569 columnref: relation_name
8571 $$ = makeColumnRef($1, NIL, @1);
8573 | relation_name indirection
8575 $$ = makeColumnRef($1, $2, @1);
8582 $$ = (Node *) makeString($2);
8586 $$ = (Node *) makeString("*");
8590 A_Indices *ai = makeNode(A_Indices);
8595 | '[' a_expr ':' a_expr ']'
8597 A_Indices *ai = makeNode(A_Indices);
8605 indirection_el { $$ = list_make1($1); }
8606 | indirection indirection_el { $$ = lappend($1, $2); }
8610 /*EMPTY*/ { $$ = NIL; }
8611 | opt_indirection indirection_el { $$ = lappend($1, $2); }
8614 opt_asymmetric: ASYMMETRIC
8619 * The SQL spec defines "contextually typed value expressions" and
8620 * "contextually typed row value constructors", which for our purposes
8621 * are the same as "a_expr" and "row" except that DEFAULT can appear at
8626 a_expr { $$ = (Node *) $1; }
8627 | DEFAULT { $$ = (Node *) makeNode(SetToDefault); }
8631 ctext_expr { $$ = list_make1($1); }
8632 | ctext_expr_list ',' ctext_expr { $$ = lappend($1, $3); }
8636 * We should allow ROW '(' ctext_expr_list ')' too, but that seems to require
8637 * making VALUES a fully reserved word, which will probably break more apps
8638 * than allowing the noise-word is worth.
8640 ctext_row: '(' ctext_expr_list ')' { $$ = $2; }
8644 /*****************************************************************************
8646 * target list for SELECT
8648 *****************************************************************************/
8651 target_el { $$ = list_make1($1); }
8652 | target_list ',' target_el { $$ = lappend($1, $3); }
8655 target_el: a_expr AS ColLabel
8657 $$ = makeNode(ResTarget);
8659 $$->indirection = NIL;
8660 $$->val = (Node *)$1;
8664 * We support omitting AS only for column labels that aren't
8665 * any known keyword. There is an ambiguity against postfix
8666 * operators: is "a ! b" an infix expression, or a postfix
8667 * expression and a column label? We prefer to resolve this
8668 * as an infix expression, which we accomplish by assigning
8669 * IDENT a precedence higher than POSTFIXOP.
8673 $$ = makeNode(ResTarget);
8675 $$->indirection = NIL;
8676 $$->val = (Node *)$1;
8681 $$ = makeNode(ResTarget);
8683 $$->indirection = NIL;
8684 $$->val = (Node *)$1;
8689 ColumnRef *n = makeNode(ColumnRef);
8690 n->fields = list_make1(makeString("*"));
8693 $$ = makeNode(ResTarget);
8695 $$->indirection = NIL;
8696 $$->val = (Node *)n;
8702 /*****************************************************************************
8704 * Names and constants
8706 *****************************************************************************/
8709 SpecialRuleRelation { $$ = $1; }
8710 | ColId { $$ = $1; }
8713 qualified_name_list:
8714 qualified_name { $$ = list_make1($1); }
8715 | qualified_name_list ',' qualified_name { $$ = lappend($1, $3); }
8719 * The production for a qualified relation name has to exactly match the
8720 * production for a qualified func_name, because in a FROM clause we cannot
8721 * tell which we are parsing until we see what comes after it ('(' for a
8722 * func_name, something else for a relation). Therefore we allow 'indirection'
8723 * which may contain subscripts, and reject that case in the C code.
8728 $$ = makeNode(RangeVar);
8729 $$->catalogname = NULL;
8730 $$->schemaname = NULL;
8733 | relation_name indirection
8735 check_qualified_name($2);
8736 $$ = makeNode(RangeVar);
8737 switch (list_length($2))
8740 $$->catalogname = NULL;
8741 $$->schemaname = $1;
8742 $$->relname = strVal(linitial($2));
8745 $$->catalogname = $1;
8746 $$->schemaname = strVal(linitial($2));
8747 $$->relname = strVal(lsecond($2));
8751 (errcode(ERRCODE_SYNTAX_ERROR),
8752 errmsg("improper qualified name (too many dotted names): %s",
8753 NameListToString(lcons(makeString($1), $2)))));
8760 { $$ = list_make1(makeString($1)); }
8761 | name_list ',' name
8762 { $$ = lappend($1, makeString($3)); }
8766 name: ColId { $$ = $1; };
8774 attr_name: ColLabel { $$ = $1; };
8776 index_name: ColId { $$ = $1; };
8778 file_name: Sconst { $$ = $1; };
8781 * The production for a qualified func_name has to exactly match the
8782 * production for a qualified columnref, because we cannot tell which we
8783 * are parsing until we see what comes after it ('(' or Sconst for a func_name,
8784 * anything else for a columnref). Therefore we allow 'indirection' which
8785 * may contain subscripts, and reject that case in the C code. (If we
8786 * ever implement SQL99-like methods, such syntax may actually become legal!)
8788 func_name: type_function_name
8789 { $$ = list_make1(makeString($1)); }
8790 | relation_name indirection
8791 { $$ = check_func_name(lcons(makeString($1), $2)); }
8800 $$ = makeIntConst($1);
8804 $$ = makeFloatConst($1);
8808 $$ = makeStringConst($1);
8812 $$ = makeBitStringConst($1);
8816 /* This is a bit constant per SQL99:
8817 * Without Feature F511, "BIT data type",
8818 * a <general literal> shall not be a
8819 * <bit string literal> or a <hex string literal>.
8821 $$ = makeBitStringConst($1);
8825 /* generic type 'literal' syntax */
8826 TypeName *t = makeTypeNameFromNameList($1);
8828 $$ = makeStringConstCast($2, t);
8830 | func_name '(' expr_list ')' Sconst
8832 /* generic syntax with a type modifier */
8833 TypeName *t = makeTypeNameFromNameList($1);
8836 $$ = makeStringConstCast($5, t);
8838 | ConstTypename Sconst
8840 $$ = makeStringConstCast($2, $1);
8842 | ConstInterval Sconst opt_interval
8845 /* precision is not specified, but fields may be... */
8846 if ($3 != INTERVAL_FULL_RANGE)
8847 t->typmods = list_make1(makeIntConst($3));
8848 $$ = makeStringConstCast($2, t);
8850 | ConstInterval '(' Iconst ')' Sconst opt_interval
8853 t->typmods = list_make2(makeIntConst($6),
8855 $$ = makeStringConstCast($5, t);
8859 $$ = makeBoolAConst(TRUE);
8863 $$ = makeBoolAConst(FALSE);
8867 $$ = makeNullAConst();
8871 Iconst: ICONST { $$ = $1; };
8872 Sconst: SCONST { $$ = $1; };
8873 RoleId: ColId { $$ = $1; };
8875 SignedIconst: ICONST { $$ = $1; }
8876 | '-' ICONST { $$ = - $2; }
8880 * Name classification hierarchy.
8882 * IDENT is the lexeme returned by the lexer for identifiers that match
8883 * no known keyword. In most cases, we can accept certain keywords as
8884 * names, not only IDENTs. We prefer to accept as many such keywords
8885 * as possible to minimize the impact of "reserved words" on programmers.
8886 * So, we divide names into several possible classes. The classification
8887 * is chosen in part to make keywords acceptable as names wherever possible.
8890 /* Column identifier --- names that can be column, table, etc names.
8892 ColId: IDENT { $$ = $1; }
8893 | unreserved_keyword { $$ = pstrdup($1); }
8894 | col_name_keyword { $$ = pstrdup($1); }
8897 /* Type/function identifier --- names that can be type or function names.
8899 type_function_name: IDENT { $$ = $1; }
8900 | unreserved_keyword { $$ = pstrdup($1); }
8901 | type_func_name_keyword { $$ = pstrdup($1); }
8904 /* Column label --- allowed labels in "AS" clauses.
8905 * This presently includes *all* Postgres keywords.
8907 ColLabel: IDENT { $$ = $1; }
8908 | unreserved_keyword { $$ = pstrdup($1); }
8909 | col_name_keyword { $$ = pstrdup($1); }
8910 | type_func_name_keyword { $$ = pstrdup($1); }
8911 | reserved_keyword { $$ = pstrdup($1); }
8916 * Keyword category lists. Generally, every keyword present in
8917 * the Postgres grammar should appear in exactly one of these lists.
8919 * Put a new keyword into the first list that it can go into without causing
8920 * shift or reduce conflicts. The earlier lists define "less reserved"
8921 * categories of keywords.
8923 * Make sure that each keyword's category in keywords.c matches where
8924 * it is listed here. (Someday we may be able to generate these lists and
8925 * keywords.c's table from a common master list.)
8928 /* "Unreserved" keywords --- available for use as any kind of name.
9166 /* Column identifier --- keywords that can be column, table, etc names.
9168 * Many of these keywords will in fact be recognized as type or function
9169 * names too; but they have special productions for the purpose, and so
9170 * can't be treated as "generic" type or function names.
9172 * The type names appearing here are not usable as function names
9173 * because they can be followed by '(' in typename productions, which
9174 * looks too much like a function call for an LR(1) parser.
9224 /* Type/function identifier --- keywords that can be type or function names.
9226 * Most of these are keywords that are used as operators in expressions;
9227 * in general such keywords can't be column names because they would be
9228 * ambiguous with variables, but they are unambiguous as function identifiers.
9230 * Do not include POSITION, SUBSTRING, etc here since they have explicit
9231 * productions in a_expr to support the goofy SQL9x argument syntax.
9232 * - thomas 2000-11-28
9234 type_func_name_keyword:
9257 /* Reserved keyword --- these keywords are usable only as a ColLabel.
9259 * Keywords appear here if they could not be distinguished from variable,
9260 * type, or function names in some contexts. Don't put things here unless
9341 SpecialRuleRelation:
9348 (errcode(ERRCODE_SYNTAX_ERROR),
9349 errmsg("OLD used in query that is not in a rule")));
9357 (errcode(ERRCODE_SYNTAX_ERROR),
9358 errmsg("NEW used in query that is not in a rule")));
9365 makeColumnRef(char *relname, List *indirection, int location)
9368 * Generate a ColumnRef node, with an A_Indirection node added if there
9369 * is any subscripting in the specified indirection list. However,
9370 * any field selection at the start of the indirection list must be
9371 * transposed into the "fields" part of the ColumnRef node.
9373 ColumnRef *c = makeNode(ColumnRef);
9377 c->location = location;
9378 foreach(l, indirection)
9380 if (IsA(lfirst(l), A_Indices))
9382 A_Indirection *i = makeNode(A_Indirection);
9386 /* easy case - all indirection goes to A_Indirection */
9387 c->fields = list_make1(makeString(relname));
9388 i->indirection = indirection;
9392 /* got to split the list in two */
9393 i->indirection = list_copy_tail(indirection, nfields);
9394 indirection = list_truncate(indirection, nfields);
9395 c->fields = lcons(makeString(relname), indirection);
9397 i->arg = (Node *) c;
9402 /* No subscripting, so all indirection gets added to field list */
9403 c->fields = lcons(makeString(relname), indirection);
9408 makeTypeCast(Node *arg, TypeName *typename)
9410 TypeCast *n = makeNode(TypeCast);
9412 n->typename = typename;
9417 makeStringConst(char *str)
9419 A_Const *n = makeNode(A_Const);
9421 n->val.type = T_String;
9422 n->val.val.str = str;
9428 makeStringConstCast(char *str, TypeName *typename)
9430 Node *s = makeStringConst(str);
9432 return makeTypeCast(s, typename);
9436 makeIntConst(int val)
9438 A_Const *n = makeNode(A_Const);
9440 n->val.type = T_Integer;
9441 n->val.val.ival = val;
9447 makeFloatConst(char *str)
9449 A_Const *n = makeNode(A_Const);
9451 n->val.type = T_Float;
9452 n->val.val.str = str;
9458 makeBitStringConst(char *str)
9460 A_Const *n = makeNode(A_Const);
9462 n->val.type = T_BitString;
9463 n->val.val.str = str;
9469 makeNullAConst(void)
9471 A_Const *n = makeNode(A_Const);
9473 n->val.type = T_Null;
9479 makeAConst(Value *v)
9486 n = makeFloatConst(v->val.str);
9490 n = makeIntConst(v->val.ival);
9495 n = makeStringConst(v->val.str);
9503 * Create an A_Const string node and put it inside a boolean cast.
9506 makeBoolAConst(bool state)
9508 A_Const *n = makeNode(A_Const);
9510 n->val.type = T_String;
9511 n->val.val.str = (state ? "t" : "f");
9513 return makeTypeCast((Node *)n, SystemTypeName("bool"));
9517 * Create and populate a FuncCall node to support the OVERLAPS operator.
9520 makeOverlaps(List *largs, List *rargs, int location)
9522 FuncCall *n = makeNode(FuncCall);
9524 n->funcname = SystemFuncName("overlaps");
9525 if (list_length(largs) == 1)
9526 largs = lappend(largs, largs);
9527 else if (list_length(largs) != 2)
9529 (errcode(ERRCODE_SYNTAX_ERROR),
9530 errmsg("wrong number of parameters on left side of OVERLAPS expression")));
9531 if (list_length(rargs) == 1)
9532 rargs = lappend(rargs, rargs);
9533 else if (list_length(rargs) != 2)
9535 (errcode(ERRCODE_SYNTAX_ERROR),
9536 errmsg("wrong number of parameters on right side of OVERLAPS expression")));
9537 n->args = list_concat(largs, rargs);
9538 n->agg_star = FALSE;
9539 n->agg_distinct = FALSE;
9540 n->location = location;
9544 /* check_qualified_name --- check the result of qualified_name production
9546 * It's easiest to let the grammar production for qualified_name allow
9547 * subscripts and '*', which we then must reject here.
9550 check_qualified_name(List *names)
9556 if (!IsA(lfirst(i), String))
9557 yyerror("syntax error");
9558 else if (strcmp(strVal(lfirst(i)), "*") == 0)
9559 yyerror("syntax error");
9563 /* check_func_name --- check the result of func_name production
9565 * It's easiest to let the grammar production for func_name allow subscripts
9566 * and '*', which we then must reject here.
9569 check_func_name(List *names)
9575 if (!IsA(lfirst(i), String))
9576 yyerror("syntax error");
9577 else if (strcmp(strVal(lfirst(i)), "*") == 0)
9578 yyerror("syntax error");
9583 /* extractArgTypes()
9584 * Given a list of FunctionParameter nodes, extract a list of just the
9585 * argument types (TypeNames) for input parameters only. This is what
9586 * is needed to look up an existing function, which is what is wanted by
9587 * the productions that use this call.
9590 extractArgTypes(List *parameters)
9595 foreach(i, parameters)
9597 FunctionParameter *p = (FunctionParameter *) lfirst(i);
9599 if (p->mode != FUNC_PARAM_OUT) /* keep if IN or INOUT */
9600 result = lappend(result, p->argType);
9605 /* findLeftmostSelect()
9606 * Find the leftmost component SelectStmt in a set-operation parsetree.
9609 findLeftmostSelect(SelectStmt *node)
9611 while (node && node->op != SETOP_NONE)
9613 Assert(node && IsA(node, SelectStmt) && node->larg == NULL);
9617 /* insertSelectOptions()
9618 * Insert ORDER BY, etc into an already-constructed SelectStmt.
9620 * This routine is just to avoid duplicating code in SelectStmt productions.
9623 insertSelectOptions(SelectStmt *stmt,
9624 List *sortClause, List *lockingClause,
9625 Node *limitOffset, Node *limitCount)
9628 * Tests here are to reject constructs like
9629 * (SELECT foo ORDER BY bar) ORDER BY baz
9633 if (stmt->sortClause)
9635 (errcode(ERRCODE_SYNTAX_ERROR),
9636 errmsg("multiple ORDER BY clauses not allowed")));
9637 stmt->sortClause = sortClause;
9639 /* We can handle multiple locking clauses, though */
9640 stmt->lockingClause = list_concat(stmt->lockingClause, lockingClause);
9643 if (stmt->limitOffset)
9645 (errcode(ERRCODE_SYNTAX_ERROR),
9646 errmsg("multiple OFFSET clauses not allowed")));
9647 stmt->limitOffset = limitOffset;
9651 if (stmt->limitCount)
9653 (errcode(ERRCODE_SYNTAX_ERROR),
9654 errmsg("multiple LIMIT clauses not allowed")));
9655 stmt->limitCount = limitCount;
9660 makeSetOp(SetOperation op, bool all, Node *larg, Node *rarg)
9662 SelectStmt *n = makeNode(SelectStmt);
9666 n->larg = (SelectStmt *) larg;
9667 n->rarg = (SelectStmt *) rarg;
9672 * Build a properly-qualified reference to a built-in function.
9675 SystemFuncName(char *name)
9677 return list_make2(makeString("pg_catalog"), makeString(name));
9681 * Build a properly-qualified reference to a built-in type.
9683 * typmod is defaulted, but may be changed afterwards by caller.
9686 SystemTypeName(char *name)
9688 return makeTypeNameFromNameList(list_make2(makeString("pg_catalog"),
9693 * Handle negation of a numeric constant.
9695 * Formerly, we did this here because the optimizer couldn't cope with
9696 * indexquals that looked like "var = -4" --- it wants "var = const"
9697 * and a unary minus operator applied to a constant didn't qualify.
9698 * As of Postgres 7.0, that problem doesn't exist anymore because there
9699 * is a constant-subexpression simplifier in the optimizer. However,
9700 * there's still a good reason for doing this here, which is that we can
9701 * postpone committing to a particular internal representation for simple
9702 * negative constants. It's better to leave "-123.456" in string form
9703 * until we know what the desired type is.
9706 doNegate(Node *n, int location)
9708 if (IsA(n, A_Const))
9710 A_Const *con = (A_Const *)n;
9712 if (con->val.type == T_Integer)
9714 con->val.val.ival = -con->val.val.ival;
9717 if (con->val.type == T_Float)
9719 doNegateFloat(&con->val);
9724 return (Node *) makeSimpleA_Expr(AEXPR_OP, "-", NULL, n, location);
9728 doNegateFloat(Value *v)
9730 char *oldval = v->val.str;
9732 Assert(IsA(v, Float));
9736 v->val.str = oldval+1; /* just strip the '-' */
9739 char *newval = (char *) palloc(strlen(oldval) + 2);
9742 strcpy(newval+1, oldval);
9743 v->val.str = newval;
9748 makeAArrayExpr(List *elements)
9750 A_ArrayExpr *n = makeNode(A_ArrayExpr);
9752 n->elements = elements;
9757 makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args)
9759 XmlExpr *x = makeNode(XmlExpr);
9764 * named_args is a list of ResTarget; it'll be split apart into separate
9765 * expression and name lists in transformXmlExpr().
9767 x->named_args = named_args;
9774 * Initialize to parse one query string
9779 QueryIsRule = FALSE;
9783 * Must undefine base_yylex before including scan.c, since we want it
9784 * to create the function base_yylex not filtered_base_yylex.