4 /*-------------------------------------------------------------------------
7 * POSTGRES SQL YACC rules/actions
9 * Portions Copyright (c) 1996-2005, 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.519 2005/12/27 04:00:07 momjian 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 inside parse_analyze() 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 "nodes/makefuncs.h"
57 #include "parser/gramparse.h"
58 #include "storage/lmgr.h"
59 #include "utils/date.h"
60 #include "utils/datetime.h"
61 #include "utils/numeric.h"
64 extern List *parsetree; /* final parse result is delivered here */
66 static bool QueryIsRule = FALSE;
69 * If you need access to certain yacc-generated variables and find that
70 * they're static by default, uncomment the next line. (this is not a
73 /*#define __YYSCLASS*/
75 static Node *makeColumnRef(char *relname, List *indirection);
76 static Node *makeTypeCast(Node *arg, TypeName *typename);
77 static Node *makeStringConst(char *str, TypeName *typename);
78 static Node *makeIntConst(int val);
79 static Node *makeFloatConst(char *str);
80 static Node *makeAConst(Value *v);
81 static Node *makeRowNullTest(NullTestType test, RowExpr *row);
82 static DefElem *makeDefElem(char *name, Node *arg);
83 static A_Const *makeBoolAConst(bool state);
84 static FuncCall *makeOverlaps(List *largs, List *rargs);
85 static void check_qualified_name(List *names);
86 static List *check_func_name(List *names);
87 static List *extractArgTypes(List *parameters);
88 static SelectStmt *findLeftmostSelect(SelectStmt *node);
89 static void insertSelectOptions(SelectStmt *stmt,
90 List *sortClause, Node *lockingClause,
91 Node *limitOffset, Node *limitCount);
92 static Node *makeSetOp(SetOperation op, bool all, Node *larg, Node *rarg);
93 static Node *doNegate(Node *n);
94 static void doNegateFloat(Value *v);
107 DropBehavior dbehavior;
108 OnCommitAction oncommit;
109 ContainsOids withoids;
116 FunctionParameter *fun_param;
117 FunctionParameterMode fun_param_mode;
118 FuncWithArgs *funwithargs;
127 PrivTarget *privtarget;
130 VariableSetStmt *vsetstmt;
133 %type <node> stmt schema_stmt
134 AlterDatabaseStmt AlterDatabaseSetStmt AlterDomainStmt AlterGroupStmt
135 AlterObjectSchemaStmt AlterOwnerStmt AlterSeqStmt AlterTableStmt
136 AlterUserStmt AlterUserSetStmt AlterRoleStmt AlterRoleSetStmt
137 AnalyzeStmt ClosePortalStmt ClusterStmt CommentStmt
138 ConstraintsSetStmt CopyStmt CreateAsStmt CreateCastStmt
139 CreateDomainStmt CreateGroupStmt CreateOpClassStmt CreatePLangStmt
140 CreateSchemaStmt CreateSeqStmt CreateStmt CreateTableSpaceStmt
141 CreateAssertStmt CreateTrigStmt CreateUserStmt CreateRoleStmt
142 CreatedbStmt DeclareCursorStmt DefineStmt DeleteStmt
143 DropGroupStmt DropOpClassStmt DropPLangStmt DropStmt
144 DropAssertStmt DropTrigStmt DropRuleStmt DropCastStmt DropRoleStmt
145 DropUserStmt DropdbStmt DropTableSpaceStmt ExplainStmt FetchStmt
146 GrantStmt GrantRoleStmt IndexStmt InsertStmt ListenStmt LoadStmt
147 LockStmt NotifyStmt ExplainableStmt PreparableStmt
148 CreateFunctionStmt AlterFunctionStmt ReindexStmt RemoveAggrStmt
149 RemoveFuncStmt RemoveOperStmt RenameStmt RevokeStmt RevokeRoleStmt
150 RuleActionStmt RuleActionStmtOrEmpty RuleStmt
151 SelectStmt TransactionStmt TruncateStmt
152 UnlistenStmt UpdateStmt VacuumStmt
153 VariableResetStmt VariableSetStmt VariableShowStmt
154 ViewStmt CheckPointStmt CreateConversionStmt
155 DeallocateStmt PrepareStmt ExecuteStmt
156 DropOwnedStmt ReassignOwnedStmt
158 %type <node> select_no_parens select_with_parens select_clause
161 %type <node> alter_column_default opclass_item alter_using
162 %type <ival> add_drop
164 %type <node> alter_table_cmd alter_rel_cmd
165 %type <list> alter_table_cmds alter_rel_cmds
167 %type <dbehavior> opt_drop_behavior
169 %type <list> createdb_opt_list alterdb_opt_list copy_opt_list
170 transaction_mode_list
171 %type <defelt> createdb_opt_item alterdb_opt_item copy_opt_item
172 transaction_mode_item
174 %type <ival> opt_lock lock_type cast_context
175 %type <boolean> opt_force opt_or_replace
176 opt_grant_grant_option opt_grant_admin_option
179 %type <boolean> like_including_defaults
181 %type <list> OptRoleList
182 %type <defelt> OptRoleElem
184 %type <str> OptSchemaName
185 %type <list> OptSchemaEltList
187 %type <boolean> TriggerActionTime TriggerForSpec opt_trusted
188 %type <str> opt_lancompiler
190 %type <str> TriggerEvents
191 %type <value> TriggerFuncArg
193 %type <str> relation_name copy_file_name
194 database_name access_method_clause access_method attr_name
195 index_name name function_name file_name
197 %type <list> func_name handler_name qual_Op qual_all_Op subquery_Op
198 opt_class opt_validator
200 %type <range> qualified_name OptConstrFromTable
202 %type <str> all_Op MathOp SpecialRuleRelation
204 %type <str> iso_level opt_encoding
206 %type <list> grantee_list
207 %type <str> privilege
208 %type <list> privileges privilege_list
209 %type <privtarget> privilege_target
210 %type <funwithargs> function_with_argtypes
211 %type <list> function_with_argtypes_list
212 %type <chr> TriggerOneEvent
214 %type <list> stmtblock stmtmulti
215 OptTableElementList TableElementList OptInherit definition
216 opt_distinct opt_definition func_args
217 func_args_list func_as createfunc_opt_list alterfunc_opt_list
218 oper_argtypes RuleActionList RuleActionMulti
219 opt_column_list columnList opt_name_list
220 sort_clause opt_sort_clause sortby_list index_params
221 name_list from_clause from_list opt_array_bounds
222 qualified_name_list any_name any_name_list
223 any_operator expr_list attrs
224 target_list update_target_list insert_column_list
225 insert_target_list def_list indirection opt_indirection
226 group_clause TriggerFuncArgs select_limit
227 opt_select_limit opclass_item_list
228 transaction_mode_list_or_empty
230 prep_type_clause prep_type_list
231 execute_param_clause using_clause
233 %type <range> into_clause OptTempTableName
235 %type <defelt> createfunc_opt_item common_func_opt_item
236 %type <fun_param> func_arg
237 %type <fun_param_mode> arg_class
238 %type <typnam> func_return func_type aggr_argtype
240 %type <boolean> TriggerForType OptTemp
241 %type <oncommit> OnCommitOption
242 %type <withoids> OptWithOids WithOidsAs
244 %type <node> for_locking_clause opt_for_locking_clause
245 %type <list> locked_rels_list
246 %type <boolean> opt_all
248 %type <node> join_outer join_qual
249 %type <jtype> join_type
251 %type <list> extract_list overlay_list position_list
252 %type <list> substr_list trim_list
253 %type <ival> opt_interval
254 %type <node> overlay_placing substr_from substr_for
256 %type <boolean> opt_instead opt_analyze
257 %type <boolean> index_opt_unique opt_verbose opt_full
258 %type <boolean> opt_freeze opt_default opt_recheck
259 %type <defelt> opt_binary opt_oids copy_delimiter
261 %type <boolean> copy_from opt_hold
263 %type <ival> opt_column event cursor_options
264 %type <objtype> reindex_type drop_type comment_type
266 %type <node> fetch_direction select_limit_value select_offset_value
268 %type <list> OptSeqList
269 %type <defelt> OptSeqElem
271 %type <istmt> insert_rest
273 %type <vsetstmt> set_rest
275 %type <node> TableElement ConstraintElem TableFuncElement
276 %type <node> columnDef
277 %type <defelt> def_elem
278 %type <node> def_arg columnElem where_clause
279 a_expr b_expr c_expr func_expr AexprConst indirection_el
280 columnref in_expr having_clause func_table array_expr
281 %type <list> row type_list array_expr_list
282 %type <node> case_expr case_arg when_clause case_default
283 %type <list> when_clause_list
284 %type <ival> sub_type
285 %type <list> OptCreateAs CreateAsList
286 %type <node> CreateAsElement
287 %type <value> NumericOnly FloatOnly IntegerOnly
288 %type <alias> alias_clause
289 %type <sortby> sortby
290 %type <ielem> index_elem
291 %type <node> table_ref
292 %type <jexpr> joined_table
293 %type <range> relation_expr
294 %type <target> target_el insert_target_el update_target_el insert_column_item
296 %type <typnam> Typename SimpleTypename ConstTypename
297 GenericType Numeric opt_float
298 Character ConstCharacter
299 CharacterWithLength CharacterWithoutLength
300 ConstDatetime ConstInterval
301 Bit ConstBit BitWithLength BitWithoutLength
302 %type <str> character
303 %type <str> extract_arg
304 %type <str> opt_charset
305 %type <ival> opt_numeric opt_decimal
306 %type <boolean> opt_varying opt_timezone
308 %type <ival> Iconst SignedIconst
309 %type <str> Sconst comment_text
310 %type <str> RoleId opt_granted_by opt_boolean ColId_or_Sconst
311 %type <list> var_list var_list_or_default
312 %type <str> ColId ColLabel var_name type_name param_name
313 %type <node> var_value zone_value
315 %type <keyword> unreserved_keyword func_name_keyword
316 %type <keyword> col_name_keyword reserved_keyword
318 %type <node> TableConstraint TableLikeClause
319 %type <list> ColQualList
320 %type <node> ColConstraint ColConstraintElem ConstraintAttr
321 %type <ival> key_actions key_delete key_match key_update key_action
322 %type <ival> ConstraintAttributeSpec ConstraintDeferrabilitySpec
325 %type <list> constraints_set_list
326 %type <boolean> constraints_set_mode
327 %type <str> OptTableSpace OptConsTableSpace OptTableSpaceOwner
331 * If you make any token changes, update the keyword table in
332 * parser/keywords.c and add new keywords to the appropriate one of
333 * the reserved-or-not-so-reserved keyword lists, below; search
334 * this file for "Name classification hierarchy".
337 /* ordinary key words in alphabetical order */
338 %token <keyword> ABORT_P ABSOLUTE_P ACCESS ACTION ADD_P ADMIN AFTER
339 AGGREGATE ALL ALSO ALTER ANALYSE ANALYZE AND ANY ARRAY AS ASC
340 ASSERTION ASSIGNMENT ASYMMETRIC AT AUTHORIZATION
342 BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT
345 CACHE CALLED CASCADE CASE CAST CHAIN CHAR_P
346 CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE
347 CLUSTER COALESCE COLLATE COLUMN COMMENT COMMIT
348 COMMITTED CONNECTION CONSTRAINT CONSTRAINTS CONVERSION_P CONVERT COPY CREATE CREATEDB
349 CREATEROLE CREATEUSER CROSS CSV CURRENT_DATE CURRENT_ROLE CURRENT_TIME
350 CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE
352 DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS
353 DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS
354 DESC DISABLE_P DISTINCT DO DOMAIN_P DOUBLE_P DROP
356 EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ESCAPE EXCEPT EXCLUDING
357 EXCLUSIVE EXECUTE EXISTS EXPLAIN EXTERNAL EXTRACT
359 FALSE_P FETCH FIRST_P FLOAT_P FOR FORCE FOREIGN FORWARD
360 FREEZE FROM FULL FUNCTION
362 GLOBAL GRANT GRANTED GREATEST GROUP_P
364 HANDLER HAVING HEADER_P HOLD HOUR_P
366 IF_P ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IN_P INCLUDING INCREMENT
367 INDEX INHERIT INHERITS INITIALLY INNER_P INOUT INPUT_P
368 INSENSITIVE INSERT INSTEAD INT_P INTEGER INTERSECT
369 INTERVAL INTO INVOKER IS ISNULL ISOLATION
375 LANCOMPILER LANGUAGE LARGE_P LAST_P LEADING LEAST LEFT LEVEL
376 LIKE LIMIT LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION
379 MATCH MAXVALUE MINUTE_P MINVALUE MODE MONTH_P MOVE
381 NAMES NATIONAL NATURAL NCHAR NEW NEXT NO NOCREATEDB
382 NOCREATEROLE NOCREATEUSER NOINHERIT NOLOGIN_P NONE NOSUPERUSER
383 NOT NOTHING NOTIFY NOTNULL NOWAIT NULL_P NULLIF NUMERIC
385 OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OR
386 ORDER OUT_P OUTER_P OVERLAPS OVERLAY OWNED OWNER
388 PARTIAL PASSWORD PLACING POSITION
389 PRECISION PRESERVE PREPARE PREPARED PRIMARY
390 PRIOR PRIVILEGES PROCEDURAL PROCEDURE
394 READ REAL REASSIGN RECHECK REFERENCES REINDEX RELATIVE_P RELEASE RENAME
395 REPEATABLE REPLACE RESET RESTART RESTRICT RETURNS REVOKE RIGHT
396 ROLE ROLLBACK ROW ROWS RULE
398 SAVEPOINT SCHEMA SCROLL SECOND_P SECURITY SELECT SEQUENCE
399 SERIALIZABLE SESSION SESSION_USER SET SETOF SHARE
400 SHOW SIMILAR SIMPLE SMALLINT SOME STABLE START STATEMENT
401 STATISTICS STDIN STDOUT STORAGE STRICT_P SUBSTRING SUPERUSER_P SYMMETRIC
404 TABLE TABLESPACE TEMP TEMPLATE TEMPORARY THEN TIME TIMESTAMP
405 TO TOAST TRAILING TRANSACTION TREAT TRIGGER TRIM TRUE_P
406 TRUNCATE TRUSTED TYPE_P
408 UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN UNLISTEN UNTIL
411 VACUUM VALID VALIDATOR VALUES VARCHAR VARYING
412 VERBOSE VIEW VOLATILE
414 WHEN WHERE WITH WITHOUT WORK WRITE
420 /* The grammar thinks these are keywords, but they are not in the keywords.c
421 * list and so can never be entered directly. The filter in parser.c
422 * creates these tokens when required.
426 /* Special token types, not actually keywords - see the "lex" file */
427 %token <str> IDENT FCONST SCONST BCONST XCONST Op
428 %token <ival> ICONST PARAM
430 /* precedence: lowest to highest */
438 %nonassoc LIKE ILIKE SIMILAR
443 %left POSTFIXOP /* dummy for postfix Op rules */
444 %left Op OPERATOR /* multi-character ops and user-defined operators */
447 %nonassoc IS NULL_P TRUE_P FALSE_P UNKNOWN /* sets precedence for IS NULL, etc */
451 /* Unary Operators */
452 %left AT ZONE /* sets precedence for AT TIME ZONE */
459 * These might seem to be low-precedence, but actually they are not part
460 * of the arithmetic hierarchy at all in their use as JOIN operators.
461 * We make them high-precedence to support their use as function names.
462 * They wouldn't be given a precedence at all, were it not that we need
463 * left-associativity among the JOIN rules themselves.
465 %left JOIN UNIONJOIN CROSS LEFT FULL RIGHT INNER_P NATURAL
469 * Handle comment-only lines, and ;; SELECT * FROM pg_class ;;;
470 * psql already handles such cases, but other interfaces don't.
473 stmtblock: stmtmulti { parsetree = $1; }
476 /* the thrashing around here is to discard "empty" statements... */
477 stmtmulti: stmtmulti ';' stmt
479 $$ = lappend($1, $3);
493 | AlterDatabaseSetStmt
497 | AlterObjectSchemaStmt
515 | CreateConversionStmt
524 | CreateTableSpaceStmt
581 /*****************************************************************************
583 * Create a new Postgres DBMS role
585 *****************************************************************************/
588 CREATE ROLE RoleId opt_with OptRoleList
590 CreateRoleStmt *n = makeNode(CreateRoleStmt);
591 n->stmt_type = ROLESTMT_ROLE;
604 * Options for CREATE ROLE and ALTER ROLE (also used by CREATE/ALTER USER
605 * for backwards compatibility). Note: the only option required by SQL99
606 * is "WITH ADMIN name".
609 OptRoleList OptRoleElem { $$ = lappend($1, $2); }
610 | /* EMPTY */ { $$ = NIL; }
616 $$ = makeDefElem("password",
617 (Node *)makeString($2));
621 $$ = makeDefElem("password", NULL);
623 | ENCRYPTED PASSWORD Sconst
625 $$ = makeDefElem("encryptedPassword",
626 (Node *)makeString($3));
628 | UNENCRYPTED PASSWORD Sconst
630 $$ = makeDefElem("unencryptedPassword",
631 (Node *)makeString($3));
635 $$ = makeDefElem("superuser", (Node *)makeInteger(TRUE));
639 $$ = makeDefElem("superuser", (Node *)makeInteger(FALSE));
643 $$ = makeDefElem("inherit", (Node *)makeInteger(TRUE));
647 $$ = makeDefElem("inherit", (Node *)makeInteger(FALSE));
651 $$ = makeDefElem("createdb", (Node *)makeInteger(TRUE));
655 $$ = makeDefElem("createdb", (Node *)makeInteger(FALSE));
659 $$ = makeDefElem("createrole", (Node *)makeInteger(TRUE));
663 $$ = makeDefElem("createrole", (Node *)makeInteger(FALSE));
667 /* For backwards compatibility, synonym for SUPERUSER */
668 $$ = makeDefElem("superuser", (Node *)makeInteger(TRUE));
672 $$ = makeDefElem("superuser", (Node *)makeInteger(FALSE));
676 $$ = makeDefElem("canlogin", (Node *)makeInteger(TRUE));
680 $$ = makeDefElem("canlogin", (Node *)makeInteger(FALSE));
682 | CONNECTION LIMIT SignedIconst
684 $$ = makeDefElem("connectionlimit", (Node *)makeInteger($3));
688 $$ = makeDefElem("validUntil", (Node *)makeString($3));
690 /* Supported but not documented for roles, for use by ALTER GROUP. */
693 $$ = makeDefElem("rolemembers", (Node *)$2);
695 /* The following are not supported by ALTER ROLE/USER/GROUP */
698 $$ = makeDefElem("sysid", (Node *)makeInteger($2));
702 $$ = makeDefElem("adminmembers", (Node *)$2);
706 $$ = makeDefElem("rolemembers", (Node *)$2);
708 | IN_P ROLE name_list
710 $$ = makeDefElem("addroleto", (Node *)$3);
712 | IN_P GROUP_P name_list
714 $$ = makeDefElem("addroleto", (Node *)$3);
719 /*****************************************************************************
721 * Create a new Postgres DBMS user (role with implied login ability)
723 *****************************************************************************/
726 CREATE USER RoleId opt_with OptRoleList
728 CreateRoleStmt *n = makeNode(CreateRoleStmt);
729 n->stmt_type = ROLESTMT_USER;
737 /*****************************************************************************
739 * Alter a postgresql DBMS role
741 *****************************************************************************/
744 ALTER ROLE RoleId opt_with OptRoleList
746 AlterRoleStmt *n = makeNode(AlterRoleStmt);
748 n->action = +1; /* add, if there are members */
755 ALTER ROLE RoleId SET set_rest
757 AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
759 n->variable = $5->name;
763 | ALTER ROLE RoleId VariableResetStmt
765 AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
767 n->variable = ((VariableResetStmt *)$4)->name;
774 /*****************************************************************************
776 * Alter a postgresql DBMS user
778 *****************************************************************************/
781 ALTER USER RoleId opt_with OptRoleList
783 AlterRoleStmt *n = makeNode(AlterRoleStmt);
785 n->action = +1; /* add, if there are members */
793 ALTER USER RoleId SET set_rest
795 AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
797 n->variable = $5->name;
801 | ALTER USER RoleId VariableResetStmt
803 AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
805 n->variable = ((VariableResetStmt *)$4)->name;
812 /*****************************************************************************
814 * Drop a postgresql DBMS role
816 * XXX Ideally this would have CASCADE/RESTRICT options, but since a role
817 * might own objects in multiple databases, there is presently no way to
818 * implement either cascading or restricting. Caveat DBA.
819 *****************************************************************************/
824 DropRoleStmt *n = makeNode(DropRoleStmt);
830 /*****************************************************************************
832 * Drop a postgresql DBMS user
834 * XXX Ideally this would have CASCADE/RESTRICT options, but since a user
835 * might own objects in multiple databases, there is presently no way to
836 * implement either cascading or restricting. Caveat DBA.
837 *****************************************************************************/
842 DropRoleStmt *n = makeNode(DropRoleStmt);
849 /*****************************************************************************
851 * Create a postgresql group (role without login ability)
853 *****************************************************************************/
856 CREATE GROUP_P RoleId opt_with OptRoleList
858 CreateRoleStmt *n = makeNode(CreateRoleStmt);
859 n->stmt_type = ROLESTMT_GROUP;
867 /*****************************************************************************
869 * Alter a postgresql group
871 *****************************************************************************/
874 ALTER GROUP_P RoleId add_drop USER name_list
876 AlterRoleStmt *n = makeNode(AlterRoleStmt);
879 n->options = list_make1(makeDefElem("rolemembers",
885 add_drop: ADD_P { $$ = +1; }
890 /*****************************************************************************
892 * Drop a postgresql group
894 * XXX see above notes about cascading DROP USER; groups have same problem.
895 *****************************************************************************/
898 DROP GROUP_P name_list
900 DropRoleStmt *n = makeNode(DropRoleStmt);
907 /*****************************************************************************
909 * Manipulate a schema
911 *****************************************************************************/
914 CREATE SCHEMA OptSchemaName AUTHORIZATION RoleId OptSchemaEltList
916 CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
917 /* One can omit the schema name or the authorization id. */
926 | CREATE SCHEMA ColId OptSchemaEltList
928 CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
929 /* ...but not both */
939 | /* EMPTY */ { $$ = NULL; }
943 OptSchemaEltList schema_stmt { $$ = lappend($1, $2); }
944 | /* EMPTY */ { $$ = NIL; }
948 * schema_stmt are the ones that can show up inside a CREATE SCHEMA
949 * statement (in addition to by themselves).
961 /*****************************************************************************
963 * Set PG internal variable
964 * SET name TO 'var_value'
965 * Include SQL92 syntax (thomas 1997-10-22):
966 * SET TIME ZONE 'var_value'
968 *****************************************************************************/
973 VariableSetStmt *n = $2;
979 VariableSetStmt *n = $3;
983 | SET SESSION set_rest
985 VariableSetStmt *n = $3;
991 set_rest: var_name TO var_list_or_default
993 VariableSetStmt *n = makeNode(VariableSetStmt);
998 | var_name '=' var_list_or_default
1000 VariableSetStmt *n = makeNode(VariableSetStmt);
1005 | TIME ZONE zone_value
1007 VariableSetStmt *n = makeNode(VariableSetStmt);
1008 n->name = "timezone";
1010 n->args = list_make1($3);
1013 | TRANSACTION transaction_mode_list
1015 VariableSetStmt *n = makeNode(VariableSetStmt);
1016 n->name = "TRANSACTION";
1020 | SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list
1022 VariableSetStmt *n = makeNode(VariableSetStmt);
1023 n->name = "SESSION CHARACTERISTICS";
1027 | NAMES opt_encoding
1029 VariableSetStmt *n = makeNode(VariableSetStmt);
1030 n->name = "client_encoding";
1032 n->args = list_make1(makeStringConst($2, NULL));
1035 | ROLE ColId_or_Sconst
1037 VariableSetStmt *n = makeNode(VariableSetStmt);
1039 n->args = list_make1(makeStringConst($2, NULL));
1042 | SESSION AUTHORIZATION ColId_or_Sconst
1044 VariableSetStmt *n = makeNode(VariableSetStmt);
1045 n->name = "session_authorization";
1046 n->args = list_make1(makeStringConst($3, NULL));
1049 | SESSION AUTHORIZATION DEFAULT
1051 VariableSetStmt *n = makeNode(VariableSetStmt);
1052 n->name = "session_authorization";
1060 | var_name '.' ColId
1062 int qLen = strlen($1);
1063 char* qualName = palloc(qLen + strlen($3) + 2);
1064 strcpy(qualName, $1);
1065 qualName[qLen] = '.';
1066 strcpy(qualName + qLen + 1, $3);
1071 var_list_or_default:
1072 var_list { $$ = $1; }
1073 | DEFAULT { $$ = NIL; }
1076 var_list: var_value { $$ = list_make1($1); }
1077 | var_list ',' var_value { $$ = lappend($1, $3); }
1080 var_value: opt_boolean
1081 { $$ = makeStringConst($1, NULL); }
1083 { $$ = makeStringConst($1, NULL); }
1085 { $$ = makeAConst($1); }
1088 iso_level: READ UNCOMMITTED { $$ = "read uncommitted"; }
1089 | READ COMMITTED { $$ = "read committed"; }
1090 | REPEATABLE READ { $$ = "repeatable read"; }
1091 | SERIALIZABLE { $$ = "serializable"; }
1095 TRUE_P { $$ = "true"; }
1096 | FALSE_P { $$ = "false"; }
1098 | OFF { $$ = "off"; }
1101 /* Timezone values can be:
1102 * - a string such as 'pst8pdt'
1103 * - an identifier such as "pst8pdt"
1104 * - an integer or floating point number
1105 * - a time interval per SQL99
1106 * ColId gives reduce/reduce errors against ConstInterval and LOCAL,
1107 * so use IDENT and reject anything which is a reserved word.
1112 $$ = makeStringConst($1, NULL);
1116 $$ = makeStringConst($1, NULL);
1118 | ConstInterval Sconst opt_interval
1120 A_Const *n = (A_Const *) makeStringConst($2, $1);
1121 if ($3 != INTERVAL_FULL_RANGE)
1123 if (($3 & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0)
1125 (errcode(ERRCODE_SYNTAX_ERROR),
1126 errmsg("time zone interval must be HOUR or HOUR TO MINUTE")));
1127 n->typename->typmod = INTERVAL_TYPMOD(INTERVAL_FULL_PRECISION, $3);
1131 | ConstInterval '(' Iconst ')' Sconst opt_interval
1133 A_Const *n = (A_Const *) makeStringConst($5, $1);
1136 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1137 errmsg("INTERVAL(%d) precision must not be negative",
1139 if ($3 > MAX_INTERVAL_PRECISION)
1142 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1143 errmsg("INTERVAL(%d) precision reduced to maximum allowed, %d",
1144 $3, MAX_INTERVAL_PRECISION)));
1145 $3 = MAX_INTERVAL_PRECISION;
1148 if (($6 != INTERVAL_FULL_RANGE)
1149 && (($6 & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0))
1151 (errcode(ERRCODE_SYNTAX_ERROR),
1152 errmsg("time zone interval must be HOUR or HOUR TO MINUTE")));
1154 n->typename->typmod = INTERVAL_TYPMOD($3, $6);
1158 | NumericOnly { $$ = makeAConst($1); }
1159 | DEFAULT { $$ = NULL; }
1160 | LOCAL { $$ = NULL; }
1165 | DEFAULT { $$ = NULL; }
1166 | /*EMPTY*/ { $$ = NULL; }
1171 | SCONST { $$ = $1; }
1178 VariableShowStmt *n = makeNode(VariableShowStmt);
1184 VariableShowStmt *n = makeNode(VariableShowStmt);
1185 n->name = "timezone";
1188 | SHOW TRANSACTION ISOLATION LEVEL
1190 VariableShowStmt *n = makeNode(VariableShowStmt);
1191 n->name = "transaction_isolation";
1194 | SHOW SESSION AUTHORIZATION
1196 VariableShowStmt *n = makeNode(VariableShowStmt);
1197 n->name = "session_authorization";
1202 VariableShowStmt *n = makeNode(VariableShowStmt);
1211 VariableResetStmt *n = makeNode(VariableResetStmt);
1217 VariableResetStmt *n = makeNode(VariableResetStmt);
1218 n->name = "timezone";
1221 | RESET TRANSACTION ISOLATION LEVEL
1223 VariableResetStmt *n = makeNode(VariableResetStmt);
1224 n->name = "transaction_isolation";
1227 | RESET SESSION AUTHORIZATION
1229 VariableResetStmt *n = makeNode(VariableResetStmt);
1230 n->name = "session_authorization";
1235 VariableResetStmt *n = makeNode(VariableResetStmt);
1243 SET CONSTRAINTS constraints_set_list constraints_set_mode
1245 ConstraintsSetStmt *n = makeNode(ConstraintsSetStmt);
1246 n->constraints = $3;
1252 constraints_set_list:
1254 | name_list { $$ = $1; }
1257 constraints_set_mode:
1258 DEFERRED { $$ = TRUE; }
1259 | IMMEDIATE { $$ = FALSE; }
1264 * Checkpoint statement
1269 CheckPointStmt *n = makeNode(CheckPointStmt);
1275 /*****************************************************************************
1277 * ALTER [ TABLE | INDEX ] variations
1279 *****************************************************************************/
1282 ALTER TABLE relation_expr alter_table_cmds
1284 AlterTableStmt *n = makeNode(AlterTableStmt);
1287 n->relkind = OBJECT_TABLE;
1290 | ALTER INDEX relation_expr alter_rel_cmds
1292 AlterTableStmt *n = makeNode(AlterTableStmt);
1295 n->relkind = OBJECT_INDEX;
1301 alter_table_cmd { $$ = list_make1($1); }
1302 | alter_table_cmds ',' alter_table_cmd { $$ = lappend($1, $3); }
1305 /* Subcommands that are for ALTER TABLE only */
1307 /* ALTER TABLE <relation> ADD_P [COLUMN] <coldef> */
1308 ADD_P opt_column columnDef
1310 AlterTableCmd *n = makeNode(AlterTableCmd);
1311 n->subtype = AT_AddColumn;
1315 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> {SET DEFAULT <expr>|DROP DEFAULT} */
1316 | ALTER opt_column ColId alter_column_default
1318 AlterTableCmd *n = makeNode(AlterTableCmd);
1319 n->subtype = AT_ColumnDefault;
1324 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> DROP NOT NULL */
1325 | ALTER opt_column ColId DROP NOT NULL_P
1327 AlterTableCmd *n = makeNode(AlterTableCmd);
1328 n->subtype = AT_DropNotNull;
1332 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET NOT NULL */
1333 | ALTER opt_column ColId SET NOT NULL_P
1335 AlterTableCmd *n = makeNode(AlterTableCmd);
1336 n->subtype = AT_SetNotNull;
1340 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET STATISTICS <IntegerOnly> */
1341 | ALTER opt_column ColId SET STATISTICS IntegerOnly
1343 AlterTableCmd *n = makeNode(AlterTableCmd);
1344 n->subtype = AT_SetStatistics;
1346 n->def = (Node *) $6;
1349 /* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET STORAGE <storagemode> */
1350 | ALTER opt_column ColId SET STORAGE ColId
1352 AlterTableCmd *n = makeNode(AlterTableCmd);
1353 n->subtype = AT_SetStorage;
1355 n->def = (Node *) makeString($6);
1358 /* ALTER TABLE <relation> DROP [COLUMN] <colname> [RESTRICT|CASCADE] */
1359 | DROP opt_column ColId opt_drop_behavior
1361 AlterTableCmd *n = makeNode(AlterTableCmd);
1362 n->subtype = AT_DropColumn;
1368 * ALTER TABLE <relation> ALTER [COLUMN] <colname> TYPE <typename>
1369 * [ USING <expression> ]
1371 | ALTER opt_column ColId TYPE_P Typename alter_using
1373 AlterTableCmd *n = makeNode(AlterTableCmd);
1374 n->subtype = AT_AlterColumnType;
1376 n->def = (Node *) $5;
1380 /* ALTER TABLE <relation> ADD_P CONSTRAINT ... */
1381 | ADD_P TableConstraint
1383 AlterTableCmd *n = makeNode(AlterTableCmd);
1384 n->subtype = AT_AddConstraint;
1388 /* ALTER TABLE <relation> DROP CONSTRAINT <name> [RESTRICT|CASCADE] */
1389 | DROP CONSTRAINT name opt_drop_behavior
1391 AlterTableCmd *n = makeNode(AlterTableCmd);
1392 n->subtype = AT_DropConstraint;
1397 /* ALTER TABLE <relation> SET WITHOUT OIDS */
1400 AlterTableCmd *n = makeNode(AlterTableCmd);
1401 n->subtype = AT_DropOids;
1404 /* ALTER TABLE <name> CREATE TOAST TABLE -- ONLY */
1405 | CREATE TOAST TABLE
1407 AlterTableCmd *n = makeNode(AlterTableCmd);
1408 n->subtype = AT_ToastTable;
1411 /* ALTER TABLE <name> CLUSTER ON <indexname> */
1414 AlterTableCmd *n = makeNode(AlterTableCmd);
1415 n->subtype = AT_ClusterOn;
1419 /* ALTER TABLE <name> SET WITHOUT CLUSTER */
1420 | SET WITHOUT CLUSTER
1422 AlterTableCmd *n = makeNode(AlterTableCmd);
1423 n->subtype = AT_DropCluster;
1427 /* ALTER TABLE <name> ENABLE TRIGGER <trig> */
1428 | ENABLE_P TRIGGER name
1430 AlterTableCmd *n = makeNode(AlterTableCmd);
1431 n->subtype = AT_EnableTrig;
1435 /* ALTER TABLE <name> ENABLE TRIGGER ALL */
1436 | ENABLE_P TRIGGER ALL
1438 AlterTableCmd *n = makeNode(AlterTableCmd);
1439 n->subtype = AT_EnableTrigAll;
1442 /* ALTER TABLE <name> ENABLE TRIGGER USER */
1443 | ENABLE_P TRIGGER USER
1445 AlterTableCmd *n = makeNode(AlterTableCmd);
1446 n->subtype = AT_EnableTrigUser;
1449 /* ALTER TABLE <name> DISABLE TRIGGER <trig> */
1450 | DISABLE_P TRIGGER name
1452 AlterTableCmd *n = makeNode(AlterTableCmd);
1453 n->subtype = AT_DisableTrig;
1457 /* ALTER TABLE <name> DISABLE TRIGGER ALL */
1458 | DISABLE_P TRIGGER ALL
1460 AlterTableCmd *n = makeNode(AlterTableCmd);
1461 n->subtype = AT_DisableTrigAll;
1464 /* ALTER TABLE <name> DISABLE TRIGGER USER */
1465 | DISABLE_P TRIGGER USER
1467 AlterTableCmd *n = makeNode(AlterTableCmd);
1468 n->subtype = AT_DisableTrigUser;
1478 alter_rel_cmd { $$ = list_make1($1); }
1479 | alter_rel_cmds ',' alter_rel_cmd { $$ = lappend($1, $3); }
1482 /* Subcommands that are for ALTER TABLE or ALTER INDEX */
1484 /* ALTER [TABLE|INDEX] <name> OWNER TO RoleId */
1487 AlterTableCmd *n = makeNode(AlterTableCmd);
1488 n->subtype = AT_ChangeOwner;
1492 /* ALTER [TABLE|INDEX] <name> SET TABLESPACE <tablespacename> */
1493 | SET TABLESPACE name
1495 AlterTableCmd *n = makeNode(AlterTableCmd);
1496 n->subtype = AT_SetTableSpace;
1502 alter_column_default:
1505 /* Treat SET DEFAULT NULL the same as DROP DEFAULT */
1506 if (exprIsNullConstant($3))
1511 | DROP DEFAULT { $$ = NULL; }
1515 CASCADE { $$ = DROP_CASCADE; }
1516 | RESTRICT { $$ = DROP_RESTRICT; }
1517 | /* EMPTY */ { $$ = DROP_RESTRICT; /* default */ }
1521 USING a_expr { $$ = $2; }
1522 | /* EMPTY */ { $$ = NULL; }
1527 /*****************************************************************************
1530 * close <portalname>
1532 *****************************************************************************/
1537 ClosePortalStmt *n = makeNode(ClosePortalStmt);
1544 /*****************************************************************************
1547 * COPY <relname> ['(' columnList ')'] FROM/TO [WITH options]
1549 * BINARY, OIDS, and DELIMITERS kept in old locations
1550 * for backward compatibility. 2002-06-18
1552 *****************************************************************************/
1554 CopyStmt: COPY opt_binary qualified_name opt_column_list opt_oids
1555 copy_from copy_file_name copy_delimiter opt_with copy_opt_list
1557 CopyStmt *n = makeNode(CopyStmt);
1564 /* Concatenate user-supplied flags */
1566 n->options = lappend(n->options, $2);
1568 n->options = lappend(n->options, $5);
1570 n->options = lappend(n->options, $8);
1572 n->options = list_concat(n->options, $10);
1579 | TO { $$ = FALSE; }
1583 * copy_file_name NULL indicates stdio is used. Whether stdin or stdout is
1584 * used depends on the direction. (It really doesn't make sense to copy from
1585 * stdout. We silently correct the "typo". - AY 9/94
1589 | STDIN { $$ = NULL; }
1590 | STDOUT { $$ = NULL; }
1596 copy_opt_list copy_opt_item { $$ = lappend($1, $2); }
1597 | /* EMPTY */ { $$ = NIL; }
1604 $$ = makeDefElem("binary", (Node *)makeInteger(TRUE));
1608 $$ = makeDefElem("oids", (Node *)makeInteger(TRUE));
1610 | DELIMITER opt_as Sconst
1612 $$ = makeDefElem("delimiter", (Node *)makeString($3));
1614 | NULL_P opt_as Sconst
1616 $$ = makeDefElem("null", (Node *)makeString($3));
1620 $$ = makeDefElem("csv", (Node *)makeInteger(TRUE));
1624 $$ = makeDefElem("header", (Node *)makeInteger(TRUE));
1626 | QUOTE opt_as Sconst
1628 $$ = makeDefElem("quote", (Node *)makeString($3));
1630 | ESCAPE opt_as Sconst
1632 $$ = makeDefElem("escape", (Node *)makeString($3));
1634 | FORCE QUOTE columnList
1636 $$ = makeDefElem("force_quote", (Node *)$3);
1638 | FORCE NOT NULL_P columnList
1640 $$ = makeDefElem("force_notnull", (Node *)$4);
1644 /* The following exist for backward compatibility */
1649 $$ = makeDefElem("binary", (Node *)makeInteger(TRUE));
1651 | /*EMPTY*/ { $$ = NULL; }
1657 $$ = makeDefElem("oids", (Node *)makeInteger(TRUE));
1659 | /*EMPTY*/ { $$ = NULL; }
1663 /* USING DELIMITERS kept for backward compatibility. 2002-06-15 */
1664 opt_using DELIMITERS Sconst
1666 $$ = makeDefElem("delimiter", (Node *)makeString($3));
1668 | /*EMPTY*/ { $$ = NULL; }
1677 /*****************************************************************************
1680 * CREATE TABLE relname
1682 *****************************************************************************/
1684 CreateStmt: CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')'
1685 OptInherit OptWithOids OnCommitOption OptTableSpace
1687 CreateStmt *n = makeNode(CreateStmt);
1691 n->inhRelations = $8;
1692 n->constraints = NIL;
1695 n->tablespacename = $11;
1698 | CREATE OptTemp TABLE qualified_name OF qualified_name
1699 '(' OptTableElementList ')' OptWithOids OnCommitOption OptTableSpace
1701 /* SQL99 CREATE TABLE OF <UDT> (cols) seems to be satisfied
1702 * by our inheritance capabilities. Let's try it...
1704 CreateStmt *n = makeNode(CreateStmt);
1708 n->inhRelations = list_make1($6);
1709 n->constraints = NIL;
1712 n->tablespacename = $12;
1718 * Redundancy here is needed to avoid shift/reduce conflicts,
1719 * since TEMP is not a reserved word. See also OptTempTableName.
1721 * NOTE: we accept both GLOBAL and LOCAL options; since we have no modules
1722 * the LOCAL keyword is really meaningless.
1724 OptTemp: TEMPORARY { $$ = TRUE; }
1725 | TEMP { $$ = TRUE; }
1726 | LOCAL TEMPORARY { $$ = TRUE; }
1727 | LOCAL TEMP { $$ = TRUE; }
1728 | GLOBAL TEMPORARY { $$ = TRUE; }
1729 | GLOBAL TEMP { $$ = TRUE; }
1730 | /*EMPTY*/ { $$ = FALSE; }
1733 OptTableElementList:
1734 TableElementList { $$ = $1; }
1735 | /*EMPTY*/ { $$ = NIL; }
1741 $$ = list_make1($1);
1743 | TableElementList ',' TableElement
1745 $$ = lappend($1, $3);
1750 columnDef { $$ = $1; }
1751 | TableLikeClause { $$ = $1; }
1752 | TableConstraint { $$ = $1; }
1755 columnDef: ColId Typename ColQualList
1757 ColumnDef *n = makeNode(ColumnDef);
1760 n->constraints = $3;
1767 ColQualList ColConstraint { $$ = lappend($1, $2); }
1768 | /*EMPTY*/ { $$ = NIL; }
1772 CONSTRAINT name ColConstraintElem
1774 switch (nodeTag($3))
1778 Constraint *n = (Constraint *)$3;
1782 case T_FkConstraint:
1784 FkConstraint *n = (FkConstraint *)$3;
1785 n->constr_name = $2;
1793 | ColConstraintElem { $$ = $1; }
1794 | ConstraintAttr { $$ = $1; }
1797 /* DEFAULT NULL is already the default for Postgres.
1798 * But define it here and carry it forward into the system
1799 * to make it explicit.
1800 * - thomas 1998-09-13
1802 * WITH NULL and NULL are not SQL92-standard syntax elements,
1803 * so leave them out. Use DEFAULT NULL to explicitly indicate
1804 * that a column may have that value. WITH NULL leads to
1805 * shift/reduce conflicts with WITH TIME ZONE anyway.
1806 * - thomas 1999-01-08
1808 * DEFAULT expression must be b_expr not a_expr to prevent shift/reduce
1809 * conflict on NOT (since NOT might start a subsequent NOT NULL constraint,
1810 * or be part of a_expr NOT LIKE or similar constructs).
1815 Constraint *n = makeNode(Constraint);
1816 n->contype = CONSTR_NOTNULL;
1819 n->cooked_expr = NULL;
1821 n->indexspace = NULL;
1826 Constraint *n = makeNode(Constraint);
1827 n->contype = CONSTR_NULL;
1830 n->cooked_expr = NULL;
1832 n->indexspace = NULL;
1835 | UNIQUE OptConsTableSpace
1837 Constraint *n = makeNode(Constraint);
1838 n->contype = CONSTR_UNIQUE;
1841 n->cooked_expr = NULL;
1846 | PRIMARY KEY OptConsTableSpace
1848 Constraint *n = makeNode(Constraint);
1849 n->contype = CONSTR_PRIMARY;
1852 n->cooked_expr = NULL;
1857 | CHECK '(' a_expr ')'
1859 Constraint *n = makeNode(Constraint);
1860 n->contype = CONSTR_CHECK;
1863 n->cooked_expr = NULL;
1865 n->indexspace = NULL;
1870 Constraint *n = makeNode(Constraint);
1871 n->contype = CONSTR_DEFAULT;
1873 if (exprIsNullConstant($2))
1875 /* DEFAULT NULL should be reported as empty expr */
1882 n->cooked_expr = NULL;
1884 n->indexspace = NULL;
1887 | REFERENCES qualified_name opt_column_list key_match key_actions
1889 FkConstraint *n = makeNode(FkConstraint);
1890 n->constr_name = NULL;
1894 n->fk_matchtype = $4;
1895 n->fk_upd_action = (char) ($5 >> 8);
1896 n->fk_del_action = (char) ($5 & 0xFF);
1897 n->deferrable = FALSE;
1898 n->initdeferred = FALSE;
1904 * ConstraintAttr represents constraint attributes, which we parse as if
1905 * they were independent constraint clauses, in order to avoid shift/reduce
1906 * conflicts (since NOT might start either an independent NOT NULL clause
1907 * or an attribute). analyze.c is responsible for attaching the attribute
1908 * information to the preceding "real" constraint node, and for complaining
1909 * if attribute clauses appear in the wrong place or wrong combinations.
1911 * See also ConstraintAttributeSpec, which can be used in places where
1912 * there is no parsing conflict.
1917 Constraint *n = makeNode(Constraint);
1918 n->contype = CONSTR_ATTR_DEFERRABLE;
1923 Constraint *n = makeNode(Constraint);
1924 n->contype = CONSTR_ATTR_NOT_DEFERRABLE;
1927 | INITIALLY DEFERRED
1929 Constraint *n = makeNode(Constraint);
1930 n->contype = CONSTR_ATTR_DEFERRED;
1933 | INITIALLY IMMEDIATE
1935 Constraint *n = makeNode(Constraint);
1936 n->contype = CONSTR_ATTR_IMMEDIATE;
1943 * SQL99 supports wholesale borrowing of a table definition via the LIKE clause.
1944 * This seems to be a poor man's inheritance capability, with the resulting
1945 * tables completely decoupled except for the original commonality in definitions.
1947 * This is very similar to CREATE TABLE AS except for the INCLUDING DEFAULTS extension
1948 * which is a part of SQL 200N
1951 LIKE qualified_name like_including_defaults
1953 InhRelation *n = makeNode(InhRelation);
1955 n->including_defaults = $3;
1961 like_including_defaults:
1962 INCLUDING DEFAULTS { $$ = true; }
1963 | EXCLUDING DEFAULTS { $$ = false; }
1964 | /* EMPTY */ { $$ = false; }
1968 /* ConstraintElem specifies constraint syntax which is not embedded into
1969 * a column definition. ColConstraintElem specifies the embedded form.
1970 * - thomas 1997-12-03
1973 CONSTRAINT name ConstraintElem
1975 switch (nodeTag($3))
1979 Constraint *n = (Constraint *)$3;
1983 case T_FkConstraint:
1985 FkConstraint *n = (FkConstraint *)$3;
1986 n->constr_name = $2;
1994 | ConstraintElem { $$ = $1; }
1998 CHECK '(' a_expr ')'
2000 Constraint *n = makeNode(Constraint);
2001 n->contype = CONSTR_CHECK;
2004 n->cooked_expr = NULL;
2005 n->indexspace = NULL;
2008 | UNIQUE '(' columnList ')' OptConsTableSpace
2010 Constraint *n = makeNode(Constraint);
2011 n->contype = CONSTR_UNIQUE;
2014 n->cooked_expr = NULL;
2019 | PRIMARY KEY '(' columnList ')' OptConsTableSpace
2021 Constraint *n = makeNode(Constraint);
2022 n->contype = CONSTR_PRIMARY;
2025 n->cooked_expr = NULL;
2030 | FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
2031 opt_column_list key_match key_actions ConstraintAttributeSpec
2033 FkConstraint *n = makeNode(FkConstraint);
2034 n->constr_name = NULL;
2038 n->fk_matchtype = $9;
2039 n->fk_upd_action = (char) ($10 >> 8);
2040 n->fk_del_action = (char) ($10 & 0xFF);
2041 n->deferrable = ($11 & 1) != 0;
2042 n->initdeferred = ($11 & 2) != 0;
2048 '(' columnList ')' { $$ = $2; }
2049 | /*EMPTY*/ { $$ = NIL; }
2053 columnElem { $$ = list_make1($1); }
2054 | columnList ',' columnElem { $$ = lappend($1, $3); }
2059 $$ = (Node *) makeString($1);
2063 key_match: MATCH FULL
2065 $$ = FKCONSTR_MATCH_FULL;
2070 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2071 errmsg("MATCH PARTIAL not yet implemented")));
2072 $$ = FKCONSTR_MATCH_PARTIAL;
2076 $$ = FKCONSTR_MATCH_UNSPECIFIED;
2080 $$ = FKCONSTR_MATCH_UNSPECIFIED;
2085 * We combine the update and delete actions into one value temporarily
2086 * for simplicity of parsing, and then break them down again in the
2087 * calling production. update is in the left 8 bits, delete in the right.
2088 * Note that NOACTION is the default.
2092 { $$ = ($1 << 8) | (FKCONSTR_ACTION_NOACTION & 0xFF); }
2094 { $$ = (FKCONSTR_ACTION_NOACTION << 8) | ($1 & 0xFF); }
2095 | key_update key_delete
2096 { $$ = ($1 << 8) | ($2 & 0xFF); }
2097 | key_delete key_update
2098 { $$ = ($2 << 8) | ($1 & 0xFF); }
2100 { $$ = (FKCONSTR_ACTION_NOACTION << 8) | (FKCONSTR_ACTION_NOACTION & 0xFF); }
2103 key_update: ON UPDATE key_action { $$ = $3; }
2106 key_delete: ON DELETE_P key_action { $$ = $3; }
2110 NO ACTION { $$ = FKCONSTR_ACTION_NOACTION; }
2111 | RESTRICT { $$ = FKCONSTR_ACTION_RESTRICT; }
2112 | CASCADE { $$ = FKCONSTR_ACTION_CASCADE; }
2113 | SET NULL_P { $$ = FKCONSTR_ACTION_SETNULL; }
2114 | SET DEFAULT { $$ = FKCONSTR_ACTION_SETDEFAULT; }
2117 OptInherit: INHERITS '(' qualified_name_list ')' { $$ = $3; }
2118 | /*EMPTY*/ { $$ = NIL; }
2122 WITH OIDS { $$ = MUST_HAVE_OIDS; }
2123 | WITHOUT OIDS { $$ = MUST_NOT_HAVE_OIDS; }
2124 | /*EMPTY*/ { $$ = DEFAULT_OIDS; }
2127 OnCommitOption: ON COMMIT DROP { $$ = ONCOMMIT_DROP; }
2128 | ON COMMIT DELETE_P ROWS { $$ = ONCOMMIT_DELETE_ROWS; }
2129 | ON COMMIT PRESERVE ROWS { $$ = ONCOMMIT_PRESERVE_ROWS; }
2130 | /*EMPTY*/ { $$ = ONCOMMIT_NOOP; }
2133 OptTableSpace: TABLESPACE name { $$ = $2; }
2134 | /*EMPTY*/ { $$ = NULL; }
2137 OptConsTableSpace: USING INDEX TABLESPACE name { $$ = $4; }
2138 | /*EMPTY*/ { $$ = NULL; }
2143 * Note: CREATE TABLE ... AS SELECT ... is just another spelling for
2148 CREATE OptTemp TABLE qualified_name OptCreateAs WithOidsAs SelectStmt
2151 * When the SelectStmt is a set-operation tree, we must
2152 * stuff the INTO information into the leftmost component
2153 * Select, because that's where analyze.c will expect
2154 * to find it. Similarly, the output column names must
2155 * be attached to that Select's target list.
2157 SelectStmt *n = findLeftmostSelect((SelectStmt *) $7);
2158 if (n->into != NULL)
2160 (errcode(ERRCODE_SYNTAX_ERROR),
2161 errmsg("CREATE TABLE AS may not specify INTO")));
2164 n->intoColNames = $5;
2165 n->intoHasOids = $6;
2171 * To avoid a shift/reduce conflict in CreateAsStmt, we need to
2172 * include the 'AS' terminal in the parsing of WITH/WITHOUT
2173 * OIDS. Unfortunately that means this production is effectively a
2174 * duplicate of OptWithOids.
2177 WITH OIDS AS { $$ = MUST_HAVE_OIDS; }
2178 | WITHOUT OIDS AS { $$ = MUST_NOT_HAVE_OIDS; }
2179 | AS { $$ = DEFAULT_OIDS; }
2183 '(' CreateAsList ')' { $$ = $2; }
2184 | /*EMPTY*/ { $$ = NIL; }
2188 CreateAsElement { $$ = list_make1($1); }
2189 | CreateAsList ',' CreateAsElement { $$ = lappend($1, $3); }
2195 ColumnDef *n = makeNode(ColumnDef);
2200 n->is_not_null = false;
2201 n->raw_default = NULL;
2202 n->cooked_default = NULL;
2203 n->constraints = NIL;
2210 /*****************************************************************************
2213 * CREATE SEQUENCE seqname
2214 * ALTER SEQUENCE seqname
2216 *****************************************************************************/
2219 CREATE OptTemp SEQUENCE qualified_name OptSeqList
2221 CreateSeqStmt *n = makeNode(CreateSeqStmt);
2230 ALTER SEQUENCE qualified_name OptSeqList
2232 AlterSeqStmt *n = makeNode(AlterSeqStmt);
2239 OptSeqList: OptSeqList OptSeqElem { $$ = lappend($1, $2); }
2240 | /*EMPTY*/ { $$ = NIL; }
2243 OptSeqElem: CACHE NumericOnly
2245 $$ = makeDefElem("cache", (Node *)$2);
2249 $$ = makeDefElem("cycle", (Node *)makeInteger(TRUE));
2253 $$ = makeDefElem("cycle", (Node *)makeInteger(FALSE));
2255 | INCREMENT opt_by NumericOnly
2257 $$ = makeDefElem("increment", (Node *)$3);
2259 | MAXVALUE NumericOnly
2261 $$ = makeDefElem("maxvalue", (Node *)$2);
2263 | MINVALUE NumericOnly
2265 $$ = makeDefElem("minvalue", (Node *)$2);
2269 $$ = makeDefElem("maxvalue", NULL);
2273 $$ = makeDefElem("minvalue", NULL);
2275 | START opt_with NumericOnly
2277 $$ = makeDefElem("start", (Node *)$3);
2279 | RESTART opt_with NumericOnly
2281 $$ = makeDefElem("restart", (Node *)$3);
2290 FloatOnly { $$ = $1; }
2291 | IntegerOnly { $$ = $1; }
2294 FloatOnly: FCONST { $$ = makeFloat($1); }
2302 IntegerOnly: SignedIconst { $$ = makeInteger($1); };
2305 /*****************************************************************************
2308 * CREATE PROCEDURAL LANGUAGE ...
2309 * DROP PROCEDURAL LANGUAGE ...
2311 *****************************************************************************/
2314 CREATE opt_trusted opt_procedural LANGUAGE ColId_or_Sconst
2316 CreatePLangStmt *n = makeNode(CreatePLangStmt);
2318 /* parameters are all to be supplied by system */
2320 n->plvalidator = NIL;
2321 n->pltrusted = false;
2324 | CREATE opt_trusted opt_procedural LANGUAGE ColId_or_Sconst
2325 HANDLER handler_name opt_validator opt_lancompiler
2327 CreatePLangStmt *n = makeNode(CreatePLangStmt);
2330 n->plvalidator = $8;
2332 /* LANCOMPILER is now ignored entirely */
2338 TRUSTED { $$ = TRUE; }
2339 | /*EMPTY*/ { $$ = FALSE; }
2342 /* This ought to be just func_name, but that causes reduce/reduce conflicts
2343 * (CREATE LANGUAGE is the only place where func_name isn't followed by '(').
2344 * Work around by using simple names, instead.
2347 name { $$ = list_make1(makeString($1)); }
2348 | name attrs { $$ = lcons(makeString($1), $2); }
2352 VALIDATOR handler_name { $$ = $2; }
2353 | /*EMPTY*/ { $$ = NIL; }
2357 LANCOMPILER Sconst { $$ = $2; }
2358 | /*EMPTY*/ { $$ = NULL; }
2362 DROP opt_procedural LANGUAGE ColId_or_Sconst opt_drop_behavior
2364 DropPLangStmt *n = makeNode(DropPLangStmt);
2376 /*****************************************************************************
2379 * CREATE TABLESPACE tablespace LOCATION '/path/to/tablespace/'
2381 *****************************************************************************/
2383 CreateTableSpaceStmt: CREATE TABLESPACE name OptTableSpaceOwner LOCATION Sconst
2385 CreateTableSpaceStmt *n = makeNode(CreateTableSpaceStmt);
2386 n->tablespacename = $3;
2393 OptTableSpaceOwner: OWNER name { $$ = $2; }
2394 | /*EMPTY */ { $$ = NULL; }
2397 /*****************************************************************************
2400 * DROP TABLESPACE <tablespace>
2402 * No need for drop behaviour as we cannot implement dependencies for
2403 * objects in other databases; we can only support RESTRICT.
2405 ****************************************************************************/
2407 DropTableSpaceStmt: DROP TABLESPACE name
2409 DropTableSpaceStmt *n = makeNode(DropTableSpaceStmt);
2410 n->tablespacename = $3;
2415 /*****************************************************************************
2418 * CREATE TRIGGER ...
2421 *****************************************************************************/
2424 CREATE TRIGGER name TriggerActionTime TriggerEvents ON
2425 qualified_name TriggerForSpec EXECUTE PROCEDURE
2426 func_name '(' TriggerFuncArgs ')'
2428 CreateTrigStmt *n = makeNode(CreateTrigStmt);
2435 memcpy(n->actions, $5, 4);
2436 n->isconstraint = FALSE;
2437 n->deferrable = FALSE;
2438 n->initdeferred = FALSE;
2439 n->constrrel = NULL;
2442 | CREATE CONSTRAINT TRIGGER name AFTER TriggerEvents ON
2443 qualified_name OptConstrFromTable
2444 ConstraintAttributeSpec
2445 FOR EACH ROW EXECUTE PROCEDURE
2446 func_name '(' TriggerFuncArgs ')'
2448 CreateTrigStmt *n = makeNode(CreateTrigStmt);
2455 memcpy(n->actions, $6, 4);
2456 n->isconstraint = TRUE;
2457 n->deferrable = ($10 & 1) != 0;
2458 n->initdeferred = ($10 & 2) != 0;
2466 BEFORE { $$ = TRUE; }
2467 | AFTER { $$ = FALSE; }
2473 char *e = palloc(4);
2474 e[0] = $1; e[1] = '\0';
2477 | TriggerOneEvent OR TriggerOneEvent
2479 char *e = palloc(4);
2480 e[0] = $1; e[1] = $3; e[2] = '\0';
2483 | TriggerOneEvent OR TriggerOneEvent OR TriggerOneEvent
2485 char *e = palloc(4);
2486 e[0] = $1; e[1] = $3; e[2] = $5; e[3] = '\0';
2492 INSERT { $$ = 'i'; }
2493 | DELETE_P { $$ = 'd'; }
2494 | UPDATE { $$ = 'u'; }
2498 FOR TriggerForOpt TriggerForType
2505 * If ROW/STATEMENT not specified, default to
2506 * STATEMENT, per SQL
2519 | STATEMENT { $$ = FALSE; }
2523 TriggerFuncArg { $$ = list_make1($1); }
2524 | TriggerFuncArgs ',' TriggerFuncArg { $$ = lappend($1, $3); }
2525 | /*EMPTY*/ { $$ = NIL; }
2532 snprintf(buf, sizeof(buf), "%d", $1);
2533 $$ = makeString(pstrdup(buf));
2535 | FCONST { $$ = makeString($1); }
2536 | Sconst { $$ = makeString($1); }
2537 | BCONST { $$ = makeString($1); }
2538 | XCONST { $$ = makeString($1); }
2539 | ColId { $$ = makeString($1); }
2543 FROM qualified_name { $$ = $2; }
2544 | /*EMPTY*/ { $$ = NULL; }
2547 ConstraintAttributeSpec:
2548 ConstraintDeferrabilitySpec
2550 | ConstraintDeferrabilitySpec ConstraintTimeSpec
2552 if ($1 == 0 && $2 != 0)
2554 (errcode(ERRCODE_SYNTAX_ERROR),
2555 errmsg("constraint declared INITIALLY DEFERRED must be DEFERRABLE")));
2558 | ConstraintTimeSpec
2565 | ConstraintTimeSpec ConstraintDeferrabilitySpec
2567 if ($2 == 0 && $1 != 0)
2569 (errcode(ERRCODE_SYNTAX_ERROR),
2570 errmsg("constraint declared INITIALLY DEFERRED must be DEFERRABLE")));
2577 ConstraintDeferrabilitySpec:
2578 NOT DEFERRABLE { $$ = 0; }
2579 | DEFERRABLE { $$ = 1; }
2583 INITIALLY IMMEDIATE { $$ = 0; }
2584 | INITIALLY DEFERRED { $$ = 2; }
2589 DROP TRIGGER name ON qualified_name opt_drop_behavior
2591 DropPropertyStmt *n = makeNode(DropPropertyStmt);
2595 n->removeType = OBJECT_TRIGGER;
2601 /*****************************************************************************
2604 * CREATE ASSERTION ...
2605 * DROP ASSERTION ...
2607 *****************************************************************************/
2610 CREATE ASSERTION name CHECK '(' a_expr ')'
2611 ConstraintAttributeSpec
2613 CreateTrigStmt *n = makeNode(CreateTrigStmt);
2615 n->args = list_make1($6);
2616 n->isconstraint = TRUE;
2617 n->deferrable = ($8 & 1) != 0;
2618 n->initdeferred = ($8 & 2) != 0;
2621 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2622 errmsg("CREATE ASSERTION is not yet implemented")));
2629 DROP ASSERTION name opt_drop_behavior
2631 DropPropertyStmt *n = makeNode(DropPropertyStmt);
2635 n->removeType = OBJECT_TRIGGER; /* XXX */
2637 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2638 errmsg("DROP ASSERTION is not yet implemented")));
2644 /*****************************************************************************
2647 * define (aggregate,operator,type)
2649 *****************************************************************************/
2652 CREATE AGGREGATE func_name definition
2654 DefineStmt *n = makeNode(DefineStmt);
2655 n->kind = OBJECT_AGGREGATE;
2660 | CREATE OPERATOR any_operator definition
2662 DefineStmt *n = makeNode(DefineStmt);
2663 n->kind = OBJECT_OPERATOR;
2668 | CREATE TYPE_P any_name definition
2670 DefineStmt *n = makeNode(DefineStmt);
2671 n->kind = OBJECT_TYPE;
2676 | CREATE TYPE_P any_name AS '(' TableFuncElementList ')'
2678 CompositeTypeStmt *n = makeNode(CompositeTypeStmt);
2679 RangeVar *r = makeNode(RangeVar);
2681 /* can't use qualified_name, sigh */
2682 switch (list_length($3))
2685 r->catalogname = NULL;
2686 r->schemaname = NULL;
2687 r->relname = strVal(linitial($3));
2690 r->catalogname = NULL;
2691 r->schemaname = strVal(linitial($3));
2692 r->relname = strVal(lsecond($3));
2695 r->catalogname = strVal(linitial($3));
2696 r->schemaname = strVal(lsecond($3));
2697 r->relname = strVal(lthird($3));
2701 (errcode(ERRCODE_SYNTAX_ERROR),
2702 errmsg("improper qualified name (too many dotted names): %s",
2703 NameListToString($3))));
2712 definition: '(' def_list ')' { $$ = $2; }
2715 def_list: def_elem { $$ = list_make1($1); }
2716 | def_list ',' def_elem { $$ = lappend($1, $3); }
2719 def_elem: ColLabel '=' def_arg
2721 $$ = makeDefElem($1, (Node *)$3);
2725 $$ = makeDefElem($1, NULL);
2729 /* Note: any simple identifier will be returned as a type name! */
2730 def_arg: func_type { $$ = (Node *)$1; }
2731 | qual_all_Op { $$ = (Node *)$1; }
2732 | NumericOnly { $$ = (Node *)$1; }
2733 | Sconst { $$ = (Node *)makeString($1); }
2737 /*****************************************************************************
2740 * CREATE OPERATOR CLASS ...
2741 * DROP OPERATOR CLASS ...
2743 *****************************************************************************/
2746 CREATE OPERATOR CLASS any_name opt_default FOR TYPE_P Typename
2747 USING access_method AS opclass_item_list
2749 CreateOpClassStmt *n = makeNode(CreateOpClassStmt);
2750 n->opclassname = $4;
2760 opclass_item { $$ = list_make1($1); }
2761 | opclass_item_list ',' opclass_item { $$ = lappend($1, $3); }
2765 OPERATOR Iconst any_operator opt_recheck
2767 CreateOpClassItem *n = makeNode(CreateOpClassItem);
2768 n->itemtype = OPCLASS_ITEM_OPERATOR;
2775 | OPERATOR Iconst any_operator '(' oper_argtypes ')' opt_recheck
2777 CreateOpClassItem *n = makeNode(CreateOpClassItem);
2778 n->itemtype = OPCLASS_ITEM_OPERATOR;
2785 | FUNCTION Iconst func_name func_args
2787 CreateOpClassItem *n = makeNode(CreateOpClassItem);
2788 n->itemtype = OPCLASS_ITEM_FUNCTION;
2790 n->args = extractArgTypes($4);
2796 CreateOpClassItem *n = makeNode(CreateOpClassItem);
2797 n->itemtype = OPCLASS_ITEM_STORAGETYPE;
2803 opt_default: DEFAULT { $$ = TRUE; }
2804 | /*EMPTY*/ { $$ = FALSE; }
2807 opt_recheck: RECHECK { $$ = TRUE; }
2808 | /*EMPTY*/ { $$ = FALSE; }
2813 DROP OPERATOR CLASS any_name USING access_method opt_drop_behavior
2815 RemoveOpClassStmt *n = makeNode(RemoveOpClassStmt);
2816 n->opclassname = $4;
2823 /*****************************************************************************
2827 * DROP OWNED BY username [, username ...] [ RESTRICT | CASCADE ]
2828 * REASSIGN OWNED BY username [, username ...] TO username
2830 *****************************************************************************/
2832 DROP OWNED BY name_list opt_drop_behavior
2834 DropOwnedStmt *n = makeNode(DropOwnedStmt);
2842 REASSIGN OWNED BY name_list TO name
2844 ReassignOwnedStmt *n = makeNode(ReassignOwnedStmt);
2851 /*****************************************************************************
2855 * DROP itemtype [ IF EXISTS ] itemname [, itemname ...]
2856 * [ RESTRICT | CASCADE ]
2858 *****************************************************************************/
2860 DropStmt: DROP drop_type IF_P EXISTS any_name_list opt_drop_behavior
2862 DropStmt *n = makeNode(DropStmt);
2864 n->missing_ok = TRUE;
2869 | DROP drop_type any_name_list opt_drop_behavior
2871 DropStmt *n = makeNode(DropStmt);
2873 n->missing_ok = FALSE;
2881 drop_type: TABLE { $$ = OBJECT_TABLE; }
2882 | SEQUENCE { $$ = OBJECT_SEQUENCE; }
2883 | VIEW { $$ = OBJECT_VIEW; }
2884 | INDEX { $$ = OBJECT_INDEX; }
2885 | TYPE_P { $$ = OBJECT_TYPE; }
2886 | DOMAIN_P { $$ = OBJECT_DOMAIN; }
2887 | CONVERSION_P { $$ = OBJECT_CONVERSION; }
2888 | SCHEMA { $$ = OBJECT_SCHEMA; }
2892 any_name { $$ = list_make1($1); }
2893 | any_name_list ',' any_name { $$ = lappend($1, $3); }
2896 any_name: ColId { $$ = list_make1(makeString($1)); }
2897 | ColId attrs { $$ = lcons(makeString($1), $2); }
2900 attrs: '.' attr_name
2901 { $$ = list_make1(makeString($2)); }
2902 | attrs '.' attr_name
2903 { $$ = lappend($1, makeString($3)); }
2907 /*****************************************************************************
2910 * truncate table relname1, relname2, ...
2912 *****************************************************************************/
2915 TRUNCATE opt_table qualified_name_list
2917 TruncateStmt *n = makeNode(TruncateStmt);
2923 /*****************************************************************************
2925 * The COMMENT ON statement can take different forms based upon the type of
2926 * the object associated with the comment. The form of the statement is:
2928 * COMMENT ON [ [ DATABASE | DOMAIN | INDEX | SEQUENCE | TABLE | TYPE | VIEW |
2929 * CONVERSION | LANGUAGE | OPERATOR CLASS | LARGE OBJECT |
2930 * CAST ] <objname> |
2931 * AGGREGATE <aggname> (<aggtype>) |
2932 * FUNCTION <funcname> (arg1, arg2, ...) |
2933 * OPERATOR <op> (leftoperand_typ, rightoperand_typ) |
2934 * TRIGGER <triggername> ON <relname> |
2935 * RULE <rulename> ON <relname> ]
2938 *****************************************************************************/
2941 COMMENT ON comment_type any_name IS comment_text
2943 CommentStmt *n = makeNode(CommentStmt);
2950 | COMMENT ON AGGREGATE func_name '(' aggr_argtype ')'
2953 CommentStmt *n = makeNode(CommentStmt);
2954 n->objtype = OBJECT_AGGREGATE;
2956 n->objargs = list_make1($6);
2960 | COMMENT ON FUNCTION func_name func_args IS comment_text
2962 CommentStmt *n = makeNode(CommentStmt);
2963 n->objtype = OBJECT_FUNCTION;
2965 n->objargs = extractArgTypes($5);
2969 | COMMENT ON OPERATOR any_operator '(' oper_argtypes ')'
2972 CommentStmt *n = makeNode(CommentStmt);
2973 n->objtype = OBJECT_OPERATOR;
2979 | COMMENT ON CONSTRAINT name ON any_name IS comment_text
2981 CommentStmt *n = makeNode(CommentStmt);
2982 n->objtype = OBJECT_CONSTRAINT;
2983 n->objname = lappend($6, makeString($4));
2988 | COMMENT ON RULE name ON any_name IS comment_text
2990 CommentStmt *n = makeNode(CommentStmt);
2991 n->objtype = OBJECT_RULE;
2992 n->objname = lappend($6, makeString($4));
2997 | COMMENT ON RULE name IS comment_text
2999 /* Obsolete syntax supported for awhile for compatibility */
3000 CommentStmt *n = makeNode(CommentStmt);
3001 n->objtype = OBJECT_RULE;
3002 n->objname = list_make1(makeString($4));
3007 | COMMENT ON TRIGGER name ON any_name IS comment_text
3009 CommentStmt *n = makeNode(CommentStmt);
3010 n->objtype = OBJECT_TRIGGER;
3011 n->objname = lappend($6, makeString($4));
3016 | COMMENT ON OPERATOR CLASS any_name USING access_method IS comment_text
3018 CommentStmt *n = makeNode(CommentStmt);
3019 n->objtype = OBJECT_OPCLASS;
3021 n->objargs = list_make1(makeString($7));
3025 | COMMENT ON LARGE_P OBJECT_P NumericOnly IS comment_text
3027 CommentStmt *n = makeNode(CommentStmt);
3028 n->objtype = OBJECT_LARGEOBJECT;
3029 n->objname = list_make1($5);
3034 | COMMENT ON CAST '(' Typename AS Typename ')' IS comment_text
3036 CommentStmt *n = makeNode(CommentStmt);
3037 n->objtype = OBJECT_CAST;
3038 n->objname = list_make1($5);
3039 n->objargs = list_make1($7);
3043 | COMMENT ON opt_procedural LANGUAGE any_name IS comment_text
3045 CommentStmt *n = makeNode(CommentStmt);
3046 n->objtype = OBJECT_LANGUAGE;
3055 COLUMN { $$ = OBJECT_COLUMN; }
3056 | DATABASE { $$ = OBJECT_DATABASE; }
3057 | SCHEMA { $$ = OBJECT_SCHEMA; }
3058 | INDEX { $$ = OBJECT_INDEX; }
3059 | SEQUENCE { $$ = OBJECT_SEQUENCE; }
3060 | TABLE { $$ = OBJECT_TABLE; }
3061 | DOMAIN_P { $$ = OBJECT_TYPE; }
3062 | TYPE_P { $$ = OBJECT_TYPE; }
3063 | VIEW { $$ = OBJECT_VIEW; }
3064 | CONVERSION_P { $$ = OBJECT_CONVERSION; }
3069 | NULL_P { $$ = NULL; }
3072 /*****************************************************************************
3077 *****************************************************************************/
3079 FetchStmt: FETCH fetch_direction from_in name
3081 FetchStmt *n = (FetchStmt *) $2;
3088 FetchStmt *n = makeNode(FetchStmt);
3089 n->direction = FETCH_FORWARD;
3095 | MOVE fetch_direction from_in name
3097 FetchStmt *n = (FetchStmt *) $2;
3104 FetchStmt *n = makeNode(FetchStmt);
3105 n->direction = FETCH_FORWARD;
3116 FetchStmt *n = makeNode(FetchStmt);
3117 n->direction = FETCH_FORWARD;
3123 FetchStmt *n = makeNode(FetchStmt);
3124 n->direction = FETCH_FORWARD;
3130 FetchStmt *n = makeNode(FetchStmt);
3131 n->direction = FETCH_BACKWARD;
3137 FetchStmt *n = makeNode(FetchStmt);
3138 n->direction = FETCH_ABSOLUTE;
3144 FetchStmt *n = makeNode(FetchStmt);
3145 n->direction = FETCH_ABSOLUTE;
3149 | ABSOLUTE_P SignedIconst
3151 FetchStmt *n = makeNode(FetchStmt);
3152 n->direction = FETCH_ABSOLUTE;
3156 | RELATIVE_P SignedIconst
3158 FetchStmt *n = makeNode(FetchStmt);
3159 n->direction = FETCH_RELATIVE;
3165 FetchStmt *n = makeNode(FetchStmt);
3166 n->direction = FETCH_FORWARD;
3172 FetchStmt *n = makeNode(FetchStmt);
3173 n->direction = FETCH_FORWARD;
3174 n->howMany = FETCH_ALL;
3179 FetchStmt *n = makeNode(FetchStmt);
3180 n->direction = FETCH_FORWARD;
3184 | FORWARD SignedIconst
3186 FetchStmt *n = makeNode(FetchStmt);
3187 n->direction = FETCH_FORWARD;
3193 FetchStmt *n = makeNode(FetchStmt);
3194 n->direction = FETCH_FORWARD;
3195 n->howMany = FETCH_ALL;
3200 FetchStmt *n = makeNode(FetchStmt);
3201 n->direction = FETCH_BACKWARD;
3205 | BACKWARD SignedIconst
3207 FetchStmt *n = makeNode(FetchStmt);
3208 n->direction = FETCH_BACKWARD;
3214 FetchStmt *n = makeNode(FetchStmt);
3215 n->direction = FETCH_BACKWARD;
3216 n->howMany = FETCH_ALL;
3226 /*****************************************************************************
3228 * GRANT and REVOKE statements
3230 *****************************************************************************/
3232 GrantStmt: GRANT privileges ON privilege_target TO grantee_list
3233 opt_grant_grant_option
3235 GrantStmt *n = makeNode(GrantStmt);
3238 n->objtype = ($4)->objtype;
3239 n->objects = ($4)->objs;
3241 n->grant_option = $7;
3247 REVOKE privileges ON privilege_target
3248 FROM grantee_list opt_drop_behavior
3250 GrantStmt *n = makeNode(GrantStmt);
3251 n->is_grant = false;
3252 n->grant_option = false;
3254 n->objtype = ($4)->objtype;
3255 n->objects = ($4)->objs;
3260 | REVOKE GRANT OPTION FOR privileges ON privilege_target
3261 FROM grantee_list opt_drop_behavior
3263 GrantStmt *n = makeNode(GrantStmt);
3264 n->is_grant = false;
3265 n->grant_option = true;
3267 n->objtype = ($7)->objtype;
3268 n->objects = ($7)->objs;
3277 * A privilege list is represented as a list of strings; the validity of
3278 * the privilege names gets checked at execution. This is a bit annoying
3279 * but we have little choice because of the syntactic conflict with lists
3280 * of role names in GRANT/REVOKE. What's more, we have to call out in
3281 * the "privilege" production any reserved keywords that need to be usable
3282 * as privilege names.
3285 /* either ALL [PRIVILEGES] or a list of individual privileges */
3286 privileges: privilege_list
3294 privilege_list: privilege
3295 { $$ = list_make1(makeString($1)); }
3296 | privilege_list ',' privilege
3297 { $$ = lappend($1, makeString($3)); }
3300 privilege: SELECT { $$ = pstrdup($1); }
3301 | REFERENCES { $$ = pstrdup($1); }
3302 | CREATE { $$ = pstrdup($1); }
3303 | ColId { $$ = $1; }
3307 /* Don't bother trying to fold the first two rules into one using
3308 * opt_table. You're going to get conflicts.
3313 PrivTarget *n = makeNode(PrivTarget);
3314 n->objtype = ACL_OBJECT_RELATION;
3318 | TABLE qualified_name_list
3320 PrivTarget *n = makeNode(PrivTarget);
3321 n->objtype = ACL_OBJECT_RELATION;
3325 | FUNCTION function_with_argtypes_list
3327 PrivTarget *n = makeNode(PrivTarget);
3328 n->objtype = ACL_OBJECT_FUNCTION;
3332 | DATABASE name_list
3334 PrivTarget *n = makeNode(PrivTarget);
3335 n->objtype = ACL_OBJECT_DATABASE;
3339 | LANGUAGE name_list
3341 PrivTarget *n = makeNode(PrivTarget);
3342 n->objtype = ACL_OBJECT_LANGUAGE;
3348 PrivTarget *n = makeNode(PrivTarget);
3349 n->objtype = ACL_OBJECT_NAMESPACE;
3353 | TABLESPACE name_list
3355 PrivTarget *n = makeNode(PrivTarget);
3356 n->objtype = ACL_OBJECT_TABLESPACE;
3364 grantee { $$ = list_make1($1); }
3365 | grantee_list ',' grantee { $$ = lappend($1, $3); }
3370 PrivGrantee *n = makeNode(PrivGrantee);
3371 /* This hack lets us avoid reserving PUBLIC as a keyword*/
3372 if (strcmp($1, "public") == 0)
3380 PrivGrantee *n = makeNode(PrivGrantee);
3381 /* Treat GROUP PUBLIC as a synonym for PUBLIC */
3382 if (strcmp($2, "public") == 0)
3391 opt_grant_grant_option:
3392 WITH GRANT OPTION { $$ = TRUE; }
3393 | /*EMPTY*/ { $$ = FALSE; }
3396 function_with_argtypes_list:
3397 function_with_argtypes { $$ = list_make1($1); }
3398 | function_with_argtypes_list ',' function_with_argtypes
3399 { $$ = lappend($1, $3); }
3402 function_with_argtypes:
3405 FuncWithArgs *n = makeNode(FuncWithArgs);
3407 n->funcargs = extractArgTypes($2);
3412 /*****************************************************************************
3414 * GRANT and REVOKE ROLE statements
3416 *****************************************************************************/
3419 GRANT privilege_list TO name_list opt_grant_admin_option opt_granted_by
3421 GrantRoleStmt *n = makeNode(GrantRoleStmt);
3423 n->granted_roles = $2;
3424 n->grantee_roles = $4;
3432 REVOKE privilege_list FROM name_list opt_granted_by opt_drop_behavior
3434 GrantRoleStmt *n = makeNode(GrantRoleStmt);
3435 n->is_grant = false;
3436 n->admin_opt = false;
3437 n->granted_roles = $2;
3438 n->grantee_roles = $4;
3442 | REVOKE ADMIN OPTION FOR privilege_list FROM name_list opt_granted_by opt_drop_behavior
3444 GrantRoleStmt *n = makeNode(GrantRoleStmt);
3445 n->is_grant = false;
3446 n->admin_opt = true;
3447 n->granted_roles = $5;
3448 n->grantee_roles = $7;
3454 opt_grant_admin_option: WITH ADMIN OPTION { $$ = TRUE; }
3455 | /*EMPTY*/ { $$ = FALSE; }
3458 opt_granted_by: GRANTED BY RoleId { $$ = $3; }
3459 | /*EMPTY*/ { $$ = NULL; }
3463 /*****************************************************************************
3466 * create index <indexname> on <relname>
3467 * [ using <access> ] "(" ( <col> [ using <opclass> ] )+ ")"
3468 * [ tablespace <tablespacename> ] [ where <predicate> ]
3470 * Note: we cannot put TABLESPACE clause after WHERE clause unless we are
3471 * willing to make TABLESPACE a fully reserved word.
3472 *****************************************************************************/
3474 IndexStmt: CREATE index_opt_unique INDEX index_name ON qualified_name
3475 access_method_clause '(' index_params ')' OptTableSpace where_clause
3477 IndexStmt *n = makeNode(IndexStmt);
3481 n->accessMethod = $7;
3482 n->indexParams = $9;
3483 n->tableSpace = $11;
3484 n->whereClause = $12;
3490 UNIQUE { $$ = TRUE; }
3491 | /*EMPTY*/ { $$ = FALSE; }
3494 access_method_clause:
3495 USING access_method { $$ = $2; }
3496 | /*EMPTY*/ { $$ = DEFAULT_INDEX_TYPE; }
3499 index_params: index_elem { $$ = list_make1($1); }
3500 | index_params ',' index_elem { $$ = lappend($1, $3); }
3504 * Index attributes can be either simple column references, or arbitrary
3505 * expressions in parens. For backwards-compatibility reasons, we allow
3506 * an expression that's just a function call to be written without parens.
3508 index_elem: ColId opt_class
3510 $$ = makeNode(IndexElem);
3515 | func_expr opt_class
3517 $$ = makeNode(IndexElem);
3522 | '(' a_expr ')' opt_class
3524 $$ = makeNode(IndexElem);
3531 opt_class: any_name { $$ = $1; }
3532 | USING any_name { $$ = $2; }
3533 | /*EMPTY*/ { $$ = NIL; }
3536 /*****************************************************************************
3539 * create [or replace] function <fname>
3540 * [(<type-1> { , <type-n>})]
3542 * as <filename or code in language as appropriate>
3543 * language <lang> [with parameters]
3545 *****************************************************************************/
3548 CREATE opt_or_replace FUNCTION func_name func_args
3549 RETURNS func_return createfunc_opt_list opt_definition
3551 CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
3560 | CREATE opt_or_replace FUNCTION func_name func_args
3561 createfunc_opt_list opt_definition
3563 CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
3567 n->returnType = NULL;
3575 OR REPLACE { $$ = TRUE; }
3576 | /*EMPTY*/ { $$ = FALSE; }
3579 func_args: '(' func_args_list ')' { $$ = $2; }
3580 | '(' ')' { $$ = NIL; }
3584 func_arg { $$ = list_make1($1); }
3585 | func_args_list ',' func_arg { $$ = lappend($1, $3); }
3589 * The style with arg_class first is SQL99 standard, but Oracle puts
3590 * param_name first; accept both since it's likely people will try both
3591 * anyway. Don't bother trying to save productions by letting arg_class
3592 * have an empty alternative ... you'll get shift/reduce conflicts.
3594 * We can catch over-specified arguments here if we want to,
3595 * but for now better to silently swallow typmod, etc.
3596 * - thomas 2000-03-22
3599 arg_class param_name func_type
3601 FunctionParameter *n = makeNode(FunctionParameter);
3607 | param_name arg_class func_type
3609 FunctionParameter *n = makeNode(FunctionParameter);
3615 | param_name func_type
3617 FunctionParameter *n = makeNode(FunctionParameter);
3620 n->mode = FUNC_PARAM_IN;
3623 | arg_class func_type
3625 FunctionParameter *n = makeNode(FunctionParameter);
3633 FunctionParameter *n = makeNode(FunctionParameter);
3636 n->mode = FUNC_PARAM_IN;
3641 /* INOUT is SQL99 standard, IN OUT is for Oracle compatibility */
3642 arg_class: IN_P { $$ = FUNC_PARAM_IN; }
3643 | OUT_P { $$ = FUNC_PARAM_OUT; }
3644 | INOUT { $$ = FUNC_PARAM_INOUT; }
3645 | IN_P OUT_P { $$ = FUNC_PARAM_INOUT; }
3649 * Ideally param_name should be ColId, but that causes too many conflicts.
3651 param_name: function_name
3657 /* We can catch over-specified results here if we want to,
3658 * but for now better to silently swallow typmod, etc.
3659 * - thomas 2000-03-22
3666 * We would like to make the second production here be ColId attrs etc,
3667 * but that causes reduce/reduce conflicts. type_name is next best choice.
3669 func_type: Typename { $$ = $1; }
3670 | type_name attrs '%' TYPE_P
3672 $$ = makeNode(TypeName);
3673 $$->names = lcons(makeString($1), $2);
3674 $$->pct_type = true;
3680 createfunc_opt_list:
3681 /* Must be at least one to prevent conflict */
3682 createfunc_opt_item { $$ = list_make1($1); }
3683 | createfunc_opt_list createfunc_opt_item { $$ = lappend($1, $2); }
3687 * Options common to both CREATE FUNCTION and ALTER FUNCTION
3689 common_func_opt_item:
3690 CALLED ON NULL_P INPUT_P
3692 $$ = makeDefElem("strict", (Node *)makeInteger(FALSE));
3694 | RETURNS NULL_P ON NULL_P INPUT_P
3696 $$ = makeDefElem("strict", (Node *)makeInteger(TRUE));
3700 $$ = makeDefElem("strict", (Node *)makeInteger(TRUE));
3704 $$ = makeDefElem("volatility", (Node *)makeString("immutable"));
3708 $$ = makeDefElem("volatility", (Node *)makeString("stable"));
3712 $$ = makeDefElem("volatility", (Node *)makeString("volatile"));
3714 | EXTERNAL SECURITY DEFINER
3716 $$ = makeDefElem("security", (Node *)makeInteger(TRUE));
3718 | EXTERNAL SECURITY INVOKER
3720 $$ = makeDefElem("security", (Node *)makeInteger(FALSE));
3724 $$ = makeDefElem("security", (Node *)makeInteger(TRUE));
3728 $$ = makeDefElem("security", (Node *)makeInteger(FALSE));
3732 createfunc_opt_item:
3735 $$ = makeDefElem("as", (Node *)$2);
3737 | LANGUAGE ColId_or_Sconst
3739 $$ = makeDefElem("language", (Node *)makeString($2));
3741 | common_func_opt_item
3747 func_as: Sconst { $$ = list_make1(makeString($1)); }
3750 $$ = list_make2(makeString($1), makeString($3));
3755 WITH definition { $$ = $2; }
3756 | /*EMPTY*/ { $$ = NIL; }
3759 /*****************************************************************************
3762 * RENAME and OWNER subcommands are already provided by the generic
3763 * ALTER infrastructure, here we just specify alterations that can
3764 * only be applied to functions.
3766 *****************************************************************************/
3768 ALTER FUNCTION function_with_argtypes alterfunc_opt_list opt_restrict
3770 AlterFunctionStmt *n = makeNode(AlterFunctionStmt);
3778 /* At least one option must be specified */
3779 common_func_opt_item { $$ = list_make1($1); }
3780 | alterfunc_opt_list common_func_opt_item { $$ = lappend($1, $2); }
3783 /* Ignored, merely for SQL compliance */
3790 /*****************************************************************************
3794 * DROP FUNCTION funcname (arg1, arg2, ...) [ RESTRICT | CASCADE ]
3795 * DROP AGGREGATE aggname (aggtype) [ RESTRICT | CASCADE ]
3796 * DROP OPERATOR opname (leftoperand_typ, rightoperand_typ) [ RESTRICT | CASCADE ]
3798 *****************************************************************************/
3801 DROP FUNCTION func_name func_args opt_drop_behavior
3803 RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
3805 n->args = extractArgTypes($4);
3812 DROP AGGREGATE func_name '(' aggr_argtype ')' opt_drop_behavior
3814 RemoveAggrStmt *n = makeNode(RemoveAggrStmt);
3823 Typename { $$ = $1; }
3824 | '*' { $$ = NULL; }
3828 DROP OPERATOR any_operator '(' oper_argtypes ')' opt_drop_behavior
3830 RemoveOperStmt *n = makeNode(RemoveOperStmt);
3842 (errcode(ERRCODE_SYNTAX_ERROR),
3843 errmsg("missing argument"),
3844 errhint("Use NONE to denote the missing argument of a unary operator.")));
3846 | Typename ',' Typename
3847 { $$ = list_make2($1, $3); }
3848 | NONE ',' Typename /* left unary */
3849 { $$ = list_make2(NULL, $3); }
3850 | Typename ',' NONE /* right unary */
3851 { $$ = list_make2($1, NULL); }
3856 { $$ = list_make1(makeString($1)); }
3857 | ColId '.' any_operator
3858 { $$ = lcons(makeString($1), $3); }
3862 /*****************************************************************************
3864 * CREATE CAST / DROP CAST
3866 *****************************************************************************/
3868 CreateCastStmt: CREATE CAST '(' Typename AS Typename ')'
3869 WITH FUNCTION function_with_argtypes cast_context
3871 CreateCastStmt *n = makeNode(CreateCastStmt);
3875 n->context = (CoercionContext) $11;
3878 | CREATE CAST '(' Typename AS Typename ')'
3879 WITHOUT FUNCTION cast_context
3881 CreateCastStmt *n = makeNode(CreateCastStmt);
3885 n->context = (CoercionContext) $10;
3890 cast_context: AS IMPLICIT_P { $$ = COERCION_IMPLICIT; }
3891 | AS ASSIGNMENT { $$ = COERCION_ASSIGNMENT; }
3892 | /*EMPTY*/ { $$ = COERCION_EXPLICIT; }
3896 DropCastStmt: DROP CAST '(' Typename AS Typename ')' opt_drop_behavior
3898 DropCastStmt *n = makeNode(DropCastStmt);
3908 /*****************************************************************************
3912 * REINDEX type <name> [FORCE]
3914 * FORCE no longer does anything, but we accept it for backwards compatibility
3915 *****************************************************************************/
3918 REINDEX reindex_type qualified_name opt_force
3920 ReindexStmt *n = makeNode(ReindexStmt);
3926 | REINDEX SYSTEM_P name opt_force
3928 ReindexStmt *n = makeNode(ReindexStmt);
3929 n->kind = OBJECT_DATABASE;
3932 n->do_system = true;
3936 | REINDEX DATABASE name opt_force
3938 ReindexStmt *n = makeNode(ReindexStmt);
3939 n->kind = OBJECT_DATABASE;
3942 n->do_system = true;
3949 INDEX { $$ = OBJECT_INDEX; }
3950 | TABLE { $$ = OBJECT_TABLE; }
3953 opt_force: FORCE { $$ = TRUE; }
3954 | /* EMPTY */ { $$ = FALSE; }
3958 /*****************************************************************************
3960 * ALTER THING name RENAME TO newname
3962 *****************************************************************************/
3964 RenameStmt: ALTER AGGREGATE func_name '(' aggr_argtype ')' RENAME TO name
3966 RenameStmt *n = makeNode(RenameStmt);
3967 n->renameType = OBJECT_AGGREGATE;
3969 n->objarg = list_make1($5);
3973 | ALTER CONVERSION_P any_name RENAME TO name
3975 RenameStmt *n = makeNode(RenameStmt);
3976 n->renameType = OBJECT_CONVERSION;
3981 | ALTER DATABASE database_name RENAME TO database_name
3983 RenameStmt *n = makeNode(RenameStmt);
3984 n->renameType = OBJECT_DATABASE;
3989 | ALTER FUNCTION func_name func_args RENAME TO name
3991 RenameStmt *n = makeNode(RenameStmt);
3992 n->renameType = OBJECT_FUNCTION;
3994 n->objarg = extractArgTypes($4);
3998 | ALTER GROUP_P RoleId RENAME TO RoleId
4000 RenameStmt *n = makeNode(RenameStmt);
4001 n->renameType = OBJECT_ROLE;
4006 | ALTER LANGUAGE name RENAME TO name
4008 RenameStmt *n = makeNode(RenameStmt);
4009 n->renameType = OBJECT_LANGUAGE;
4014 | ALTER OPERATOR CLASS any_name USING access_method RENAME TO name
4016 RenameStmt *n = makeNode(RenameStmt);
4017 n->renameType = OBJECT_OPCLASS;
4023 | ALTER SCHEMA name RENAME TO name
4025 RenameStmt *n = makeNode(RenameStmt);
4026 n->renameType = OBJECT_SCHEMA;
4031 | ALTER TABLE relation_expr RENAME TO name
4033 RenameStmt *n = makeNode(RenameStmt);
4034 n->renameType = OBJECT_TABLE;
4040 | ALTER INDEX relation_expr RENAME TO name
4042 RenameStmt *n = makeNode(RenameStmt);
4043 n->renameType = OBJECT_INDEX;
4049 | ALTER TABLE relation_expr RENAME opt_column name TO name
4051 RenameStmt *n = makeNode(RenameStmt);
4052 n->renameType = OBJECT_COLUMN;
4058 | ALTER TRIGGER name ON relation_expr RENAME TO name
4060 RenameStmt *n = makeNode(RenameStmt);
4061 n->renameType = OBJECT_TRIGGER;
4067 | ALTER ROLE RoleId RENAME TO RoleId
4069 RenameStmt *n = makeNode(RenameStmt);
4070 n->renameType = OBJECT_ROLE;
4075 | ALTER USER RoleId RENAME TO RoleId
4077 RenameStmt *n = makeNode(RenameStmt);
4078 n->renameType = OBJECT_ROLE;
4083 | ALTER TABLESPACE name RENAME TO name
4085 RenameStmt *n = makeNode(RenameStmt);
4086 n->renameType = OBJECT_TABLESPACE;
4093 opt_column: COLUMN { $$ = COLUMN; }
4094 | /*EMPTY*/ { $$ = 0; }
4097 /*****************************************************************************
4099 * ALTER THING name SET SCHEMA name
4101 *****************************************************************************/
4103 AlterObjectSchemaStmt:
4104 ALTER AGGREGATE func_name '(' aggr_argtype ')' SET SCHEMA name
4106 AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
4107 n->objectType = OBJECT_AGGREGATE;
4109 n->objarg = list_make1($5);
4113 | ALTER DOMAIN_P any_name SET SCHEMA name
4115 AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
4116 n->objectType = OBJECT_DOMAIN;
4121 | ALTER FUNCTION func_name func_args SET SCHEMA name
4123 AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
4124 n->objectType = OBJECT_FUNCTION;
4126 n->objarg = extractArgTypes($4);
4130 | ALTER SEQUENCE relation_expr SET SCHEMA name
4132 AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
4133 n->objectType = OBJECT_SEQUENCE;
4138 | ALTER TABLE relation_expr SET SCHEMA name
4140 AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
4141 n->objectType = OBJECT_TABLE;
4146 | ALTER TYPE_P any_name SET SCHEMA name
4148 AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
4149 n->objectType = OBJECT_TYPE;
4156 /*****************************************************************************
4158 * ALTER THING name OWNER TO newname
4160 *****************************************************************************/
4162 AlterOwnerStmt: ALTER AGGREGATE func_name '(' aggr_argtype ')' OWNER TO RoleId
4164 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4165 n->objectType = OBJECT_AGGREGATE;
4167 n->objarg = list_make1($5);
4171 | ALTER CONVERSION_P any_name OWNER TO RoleId
4173 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4174 n->objectType = OBJECT_CONVERSION;
4179 | ALTER DATABASE database_name OWNER TO RoleId
4181 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4182 n->objectType = OBJECT_DATABASE;
4183 n->object = list_make1($3);
4187 | ALTER DOMAIN_P any_name OWNER TO RoleId
4189 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4190 n->objectType = OBJECT_DOMAIN;
4195 | ALTER FUNCTION func_name func_args OWNER TO RoleId
4197 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4198 n->objectType = OBJECT_FUNCTION;
4200 n->objarg = extractArgTypes($4);
4204 | ALTER OPERATOR any_operator '(' oper_argtypes ')' OWNER TO RoleId
4206 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4207 n->objectType = OBJECT_OPERATOR;
4213 | ALTER OPERATOR CLASS any_name USING access_method OWNER TO RoleId
4215 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4216 n->objectType = OBJECT_OPCLASS;
4222 | ALTER SCHEMA name OWNER TO RoleId
4224 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4225 n->objectType = OBJECT_SCHEMA;
4226 n->object = list_make1($3);
4230 | ALTER TYPE_P any_name OWNER TO RoleId
4232 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4233 n->objectType = OBJECT_TYPE;
4238 | ALTER TABLESPACE name OWNER TO RoleId
4240 AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
4241 n->objectType = OBJECT_TABLESPACE;
4242 n->object = list_make1($3);
4249 /*****************************************************************************
4251 * QUERY: Define Rewrite Rule
4253 *****************************************************************************/
4255 RuleStmt: CREATE opt_or_replace RULE name AS
4256 { QueryIsRule=TRUE; }
4257 ON event TO qualified_name where_clause
4258 DO opt_instead RuleActionList
4260 RuleStmt *n = makeNode(RuleStmt);
4264 n->whereClause = $11;
4274 NOTHING { $$ = NIL; }
4275 | RuleActionStmt { $$ = list_make1($1); }
4276 | '(' RuleActionMulti ')' { $$ = $2; }
4279 /* the thrashing around here is to discard "empty" statements... */
4281 RuleActionMulti ';' RuleActionStmtOrEmpty
4283 $$ = lappend($1, $3);
4287 | RuleActionStmtOrEmpty
4289 $$ = list_make1($1);
4303 RuleActionStmtOrEmpty:
4304 RuleActionStmt { $$ = $1; }
4305 | /*EMPTY*/ { $$ = NULL; }
4308 /* change me to select, update, etc. some day */
4309 event: SELECT { $$ = CMD_SELECT; }
4310 | UPDATE { $$ = CMD_UPDATE; }
4311 | DELETE_P { $$ = CMD_DELETE; }
4312 | INSERT { $$ = CMD_INSERT; }
4316 INSTEAD { $$ = TRUE; }
4317 | ALSO { $$ = FALSE; }
4318 | /*EMPTY*/ { $$ = FALSE; }
4323 DROP RULE name ON qualified_name opt_drop_behavior
4325 DropPropertyStmt *n = makeNode(DropPropertyStmt);
4329 n->removeType = OBJECT_RULE;
4335 /*****************************************************************************
4338 * NOTIFY <qualified_name> can appear both in rule bodies and
4339 * as a query-level command
4341 *****************************************************************************/
4343 NotifyStmt: NOTIFY qualified_name
4345 NotifyStmt *n = makeNode(NotifyStmt);
4351 ListenStmt: LISTEN qualified_name
4353 ListenStmt *n = makeNode(ListenStmt);
4360 UNLISTEN qualified_name
4362 UnlistenStmt *n = makeNode(UnlistenStmt);
4368 UnlistenStmt *n = makeNode(UnlistenStmt);
4369 n->relation = makeNode(RangeVar);
4370 n->relation->relname = "*";
4371 n->relation->schemaname = NULL;
4377 /*****************************************************************************
4381 * BEGIN / COMMIT / ROLLBACK
4382 * (also older versions END / ABORT)
4384 *****************************************************************************/
4387 ABORT_P opt_transaction
4389 TransactionStmt *n = makeNode(TransactionStmt);
4390 n->kind = TRANS_STMT_ROLLBACK;
4394 | BEGIN_P opt_transaction transaction_mode_list_or_empty
4396 TransactionStmt *n = makeNode(TransactionStmt);
4397 n->kind = TRANS_STMT_BEGIN;
4401 | START TRANSACTION transaction_mode_list_or_empty
4403 TransactionStmt *n = makeNode(TransactionStmt);
4404 n->kind = TRANS_STMT_START;
4408 | COMMIT opt_transaction
4410 TransactionStmt *n = makeNode(TransactionStmt);
4411 n->kind = TRANS_STMT_COMMIT;
4415 | END_P opt_transaction
4417 TransactionStmt *n = makeNode(TransactionStmt);
4418 n->kind = TRANS_STMT_COMMIT;
4422 | ROLLBACK opt_transaction
4424 TransactionStmt *n = makeNode(TransactionStmt);
4425 n->kind = TRANS_STMT_ROLLBACK;
4431 TransactionStmt *n = makeNode(TransactionStmt);
4432 n->kind = TRANS_STMT_SAVEPOINT;
4433 n->options = list_make1(makeDefElem("savepoint_name",
4434 (Node *)makeString($2)));
4437 | RELEASE SAVEPOINT ColId
4439 TransactionStmt *n = makeNode(TransactionStmt);
4440 n->kind = TRANS_STMT_RELEASE;
4441 n->options = list_make1(makeDefElem("savepoint_name",
4442 (Node *)makeString($3)));
4447 TransactionStmt *n = makeNode(TransactionStmt);
4448 n->kind = TRANS_STMT_RELEASE;
4449 n->options = list_make1(makeDefElem("savepoint_name",
4450 (Node *)makeString($2)));
4453 | ROLLBACK opt_transaction TO SAVEPOINT ColId
4455 TransactionStmt *n = makeNode(TransactionStmt);
4456 n->kind = TRANS_STMT_ROLLBACK_TO;
4457 n->options = list_make1(makeDefElem("savepoint_name",
4458 (Node *)makeString($5)));
4461 | ROLLBACK opt_transaction TO ColId
4463 TransactionStmt *n = makeNode(TransactionStmt);
4464 n->kind = TRANS_STMT_ROLLBACK_TO;
4465 n->options = list_make1(makeDefElem("savepoint_name",
4466 (Node *)makeString($4)));
4469 | PREPARE TRANSACTION Sconst
4471 TransactionStmt *n = makeNode(TransactionStmt);
4472 n->kind = TRANS_STMT_PREPARE;
4476 | COMMIT PREPARED Sconst
4478 TransactionStmt *n = makeNode(TransactionStmt);
4479 n->kind = TRANS_STMT_COMMIT_PREPARED;
4483 | ROLLBACK PREPARED Sconst
4485 TransactionStmt *n = makeNode(TransactionStmt);
4486 n->kind = TRANS_STMT_ROLLBACK_PREPARED;
4492 opt_transaction: WORK {}
4497 transaction_mode_item:
4498 ISOLATION LEVEL iso_level
4499 { $$ = makeDefElem("transaction_isolation",
4500 makeStringConst($3, NULL)); }
4502 { $$ = makeDefElem("transaction_read_only",
4503 makeIntConst(TRUE)); }
4505 { $$ = makeDefElem("transaction_read_only",
4506 makeIntConst(FALSE)); }
4509 /* Syntax with commas is SQL-spec, without commas is Postgres historical */
4510 transaction_mode_list:
4511 transaction_mode_item
4512 { $$ = list_make1($1); }
4513 | transaction_mode_list ',' transaction_mode_item
4514 { $$ = lappend($1, $3); }
4515 | transaction_mode_list transaction_mode_item
4516 { $$ = lappend($1, $2); }
4519 transaction_mode_list_or_empty:
4520 transaction_mode_list
4526 /*****************************************************************************
4529 * CREATE [ OR REPLACE ] [ TEMP ] VIEW <viewname> '('target-list ')' AS <query>
4531 *****************************************************************************/
4533 ViewStmt: CREATE OptTemp VIEW qualified_name opt_column_list
4536 ViewStmt *n = makeNode(ViewStmt);
4539 n->view->istemp = $2;
4541 n->query = (Query *) $7;
4544 | CREATE OR REPLACE OptTemp VIEW qualified_name opt_column_list
4547 ViewStmt *n = makeNode(ViewStmt);
4550 n->view->istemp = $4;
4552 n->query = (Query *) $9;
4557 /*****************************************************************************
4562 *****************************************************************************/
4564 LoadStmt: LOAD file_name
4566 LoadStmt *n = makeNode(LoadStmt);
4573 /*****************************************************************************
4577 *****************************************************************************/
4580 CREATE DATABASE database_name opt_with createdb_opt_list
4582 CreatedbStmt *n = makeNode(CreatedbStmt);
4590 createdb_opt_list createdb_opt_item { $$ = lappend($1, $2); }
4591 | /* EMPTY */ { $$ = NIL; }
4595 TABLESPACE opt_equal name
4597 $$ = makeDefElem("tablespace", (Node *)makeString($3));
4599 | TABLESPACE opt_equal DEFAULT
4601 $$ = makeDefElem("tablespace", NULL);
4603 | LOCATION opt_equal Sconst
4605 $$ = makeDefElem("location", (Node *)makeString($3));
4607 | LOCATION opt_equal DEFAULT
4609 $$ = makeDefElem("location", NULL);
4611 | TEMPLATE opt_equal name
4613 $$ = makeDefElem("template", (Node *)makeString($3));
4615 | TEMPLATE opt_equal DEFAULT
4617 $$ = makeDefElem("template", NULL);
4619 | ENCODING opt_equal Sconst
4621 $$ = makeDefElem("encoding", (Node *)makeString($3));
4623 | ENCODING opt_equal Iconst
4625 $$ = makeDefElem("encoding", (Node *)makeInteger($3));
4627 | ENCODING opt_equal DEFAULT
4629 $$ = makeDefElem("encoding", NULL);
4631 | CONNECTION LIMIT opt_equal SignedIconst
4633 $$ = makeDefElem("connectionlimit", (Node *)makeInteger($4));
4635 | OWNER opt_equal name
4637 $$ = makeDefElem("owner", (Node *)makeString($3));
4639 | OWNER opt_equal DEFAULT
4641 $$ = makeDefElem("owner", NULL);
4646 * Though the equals sign doesn't match other WITH options, pg_dump uses
4647 * equals for backward compatibility, and it doesn't seem worth removing it.
4654 /*****************************************************************************
4658 *****************************************************************************/
4661 ALTER DATABASE database_name opt_with alterdb_opt_list
4663 AlterDatabaseStmt *n = makeNode(AlterDatabaseStmt);
4670 AlterDatabaseSetStmt:
4671 ALTER DATABASE database_name SET set_rest
4673 AlterDatabaseSetStmt *n = makeNode(AlterDatabaseSetStmt);
4675 n->variable = $5->name;
4676 n->value = $5->args;
4679 | ALTER DATABASE database_name VariableResetStmt
4681 AlterDatabaseSetStmt *n = makeNode(AlterDatabaseSetStmt);
4683 n->variable = ((VariableResetStmt *)$4)->name;
4691 alterdb_opt_list alterdb_opt_item { $$ = lappend($1, $2); }
4692 | /* EMPTY */ { $$ = NIL; }
4696 CONNECTION LIMIT opt_equal SignedIconst
4698 $$ = makeDefElem("connectionlimit", (Node *)makeInteger($4));
4703 /*****************************************************************************
4705 * DROP DATABASE [ IF EXISTS ]
4707 * This is implicitly CASCADE, no need for drop behavior
4708 *****************************************************************************/
4710 DropdbStmt: DROP DATABASE database_name
4712 DropdbStmt *n = makeNode(DropdbStmt);
4714 n->missing_ok = FALSE;
4717 | DROP DATABASE IF_P EXISTS database_name
4719 DropdbStmt *n = makeNode(DropdbStmt);
4721 n->missing_ok = TRUE;
4727 /*****************************************************************************
4729 * Manipulate a domain
4731 *****************************************************************************/
4734 CREATE DOMAIN_P any_name opt_as Typename ColQualList
4736 CreateDomainStmt *n = makeNode(CreateDomainStmt);
4739 n->constraints = $6;
4745 /* ALTER DOMAIN <domain> {SET DEFAULT <expr>|DROP DEFAULT} */
4746 ALTER DOMAIN_P any_name alter_column_default
4748 AlterDomainStmt *n = makeNode(AlterDomainStmt);
4754 /* ALTER DOMAIN <domain> DROP NOT NULL */
4755 | ALTER DOMAIN_P any_name DROP NOT NULL_P
4757 AlterDomainStmt *n = makeNode(AlterDomainStmt);
4762 /* ALTER DOMAIN <domain> SET NOT NULL */
4763 | ALTER DOMAIN_P any_name SET NOT NULL_P
4765 AlterDomainStmt *n = makeNode(AlterDomainStmt);
4770 /* ALTER DOMAIN <domain> ADD_P CONSTRAINT ... */
4771 | ALTER DOMAIN_P any_name ADD_P TableConstraint
4773 AlterDomainStmt *n = makeNode(AlterDomainStmt);
4779 /* ALTER DOMAIN <domain> DROP CONSTRAINT <name> [RESTRICT|CASCADE] */
4780 | ALTER DOMAIN_P any_name DROP CONSTRAINT name opt_drop_behavior
4782 AlterDomainStmt *n = makeNode(AlterDomainStmt);
4796 /*****************************************************************************
4798 * Manipulate a conversion
4800 * CREATE [DEFAULT] CONVERSION <conversion_name>
4801 * FOR <encoding_name> TO <encoding_name> FROM <func_name>
4803 *****************************************************************************/
4805 CreateConversionStmt:
4806 CREATE opt_default CONVERSION_P any_name FOR Sconst
4807 TO Sconst FROM any_name
4809 CreateConversionStmt *n = makeNode(CreateConversionStmt);
4810 n->conversion_name = $4;
4811 n->for_encoding_name = $6;
4812 n->to_encoding_name = $8;
4819 /*****************************************************************************
4822 * cluster <index_name> on <qualified_name>
4823 * cluster <qualified_name>
4826 *****************************************************************************/
4829 CLUSTER index_name ON qualified_name
4831 ClusterStmt *n = makeNode(ClusterStmt);
4836 | CLUSTER qualified_name
4838 ClusterStmt *n = makeNode(ClusterStmt);
4840 n->indexname = NULL;
4845 ClusterStmt *n = makeNode(ClusterStmt);
4847 n->indexname = NULL;
4852 /*****************************************************************************
4858 *****************************************************************************/
4860 VacuumStmt: VACUUM opt_full opt_freeze opt_verbose
4862 VacuumStmt *n = makeNode(VacuumStmt);
4872 | VACUUM opt_full opt_freeze opt_verbose qualified_name
4874 VacuumStmt *n = makeNode(VacuumStmt);
4884 | VACUUM opt_full opt_freeze opt_verbose AnalyzeStmt
4886 VacuumStmt *n = (VacuumStmt *) $5;
4896 analyze_keyword opt_verbose
4898 VacuumStmt *n = makeNode(VacuumStmt);
4908 | analyze_keyword opt_verbose qualified_name opt_name_list
4910 VacuumStmt *n = makeNode(VacuumStmt);
4924 | ANALYSE /* British */ {}
4928 VERBOSE { $$ = TRUE; }
4929 | /*EMPTY*/ { $$ = FALSE; }
4932 opt_full: FULL { $$ = TRUE; }
4933 | /*EMPTY*/ { $$ = FALSE; }
4936 opt_freeze: FREEZE { $$ = TRUE; }
4937 | /*EMPTY*/ { $$ = FALSE; }
4941 '(' name_list ')' { $$ = $2; }
4942 | /*EMPTY*/ { $$ = NIL; }
4946 /*****************************************************************************
4949 * EXPLAIN [ANALYZE] [VERBOSE] query
4951 *****************************************************************************/
4953 ExplainStmt: EXPLAIN opt_analyze opt_verbose ExplainableStmt
4955 ExplainStmt *n = makeNode(ExplainStmt);
4958 n->query = (Query*)$4;
4969 | ExecuteStmt /* by default all are $$=$1 */
4973 analyze_keyword { $$ = TRUE; }
4974 | /* EMPTY */ { $$ = FALSE; }
4977 /*****************************************************************************
4980 * PREPARE <plan_name> [(args, ...)] AS <query>
4982 *****************************************************************************/
4984 PrepareStmt: PREPARE name prep_type_clause AS PreparableStmt
4986 PrepareStmt *n = makeNode(PrepareStmt);
4989 n->query = (Query *) $5;
4994 prep_type_clause: '(' prep_type_list ')' { $$ = $2; }
4995 | /* EMPTY */ { $$ = NIL; }
4998 prep_type_list: Typename { $$ = list_make1($1); }
4999 | prep_type_list ',' Typename
5000 { $$ = lappend($1, $3); }
5007 | DeleteStmt /* by default all are $$=$1 */
5010 /*****************************************************************************
5012 * EXECUTE <plan_name> [(params, ...)]
5013 * CREATE TABLE <name> AS EXECUTE <plan_name> [(params, ...)]
5015 *****************************************************************************/
5017 ExecuteStmt: EXECUTE name execute_param_clause
5019 ExecuteStmt *n = makeNode(ExecuteStmt);
5025 | CREATE OptTemp TABLE qualified_name OptCreateAs AS EXECUTE name execute_param_clause
5027 ExecuteStmt *n = makeNode(ExecuteStmt);
5034 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5035 errmsg("column name list not allowed in CREATE TABLE / AS EXECUTE")));
5036 /* ... because it's not implemented, but it could be */
5041 execute_param_clause: '(' expr_list ')' { $$ = $2; }
5042 | /* EMPTY */ { $$ = NIL; }
5045 /*****************************************************************************
5048 * DEALLOCATE [PREPARE] <plan_name>
5050 *****************************************************************************/
5052 DeallocateStmt: DEALLOCATE name
5054 DeallocateStmt *n = makeNode(DeallocateStmt);
5058 | DEALLOCATE PREPARE name
5060 DeallocateStmt *n = makeNode(DeallocateStmt);
5066 /*****************************************************************************
5071 *****************************************************************************/
5074 INSERT INTO qualified_name insert_rest
5082 VALUES '(' insert_target_list ')'
5084 $$ = makeNode(InsertStmt);
5086 $$->targetList = $3;
5087 $$->selectStmt = NULL;
5091 $$ = makeNode(InsertStmt);
5093 $$->targetList = NIL;
5094 $$->selectStmt = NULL;
5098 $$ = makeNode(InsertStmt);
5100 $$->targetList = NIL;
5101 $$->selectStmt = $1;
5103 | '(' insert_column_list ')' VALUES '(' insert_target_list ')'
5105 $$ = makeNode(InsertStmt);
5107 $$->targetList = $6;
5108 $$->selectStmt = NULL;
5110 | '(' insert_column_list ')' SelectStmt
5112 $$ = makeNode(InsertStmt);
5114 $$->targetList = NIL;
5115 $$->selectStmt = $4;
5121 { $$ = list_make1($1); }
5122 | insert_column_list ',' insert_column_item
5123 { $$ = lappend($1, $3); }
5127 ColId opt_indirection
5129 $$ = makeNode(ResTarget);
5131 $$->indirection = $2;
5137 /*****************************************************************************
5142 *****************************************************************************/
5144 DeleteStmt: DELETE_P FROM relation_expr using_clause where_clause
5146 DeleteStmt *n = makeNode(DeleteStmt);
5148 n->usingClause = $4;
5149 n->whereClause = $5;
5155 USING from_list { $$ = $2; }
5156 | /*EMPTY*/ { $$ = NIL; }
5159 LockStmt: LOCK_P opt_table qualified_name_list opt_lock opt_nowait
5161 LockStmt *n = makeNode(LockStmt);
5170 opt_lock: IN_P lock_type MODE { $$ = $2; }
5171 | /*EMPTY*/ { $$ = AccessExclusiveLock; }
5174 lock_type: ACCESS SHARE { $$ = AccessShareLock; }
5175 | ROW SHARE { $$ = RowShareLock; }
5176 | ROW EXCLUSIVE { $$ = RowExclusiveLock; }
5177 | SHARE UPDATE EXCLUSIVE { $$ = ShareUpdateExclusiveLock; }
5178 | SHARE { $$ = ShareLock; }
5179 | SHARE ROW EXCLUSIVE { $$ = ShareRowExclusiveLock; }
5180 | EXCLUSIVE { $$ = ExclusiveLock; }
5181 | ACCESS EXCLUSIVE { $$ = AccessExclusiveLock; }
5184 opt_nowait: NOWAIT { $$ = TRUE; }
5185 | /*EMPTY*/ { $$ = FALSE; }
5189 /*****************************************************************************
5192 * UpdateStmt (UPDATE)
5194 *****************************************************************************/
5196 UpdateStmt: UPDATE relation_expr
5197 SET update_target_list
5201 UpdateStmt *n = makeNode(UpdateStmt);
5205 n->whereClause = $6;
5211 /*****************************************************************************
5216 *****************************************************************************/
5217 DeclareCursorStmt: DECLARE name cursor_options CURSOR opt_hold FOR SelectStmt
5219 DeclareCursorStmt *n = makeNode(DeclareCursorStmt);
5224 n->options |= CURSOR_OPT_HOLD;
5229 cursor_options: /*EMPTY*/ { $$ = 0; }
5230 | cursor_options NO SCROLL { $$ = $1 | CURSOR_OPT_NO_SCROLL; }
5231 | cursor_options SCROLL { $$ = $1 | CURSOR_OPT_SCROLL; }
5232 | cursor_options BINARY { $$ = $1 | CURSOR_OPT_BINARY; }
5233 | cursor_options INSENSITIVE { $$ = $1 | CURSOR_OPT_INSENSITIVE; }
5236 opt_hold: /* EMPTY */ { $$ = FALSE; }
5237 | WITH HOLD { $$ = TRUE; }
5238 | WITHOUT HOLD { $$ = FALSE; }
5241 /*****************************************************************************
5246 *****************************************************************************/
5248 /* A complete SELECT statement looks like this.
5250 * The rule returns either a single SelectStmt node or a tree of them,
5251 * representing a set-operation tree.
5253 * There is an ambiguity when a sub-SELECT is within an a_expr and there
5254 * are excess parentheses: do the parentheses belong to the sub-SELECT or
5255 * to the surrounding a_expr? We don't really care, but yacc wants to know.
5256 * To resolve the ambiguity, we are careful to define the grammar so that
5257 * the decision is staved off as long as possible: as long as we can keep
5258 * absorbing parentheses into the sub-SELECT, we will do so, and only when
5259 * it's no longer possible to do that will we decide that parens belong to
5260 * the expression. For example, in "SELECT (((SELECT 2)) + 3)" the extra
5261 * parentheses are treated as part of the sub-select. The necessity of doing
5262 * it that way is shown by "SELECT (((SELECT 2)) UNION SELECT 2)". Had we
5263 * parsed "((SELECT 2))" as an a_expr, it'd be too late to go back to the
5264 * SELECT viewpoint when we see the UNION.
5266 * This approach is implemented by defining a nonterminal select_with_parens,
5267 * which represents a SELECT with at least one outer layer of parentheses,
5268 * and being careful to use select_with_parens, never '(' SelectStmt ')',
5269 * in the expression grammar. We will then have shift-reduce conflicts
5270 * which we can resolve in favor of always treating '(' <select> ')' as
5271 * a select_with_parens. To resolve the conflicts, the productions that
5272 * conflict with the select_with_parens productions are manually given
5273 * precedences lower than the precedence of ')', thereby ensuring that we
5274 * shift ')' (and then reduce to select_with_parens) rather than trying to
5275 * reduce the inner <select> nonterminal to something else. We use UMINUS
5276 * precedence for this, which is a fairly arbitrary choice.
5278 * To be able to define select_with_parens itself without ambiguity, we need
5279 * a nonterminal select_no_parens that represents a SELECT structure with no
5280 * outermost parentheses. This is a little bit tedious, but it works.
5282 * In non-expression contexts, we use SelectStmt which can represent a SELECT
5283 * with or without outer parentheses.
5286 SelectStmt: select_no_parens %prec UMINUS
5287 | select_with_parens %prec UMINUS
5291 '(' select_no_parens ')' { $$ = $2; }
5292 | '(' select_with_parens ')' { $$ = $2; }
5296 * FOR UPDATE/SHARE may be before or after LIMIT/OFFSET.
5297 * In <=7.2.X, LIMIT/OFFSET had to be after FOR UPDATE
5298 * We now support both orderings, but prefer LIMIT/OFFSET before FOR UPDATE/SHARE
5302 simple_select { $$ = $1; }
5303 | select_clause sort_clause
5305 insertSelectOptions((SelectStmt *) $1, $2, NULL,
5309 | select_clause opt_sort_clause for_locking_clause opt_select_limit
5311 insertSelectOptions((SelectStmt *) $1, $2, $3,
5312 list_nth($4, 0), list_nth($4, 1));
5315 | select_clause opt_sort_clause select_limit opt_for_locking_clause
5317 insertSelectOptions((SelectStmt *) $1, $2, $4,
5318 list_nth($3, 0), list_nth($3, 1));
5324 simple_select { $$ = $1; }
5325 | select_with_parens { $$ = $1; }
5329 * This rule parses SELECT statements that can appear within set operations,
5330 * including UNION, INTERSECT and EXCEPT. '(' and ')' can be used to specify
5331 * the ordering of the set operations. Without '(' and ')' we want the
5332 * operations to be ordered per the precedence specs at the head of this file.
5334 * As with select_no_parens, simple_select cannot have outer parentheses,
5335 * but can have parenthesized subclauses.
5337 * Note that sort clauses cannot be included at this level --- SQL92 requires
5338 * SELECT foo UNION SELECT bar ORDER BY baz
5340 * (SELECT foo UNION SELECT bar) ORDER BY baz
5342 * SELECT foo UNION (SELECT bar ORDER BY baz)
5343 * Likewise FOR UPDATE and LIMIT. Therefore, those clauses are described
5344 * as part of the select_no_parens production, not simple_select.
5345 * This does not limit functionality, because you can reintroduce sort and
5346 * limit clauses inside parentheses.
5348 * NOTE: only the leftmost component SelectStmt should have INTO.
5349 * However, this is not checked by the grammar; parse analysis must check it.
5352 SELECT opt_distinct target_list
5353 into_clause from_clause where_clause
5354 group_clause having_clause
5356 SelectStmt *n = makeNode(SelectStmt);
5357 n->distinctClause = $2;
5360 n->intoColNames = NIL;
5361 n->intoHasOids = DEFAULT_OIDS;
5363 n->whereClause = $6;
5364 n->groupClause = $7;
5365 n->havingClause = $8;
5368 | select_clause UNION opt_all select_clause
5370 $$ = makeSetOp(SETOP_UNION, $3, $1, $4);
5372 | select_clause INTERSECT opt_all select_clause
5374 $$ = makeSetOp(SETOP_INTERSECT, $3, $1, $4);
5376 | select_clause EXCEPT opt_all select_clause
5378 $$ = makeSetOp(SETOP_EXCEPT, $3, $1, $4);
5383 INTO OptTempTableName { $$ = $2; }
5384 | /*EMPTY*/ { $$ = NULL; }
5388 * Redundancy here is needed to avoid shift/reduce conflicts,
5389 * since TEMP is not a reserved word. See also OptTemp.
5392 TEMPORARY opt_table qualified_name
5397 | TEMP opt_table qualified_name
5402 | LOCAL TEMPORARY opt_table qualified_name
5407 | LOCAL TEMP opt_table qualified_name
5412 | GLOBAL TEMPORARY opt_table qualified_name
5417 | GLOBAL TEMP opt_table qualified_name
5422 | TABLE qualified_name
5438 opt_all: ALL { $$ = TRUE; }
5439 | DISTINCT { $$ = FALSE; }
5440 | /*EMPTY*/ { $$ = FALSE; }
5443 /* We use (NIL) as a placeholder to indicate that all target expressions
5444 * should be placed in the DISTINCT list during parsetree analysis.
5447 DISTINCT { $$ = list_make1(NIL); }
5448 | DISTINCT ON '(' expr_list ')' { $$ = $4; }
5450 | /*EMPTY*/ { $$ = NIL; }
5454 sort_clause { $$ = $1;}
5455 | /*EMPTY*/ { $$ = NIL; }
5459 ORDER BY sortby_list { $$ = $3; }
5463 sortby { $$ = list_make1($1); }
5464 | sortby_list ',' sortby { $$ = lappend($1, $3); }
5467 sortby: a_expr USING qual_all_Op
5469 $$ = makeNode(SortBy);
5471 $$->sortby_kind = SORTBY_USING;
5476 $$ = makeNode(SortBy);
5478 $$->sortby_kind = SORTBY_ASC;
5483 $$ = makeNode(SortBy);
5485 $$->sortby_kind = SORTBY_DESC;
5490 $$ = makeNode(SortBy);
5492 $$->sortby_kind = SORTBY_ASC; /* default */
5499 LIMIT select_limit_value OFFSET select_offset_value
5500 { $$ = list_make2($4, $2); }
5501 | OFFSET select_offset_value LIMIT select_limit_value
5502 { $$ = list_make2($2, $4); }
5503 | LIMIT select_limit_value
5504 { $$ = list_make2(NULL, $2); }
5505 | OFFSET select_offset_value
5506 { $$ = list_make2($2, NULL); }
5507 | LIMIT select_limit_value ',' select_offset_value
5509 /* Disabled because it was too confusing, bjm 2002-02-18 */
5511 (errcode(ERRCODE_SYNTAX_ERROR),
5512 errmsg("LIMIT #,# syntax is not supported"),
5513 errhint("Use separate LIMIT and OFFSET clauses.")));
5518 select_limit { $$ = $1; }
5520 { $$ = list_make2(NULL,NULL); }
5527 /* LIMIT ALL is represented as a NULL constant */
5528 A_Const *n = makeNode(A_Const);
5529 n->val.type = T_Null;
5534 select_offset_value:
5539 GROUP_P BY expr_list { $$ = $3; }
5540 | /*EMPTY*/ { $$ = NIL; }
5544 HAVING a_expr { $$ = $2; }
5545 | /*EMPTY*/ { $$ = NULL; }
5549 FOR UPDATE locked_rels_list opt_nowait
5551 LockingClause *n = makeNode(LockingClause);
5553 n->forUpdate = TRUE;
5557 | FOR SHARE locked_rels_list opt_nowait
5559 LockingClause *n = makeNode(LockingClause);
5561 n->forUpdate = FALSE;
5565 | FOR READ ONLY { $$ = NULL; }
5568 opt_for_locking_clause:
5569 for_locking_clause { $$ = $1; }
5570 | /* EMPTY */ { $$ = NULL; }
5574 OF name_list { $$ = $2; }
5575 | /* EMPTY */ { $$ = NIL; }
5578 /*****************************************************************************
5580 * clauses common to all Optimizable Stmts:
5581 * from_clause - allow list of both JOIN expressions and table names
5582 * where_clause - qualifications for joins or restrictions
5584 *****************************************************************************/
5587 FROM from_list { $$ = $2; }
5588 | /*EMPTY*/ { $$ = NIL; }
5592 table_ref { $$ = list_make1($1); }
5593 | from_list ',' table_ref { $$ = lappend($1, $3); }
5597 * table_ref is where an alias clause can be attached. Note we cannot make
5598 * alias_clause have an empty production because that causes parse conflicts
5599 * between table_ref := '(' joined_table ')' alias_clause
5600 * and joined_table := '(' joined_table ')'. So, we must have the
5601 * redundant-looking productions here instead.
5603 table_ref: relation_expr
5607 | relation_expr alias_clause
5614 RangeFunction *n = makeNode(RangeFunction);
5615 n->funccallnode = $1;
5616 n->coldeflist = NIL;
5619 | func_table alias_clause
5621 RangeFunction *n = makeNode(RangeFunction);
5622 n->funccallnode = $1;
5624 n->coldeflist = NIL;
5627 | func_table AS '(' TableFuncElementList ')'
5629 RangeFunction *n = makeNode(RangeFunction);
5630 n->funccallnode = $1;
5634 | func_table AS ColId '(' TableFuncElementList ')'
5636 RangeFunction *n = makeNode(RangeFunction);
5637 Alias *a = makeNode(Alias);
5638 n->funccallnode = $1;
5644 | func_table ColId '(' TableFuncElementList ')'
5646 RangeFunction *n = makeNode(RangeFunction);
5647 Alias *a = makeNode(Alias);
5648 n->funccallnode = $1;
5654 | select_with_parens
5657 * The SQL spec does not permit a subselect
5658 * (<derived_table>) without an alias clause,
5659 * so we don't either. This avoids the problem
5660 * of needing to invent a unique refname for it.
5661 * That could be surmounted if there's sufficient
5662 * popular demand, but for now let's just implement
5663 * the spec and see if anyone complains.
5664 * However, it does seem like a good idea to emit
5665 * an error message that's better than "syntax error".
5668 (errcode(ERRCODE_SYNTAX_ERROR),
5669 errmsg("subquery in FROM must have an alias"),
5670 errhint("For example, FROM (SELECT ...) [AS] foo.")));
5673 | select_with_parens alias_clause
5675 RangeSubselect *n = makeNode(RangeSubselect);
5684 | '(' joined_table ')' alias_clause
5693 * It may seem silly to separate joined_table from table_ref, but there is
5694 * method in SQL92's madness: if you don't do it this way you get reduce-
5695 * reduce conflicts, because it's not clear to the parser generator whether
5696 * to expect alias_clause after ')' or not. For the same reason we must
5697 * treat 'JOIN' and 'join_type JOIN' separately, rather than allowing
5698 * join_type to expand to empty; if we try it, the parser generator can't
5699 * figure out when to reduce an empty join_type right after table_ref.
5701 * Note that a CROSS JOIN is the same as an unqualified
5702 * INNER JOIN, and an INNER JOIN/ON has the same shape
5703 * but a qualification expression to limit membership.
5704 * A NATURAL JOIN implicitly matches column names between
5705 * tables and the shape is determined by which columns are
5706 * in common. We'll collect columns during the later transformations.
5710 '(' joined_table ')'
5714 | table_ref CROSS JOIN table_ref
5716 /* CROSS JOIN is same as unqualified inner join */
5717 JoinExpr *n = makeNode(JoinExpr);
5718 n->jointype = JOIN_INNER;
5719 n->isNatural = FALSE;
5726 | table_ref UNIONJOIN table_ref
5728 /* UNION JOIN is made into 1 token to avoid shift/reduce
5729 * conflict against regular UNION keyword.
5731 JoinExpr *n = makeNode(JoinExpr);
5732 n->jointype = JOIN_UNION;
5733 n->isNatural = FALSE;
5740 | table_ref join_type JOIN table_ref join_qual
5742 JoinExpr *n = makeNode(JoinExpr);
5744 n->isNatural = FALSE;
5747 if ($5 != NULL && IsA($5, List))
5748 n->using = (List *) $5; /* USING clause */
5750 n->quals = $5; /* ON clause */
5753 | table_ref JOIN table_ref join_qual
5755 /* letting join_type reduce to empty doesn't work */
5756 JoinExpr *n = makeNode(JoinExpr);
5757 n->jointype = JOIN_INNER;
5758 n->isNatural = FALSE;
5761 if ($4 != NULL && IsA($4, List))
5762 n->using = (List *) $4; /* USING clause */
5764 n->quals = $4; /* ON clause */
5767 | table_ref NATURAL join_type JOIN table_ref
5769 JoinExpr *n = makeNode(JoinExpr);
5771 n->isNatural = TRUE;
5774 n->using = NIL; /* figure out which columns later... */
5775 n->quals = NULL; /* fill later */
5778 | table_ref NATURAL JOIN table_ref
5780 /* letting join_type reduce to empty doesn't work */
5781 JoinExpr *n = makeNode(JoinExpr);
5782 n->jointype = JOIN_INNER;
5783 n->isNatural = TRUE;
5786 n->using = NIL; /* figure out which columns later... */
5787 n->quals = NULL; /* fill later */
5793 AS ColId '(' name_list ')'
5795 $$ = makeNode(Alias);
5801 $$ = makeNode(Alias);
5804 | ColId '(' name_list ')'
5806 $$ = makeNode(Alias);
5812 $$ = makeNode(Alias);
5817 join_type: FULL join_outer { $$ = JOIN_FULL; }
5818 | LEFT join_outer { $$ = JOIN_LEFT; }
5819 | RIGHT join_outer { $$ = JOIN_RIGHT; }
5820 | INNER_P { $$ = JOIN_INNER; }
5823 /* OUTER is just noise... */
5824 join_outer: OUTER_P { $$ = NULL; }
5825 | /*EMPTY*/ { $$ = NULL; }
5828 /* JOIN qualification clauses
5829 * Possibilities are:
5830 * USING ( column list ) allows only unqualified column names,
5831 * which must match between tables.
5832 * ON expr allows more general qualifications.
5834 * We return USING as a List node, while an ON-expr will not be a List.
5837 join_qual: USING '(' name_list ')' { $$ = (Node *) $3; }
5838 | ON a_expr { $$ = $2; }
5845 /* default inheritance */
5847 $$->inhOpt = INH_DEFAULT;
5850 | qualified_name '*'
5852 /* inheritance query */
5854 $$->inhOpt = INH_YES;
5857 | ONLY qualified_name
5859 /* no inheritance */
5861 $$->inhOpt = INH_NO;
5864 | ONLY '(' qualified_name ')'
5866 /* no inheritance, SQL99-style syntax */
5868 $$->inhOpt = INH_NO;
5874 func_table: func_expr { $$ = $1; }
5879 WHERE a_expr { $$ = $2; }
5880 | /*EMPTY*/ { $$ = NULL; }
5884 TableFuncElementList:
5887 $$ = list_make1($1);
5889 | TableFuncElementList ',' TableFuncElement
5891 $$ = lappend($1, $3);
5895 TableFuncElement: ColId Typename
5897 ColumnDef *n = makeNode(ColumnDef);
5900 n->constraints = NIL;
5906 /*****************************************************************************
5909 * SQL92 introduces a large amount of type-specific syntax.
5910 * Define individual clauses to handle these cases, and use
5911 * the generic case to handle regular type-extensible Postgres syntax.
5912 * - thomas 1997-10-10
5914 *****************************************************************************/
5916 Typename: SimpleTypename opt_array_bounds
5919 $$->arrayBounds = $2;
5921 | SETOF SimpleTypename opt_array_bounds
5924 $$->arrayBounds = $3;
5927 | SimpleTypename ARRAY '[' Iconst ']'
5929 /* SQL99's redundant syntax */
5931 $$->arrayBounds = list_make1(makeInteger($4));
5933 | SETOF SimpleTypename ARRAY '[' Iconst ']'
5935 /* SQL99's redundant syntax */
5937 $$->arrayBounds = list_make1(makeInteger($5));
5943 opt_array_bounds '[' ']'
5944 { $$ = lappend($1, makeInteger(-1)); }
5945 | opt_array_bounds '[' Iconst ']'
5946 { $$ = lappend($1, makeInteger($3)); }
5952 * XXX ideally, the production for a qualified typename should be ColId attrs
5953 * (there's no obvious reason why the first name should need to be restricted)
5954 * and should be an alternative of GenericType (so that it can be used to
5955 * specify a type for a literal in AExprConst). However doing either causes
5956 * reduce/reduce conflicts that I haven't been able to find a workaround
5960 GenericType { $$ = $1; }
5961 | Numeric { $$ = $1; }
5963 | Character { $$ = $1; }
5964 | ConstDatetime { $$ = $1; }
5965 | ConstInterval opt_interval
5968 if ($2 != INTERVAL_FULL_RANGE)
5969 $$->typmod = INTERVAL_TYPMOD(INTERVAL_FULL_PRECISION, $2);
5971 | ConstInterval '(' Iconst ')' opt_interval
5976 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5977 errmsg("INTERVAL(%d) precision must not be negative",
5979 if ($3 > MAX_INTERVAL_PRECISION)
5982 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
5983 errmsg("INTERVAL(%d) precision reduced to maximum allowed, %d",
5984 $3, MAX_INTERVAL_PRECISION)));
5985 $3 = MAX_INTERVAL_PRECISION;
5987 $$->typmod = INTERVAL_TYPMOD($3, $5);
5991 $$ = makeNode(TypeName);
5992 $$->names = lcons(makeString($1), $2);
5997 /* We have a separate ConstTypename to allow defaulting fixed-length
5998 * types such as CHAR() and BIT() to an unspecified length.
5999 * SQL9x requires that these default to a length of one, but this
6000 * makes no sense for constructs like CHAR 'hi' and BIT '0101',
6001 * where there is an obvious better choice to make.
6002 * Note that ConstInterval is not included here since it must
6003 * be pushed up higher in the rules to accomodate the postfix
6004 * options (e.g. INTERVAL '1' YEAR).
6007 GenericType { $$ = $1; }
6008 | Numeric { $$ = $1; }
6009 | ConstBit { $$ = $1; }
6010 | ConstCharacter { $$ = $1; }
6011 | ConstDatetime { $$ = $1; }
6017 $$ = makeTypeName($1);
6021 /* SQL92 numeric data types
6022 * Check FLOAT() precision limits assuming IEEE floating types.
6023 * - thomas 1997-09-18
6024 * Provide real DECIMAL() and NUMERIC() implementations now - Jan 1998-12-30
6028 $$ = SystemTypeName("int4");
6032 $$ = SystemTypeName("int4");
6036 $$ = SystemTypeName("int2");
6040 $$ = SystemTypeName("int8");
6044 $$ = SystemTypeName("float4");
6050 | DOUBLE_P PRECISION
6052 $$ = SystemTypeName("float8");
6054 | DECIMAL_P opt_decimal
6056 $$ = SystemTypeName("numeric");
6061 $$ = SystemTypeName("numeric");
6064 | NUMERIC opt_numeric
6066 $$ = SystemTypeName("numeric");
6071 $$ = SystemTypeName("bool");
6075 opt_float: '(' Iconst ')'
6079 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6080 errmsg("precision for type float must be at least 1 bit")));
6082 $$ = SystemTypeName("float4");
6084 $$ = SystemTypeName("float8");
6087 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6088 errmsg("precision for type float must be less than 54 bits")));
6092 $$ = SystemTypeName("float8");
6097 '(' Iconst ',' Iconst ')'
6099 if ($2 < 1 || $2 > NUMERIC_MAX_PRECISION)
6101 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6102 errmsg("NUMERIC precision %d must be between 1 and %d",
6103 $2, NUMERIC_MAX_PRECISION)));
6104 if ($4 < 0 || $4 > $2)
6106 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6107 errmsg("NUMERIC scale %d must be between 0 and precision %d",
6110 $$ = (($2 << 16) | $4) + VARHDRSZ;
6114 if ($2 < 1 || $2 > NUMERIC_MAX_PRECISION)
6116 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6117 errmsg("NUMERIC precision %d must be between 1 and %d",
6118 $2, NUMERIC_MAX_PRECISION)));
6120 $$ = ($2 << 16) + VARHDRSZ;
6124 /* Insert "-1" meaning "no limit" */
6130 '(' Iconst ',' Iconst ')'
6132 if ($2 < 1 || $2 > NUMERIC_MAX_PRECISION)
6134 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6135 errmsg("DECIMAL precision %d must be between 1 and %d",
6136 $2, NUMERIC_MAX_PRECISION)));
6137 if ($4 < 0 || $4 > $2)
6139 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6140 errmsg("DECIMAL scale %d must be between 0 and precision %d",
6143 $$ = (($2 << 16) | $4) + VARHDRSZ;
6147 if ($2 < 1 || $2 > NUMERIC_MAX_PRECISION)
6149 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6150 errmsg("DECIMAL precision %d must be between 1 and %d",
6151 $2, NUMERIC_MAX_PRECISION)));
6153 $$ = ($2 << 16) + VARHDRSZ;
6157 /* Insert "-1" meaning "no limit" */
6164 * SQL92 bit-field data types
6165 * The following implements BIT() and BIT VARYING().
6177 /* ConstBit is like Bit except "BIT" defaults to unspecified length */
6178 /* See notes for ConstCharacter, which addresses same issue for "CHAR" */
6179 ConstBit: BitWithLength
6191 BIT opt_varying '(' Iconst ')'
6195 typname = $2 ? "varbit" : "bit";
6196 $$ = SystemTypeName(typname);
6199 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6200 errmsg("length for type %s must be at least 1",
6202 else if ($4 > (MaxAttrSize * BITS_PER_BYTE))
6204 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6205 errmsg("length for type %s cannot exceed %d",
6206 typname, MaxAttrSize * BITS_PER_BYTE)));
6214 /* bit defaults to bit(1), varbit to no limit */
6217 $$ = SystemTypeName("varbit");
6222 $$ = SystemTypeName("bit");
6230 * SQL92 character data types
6231 * The following implements CHAR() and VARCHAR().
6233 Character: CharacterWithLength
6237 | CharacterWithoutLength
6243 ConstCharacter: CharacterWithLength
6247 | CharacterWithoutLength
6249 /* Length was not specified so allow to be unrestricted.
6250 * This handles problems with fixed-length (bpchar) strings
6251 * which in column definitions must default to a length
6252 * of one, but should not be constrained if the length
6253 * was not specified.
6260 CharacterWithLength: character '(' Iconst ')' opt_charset
6262 if (($5 != NULL) && (strcmp($5, "sql_text") != 0))
6266 type = palloc(strlen($1) + 1 + strlen($5) + 1);
6273 $$ = SystemTypeName($1);
6277 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6278 errmsg("length for type %s must be at least 1",
6280 else if ($3 > MaxAttrSize)
6282 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6283 errmsg("length for type %s cannot exceed %d",
6286 /* we actually implement these like a varlen, so
6287 * the first 4 bytes is the length. (the difference
6288 * between these and "text" is that we blank-pad and
6289 * truncate where necessary)
6291 $$->typmod = VARHDRSZ + $3;
6295 CharacterWithoutLength: character opt_charset
6297 if (($2 != NULL) && (strcmp($2, "sql_text") != 0))
6301 type = palloc(strlen($1) + 1 + strlen($2) + 1);
6308 $$ = SystemTypeName($1);
6310 /* char defaults to char(1), varchar to no limit */
6311 if (strcmp($1, "bpchar") == 0)
6312 $$->typmod = VARHDRSZ + 1;
6318 character: CHARACTER opt_varying
6319 { $$ = $2 ? "varchar": "bpchar"; }
6320 | CHAR_P opt_varying
6321 { $$ = $2 ? "varchar": "bpchar"; }
6324 | NATIONAL CHARACTER opt_varying
6325 { $$ = $3 ? "varchar": "bpchar"; }
6326 | NATIONAL CHAR_P opt_varying
6327 { $$ = $3 ? "varchar": "bpchar"; }
6329 { $$ = $2 ? "varchar": "bpchar"; }
6333 VARYING { $$ = TRUE; }
6334 | /*EMPTY*/ { $$ = FALSE; }
6338 CHARACTER SET ColId { $$ = $3; }
6339 | /*EMPTY*/ { $$ = NULL; }
6343 TIMESTAMP '(' Iconst ')' opt_timezone
6346 $$ = SystemTypeName("timestamptz");
6348 $$ = SystemTypeName("timestamp");
6349 /* XXX the timezone field seems to be unused
6350 * - thomas 2001-09-06
6355 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6356 errmsg("TIMESTAMP(%d)%s precision must not be negative",
6357 $3, ($5 ? " WITH TIME ZONE": ""))));
6358 if ($3 > MAX_TIMESTAMP_PRECISION)
6361 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6362 errmsg("TIMESTAMP(%d)%s precision reduced to maximum allowed, %d",
6363 $3, ($5 ? " WITH TIME ZONE": ""),
6364 MAX_TIMESTAMP_PRECISION)));
6365 $3 = MAX_TIMESTAMP_PRECISION;
6369 | TIMESTAMP opt_timezone
6372 $$ = SystemTypeName("timestamptz");
6374 $$ = SystemTypeName("timestamp");
6375 /* XXX the timezone field seems to be unused
6376 * - thomas 2001-09-06
6380 | TIME '(' Iconst ')' opt_timezone
6383 $$ = SystemTypeName("timetz");
6385 $$ = SystemTypeName("time");
6388 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6389 errmsg("TIME(%d)%s precision must not be negative",
6390 $3, ($5 ? " WITH TIME ZONE": ""))));
6391 if ($3 > MAX_TIME_PRECISION)
6394 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
6395 errmsg("TIME(%d)%s precision reduced to maximum allowed, %d",
6396 $3, ($5 ? " WITH TIME ZONE": ""),
6397 MAX_TIME_PRECISION)));
6398 $3 = MAX_TIME_PRECISION;
6405 $$ = SystemTypeName("timetz");
6407 $$ = SystemTypeName("time");
6412 INTERVAL { $$ = SystemTypeName("interval"); }
6416 WITH TIME ZONE { $$ = TRUE; }
6417 | WITHOUT TIME ZONE { $$ = FALSE; }
6418 | /*EMPTY*/ { $$ = FALSE; }
6422 YEAR_P { $$ = INTERVAL_MASK(YEAR); }
6423 | MONTH_P { $$ = INTERVAL_MASK(MONTH); }
6424 | DAY_P { $$ = INTERVAL_MASK(DAY); }
6425 | HOUR_P { $$ = INTERVAL_MASK(HOUR); }
6426 | MINUTE_P { $$ = INTERVAL_MASK(MINUTE); }
6427 | SECOND_P { $$ = INTERVAL_MASK(SECOND); }
6429 { $$ = INTERVAL_MASK(YEAR) | INTERVAL_MASK(MONTH); }
6431 { $$ = INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR); }
6433 { $$ = INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR)
6434 | INTERVAL_MASK(MINUTE); }
6436 { $$ = INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR)
6437 | INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND); }
6438 | HOUR_P TO MINUTE_P
6439 { $$ = INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE); }
6440 | HOUR_P TO SECOND_P
6441 { $$ = INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE)
6442 | INTERVAL_MASK(SECOND); }
6443 | MINUTE_P TO SECOND_P
6444 { $$ = INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND); }
6445 | /*EMPTY*/ { $$ = INTERVAL_FULL_RANGE; }
6449 /*****************************************************************************
6451 * expression grammar
6453 *****************************************************************************/
6456 * General expressions
6457 * This is the heart of the expression syntax.
6459 * We have two expression types: a_expr is the unrestricted kind, and
6460 * b_expr is a subset that must be used in some places to avoid shift/reduce
6461 * conflicts. For example, we can't do BETWEEN as "BETWEEN a_expr AND a_expr"
6462 * because that use of AND conflicts with AND as a boolean operator. So,
6463 * b_expr is used in BETWEEN and we remove boolean keywords from b_expr.
6465 * Note that '(' a_expr ')' is a b_expr, so an unrestricted expression can
6466 * always be used by surrounding it with parens.
6468 * c_expr is all the productions that are common to a_expr and b_expr;
6469 * it's factored out just to eliminate redundant coding.
6471 a_expr: c_expr { $$ = $1; }
6472 | a_expr TYPECAST Typename
6473 { $$ = makeTypeCast($1, $3); }
6474 | a_expr AT TIME ZONE a_expr
6476 FuncCall *n = makeNode(FuncCall);
6477 n->funcname = SystemFuncName("timezone");
6478 n->args = list_make2($5, $1);
6479 n->agg_star = FALSE;
6480 n->agg_distinct = FALSE;
6484 * These operators must be called out explicitly in order to make use
6485 * of yacc/bison's automatic operator-precedence handling. All other
6486 * operator names are handled by the generic productions using "Op",
6487 * below; and all those operators will have the same precedence.
6489 * If you add more explicitly-known operators, be sure to add them
6490 * also to b_expr and to the MathOp list above.
6492 | '+' a_expr %prec UMINUS
6493 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2); }
6494 | '-' a_expr %prec UMINUS
6495 { $$ = doNegate($2); }
6497 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", $1, $3); }
6499 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "-", $1, $3); }
6501 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "*", $1, $3); }
6503 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "/", $1, $3); }
6505 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, $3); }
6507 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, $3); }
6509 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $3); }
6511 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $3); }
6513 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "=", $1, $3); }
6515 | a_expr qual_Op a_expr %prec Op
6516 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, $3); }
6517 | qual_Op a_expr %prec Op
6518 { $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2); }
6519 | a_expr qual_Op %prec POSTFIXOP
6520 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, NULL); }
6523 { $$ = (Node *) makeA_Expr(AEXPR_AND, NIL, $1, $3); }
6525 { $$ = (Node *) makeA_Expr(AEXPR_OR, NIL, $1, $3); }
6527 { $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL, $2); }
6529 | a_expr LIKE a_expr
6530 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~", $1, $3); }
6531 | a_expr LIKE a_expr ESCAPE a_expr
6533 FuncCall *n = makeNode(FuncCall);
6534 n->funcname = SystemFuncName("like_escape");
6535 n->args = list_make2($3, $5);
6536 n->agg_star = FALSE;
6537 n->agg_distinct = FALSE;
6538 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~", $1, (Node *) n);
6540 | a_expr NOT LIKE a_expr
6541 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~", $1, $4); }
6542 | a_expr NOT LIKE a_expr ESCAPE a_expr
6544 FuncCall *n = makeNode(FuncCall);
6545 n->funcname = SystemFuncName("like_escape");
6546 n->args = list_make2($4, $6);
6547 n->agg_star = FALSE;
6548 n->agg_distinct = FALSE;
6549 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~", $1, (Node *) n);
6551 | a_expr ILIKE a_expr
6552 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~*", $1, $3); }
6553 | a_expr ILIKE a_expr ESCAPE a_expr
6555 FuncCall *n = makeNode(FuncCall);
6556 n->funcname = SystemFuncName("like_escape");
6557 n->args = list_make2($3, $5);
6558 n->agg_star = FALSE;
6559 n->agg_distinct = FALSE;
6560 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~*", $1, (Node *) n);
6562 | a_expr NOT ILIKE a_expr
6563 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~*", $1, $4); }
6564 | a_expr NOT ILIKE a_expr ESCAPE a_expr
6566 FuncCall *n = makeNode(FuncCall);
6567 n->funcname = SystemFuncName("like_escape");
6568 n->args = list_make2($4, $6);
6569 n->agg_star = FALSE;
6570 n->agg_distinct = FALSE;
6571 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~*", $1, (Node *) n);
6574 | a_expr SIMILAR TO a_expr %prec SIMILAR
6576 A_Const *c = makeNode(A_Const);
6577 FuncCall *n = makeNode(FuncCall);
6578 c->val.type = T_Null;
6579 n->funcname = SystemFuncName("similar_escape");
6580 n->args = list_make2($4, (Node *) c);
6581 n->agg_star = FALSE;
6582 n->agg_distinct = FALSE;
6583 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~", $1, (Node *) n);
6585 | a_expr SIMILAR TO a_expr ESCAPE a_expr
6587 FuncCall *n = makeNode(FuncCall);
6588 n->funcname = SystemFuncName("similar_escape");
6589 n->args = list_make2($4, $6);
6590 n->agg_star = FALSE;
6591 n->agg_distinct = FALSE;
6592 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~", $1, (Node *) n);
6594 | a_expr NOT SIMILAR TO a_expr %prec SIMILAR
6596 A_Const *c = makeNode(A_Const);
6597 FuncCall *n = makeNode(FuncCall);
6598 c->val.type = T_Null;
6599 n->funcname = SystemFuncName("similar_escape");
6600 n->args = list_make2($5, (Node *) c);
6601 n->agg_star = FALSE;
6602 n->agg_distinct = FALSE;
6603 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~", $1, (Node *) n);
6605 | a_expr NOT SIMILAR TO a_expr ESCAPE a_expr
6607 FuncCall *n = makeNode(FuncCall);
6608 n->funcname = SystemFuncName("similar_escape");
6609 n->args = list_make2($5, $7);
6610 n->agg_star = FALSE;
6611 n->agg_distinct = FALSE;
6612 $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~", $1, (Node *) n);
6616 * Define SQL92-style Null test clause.
6617 * Allow two forms described in the standard:
6620 * Allow two SQL extensions
6626 if (IsA($1, RowExpr))
6627 $$ = makeRowNullTest(IS_NULL, (RowExpr *) $1);
6630 NullTest *n = makeNode(NullTest);
6631 n->arg = (Expr *) $1;
6632 n->nulltesttype = IS_NULL;
6638 if (IsA($1, RowExpr))
6639 $$ = makeRowNullTest(IS_NULL, (RowExpr *) $1);
6642 NullTest *n = makeNode(NullTest);
6643 n->arg = (Expr *) $1;
6644 n->nulltesttype = IS_NULL;
6650 if (IsA($1, RowExpr))
6651 $$ = makeRowNullTest(IS_NOT_NULL, (RowExpr *) $1);
6654 NullTest *n = makeNode(NullTest);
6655 n->arg = (Expr *) $1;
6656 n->nulltesttype = IS_NOT_NULL;
6660 | a_expr IS NOT NULL_P
6662 if (IsA($1, RowExpr))
6663 $$ = makeRowNullTest(IS_NOT_NULL, (RowExpr *) $1);
6666 NullTest *n = makeNode(NullTest);
6667 n->arg = (Expr *) $1;
6668 n->nulltesttype = IS_NOT_NULL;
6674 $$ = (Node *)makeOverlaps($1, $3);
6678 BooleanTest *b = makeNode(BooleanTest);
6679 b->arg = (Expr *) $1;
6680 b->booltesttype = IS_TRUE;
6683 | a_expr IS NOT TRUE_P
6685 BooleanTest *b = makeNode(BooleanTest);
6686 b->arg = (Expr *) $1;
6687 b->booltesttype = IS_NOT_TRUE;
6692 BooleanTest *b = makeNode(BooleanTest);
6693 b->arg = (Expr *) $1;
6694 b->booltesttype = IS_FALSE;
6697 | a_expr IS NOT FALSE_P
6699 BooleanTest *b = makeNode(BooleanTest);
6700 b->arg = (Expr *) $1;
6701 b->booltesttype = IS_NOT_FALSE;
6706 BooleanTest *b = makeNode(BooleanTest);
6707 b->arg = (Expr *) $1;
6708 b->booltesttype = IS_UNKNOWN;
6711 | a_expr IS NOT UNKNOWN
6713 BooleanTest *b = makeNode(BooleanTest);
6714 b->arg = (Expr *) $1;
6715 b->booltesttype = IS_NOT_UNKNOWN;
6718 | a_expr IS DISTINCT FROM a_expr %prec IS
6720 $$ = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $5);
6722 | a_expr IS NOT DISTINCT FROM a_expr %prec IS
6724 $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL,
6725 (Node *) makeSimpleA_Expr(AEXPR_DISTINCT,
6729 | a_expr IS OF '(' type_list ')' %prec IS
6731 $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "=", $1, (Node *) $5);
6733 | a_expr IS NOT OF '(' type_list ')' %prec IS
6735 $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "<>", $1, (Node *) $6);
6737 | a_expr BETWEEN opt_asymmetric b_expr AND b_expr %prec BETWEEN
6739 $$ = (Node *) makeA_Expr(AEXPR_AND, NIL,
6740 (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $4),
6741 (Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $6));
6743 | a_expr NOT BETWEEN opt_asymmetric b_expr AND b_expr %prec BETWEEN
6745 $$ = (Node *) makeA_Expr(AEXPR_OR, NIL,
6746 (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $5),
6747 (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $7));
6749 | a_expr BETWEEN SYMMETRIC b_expr AND b_expr %prec BETWEEN
6751 $$ = (Node *) makeA_Expr(AEXPR_OR, NIL,
6752 (Node *) makeA_Expr(AEXPR_AND, NIL,
6753 (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $4),
6754 (Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $6)),
6755 (Node *) makeA_Expr(AEXPR_AND, NIL,
6756 (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $6),
6757 (Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $4)));
6759 | a_expr NOT BETWEEN SYMMETRIC b_expr AND b_expr %prec BETWEEN
6761 $$ = (Node *) makeA_Expr(AEXPR_AND, NIL,
6762 (Node *) makeA_Expr(AEXPR_OR, NIL,
6763 (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $5),
6764 (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $7)),
6765 (Node *) makeA_Expr(AEXPR_OR, NIL,
6766 (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $7),
6767 (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $5)));
6769 | a_expr IN_P in_expr
6771 /* in_expr returns a SubLink or a list of a_exprs */
6772 if (IsA($3, SubLink))
6774 /* generate foo = ANY (subquery) */
6775 SubLink *n = (SubLink *) $3;
6776 n->subLinkType = ANY_SUBLINK;
6777 if (IsA($1, RowExpr))
6778 n->lefthand = ((RowExpr *) $1)->args;
6780 n->lefthand = list_make1($1);
6781 n->operName = list_make1(makeString("="));
6786 /* generate scalar IN expression */
6787 $$ = (Node *) makeSimpleA_Expr(AEXPR_IN, "=", $1, $3);
6790 | a_expr NOT IN_P in_expr
6792 /* in_expr returns a SubLink or a list of a_exprs */
6793 if (IsA($4, SubLink))
6795 /* generate NOT (foo = ANY (subquery)) */
6796 /* Make an = ANY node */
6797 SubLink *n = (SubLink *) $4;
6798 n->subLinkType = ANY_SUBLINK;
6799 if (IsA($1, RowExpr))
6800 n->lefthand = ((RowExpr *) $1)->args;
6802 n->lefthand = list_make1($1);
6803 n->operName = list_make1(makeString("="));
6804 /* Stick a NOT on top */
6805 $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL, (Node *) n);
6809 /* generate scalar NOT IN expression */
6810 $$ = (Node *) makeSimpleA_Expr(AEXPR_IN, "<>", $1, $4);
6813 | a_expr subquery_Op sub_type select_with_parens %prec Op
6815 SubLink *n = makeNode(SubLink);
6816 n->subLinkType = $3;
6817 if (IsA($1, RowExpr))
6818 n->lefthand = ((RowExpr *) $1)->args;
6820 n->lefthand = list_make1($1);
6825 | a_expr subquery_Op sub_type '(' a_expr ')' %prec Op
6827 if ($3 == ANY_SUBLINK)
6828 $$ = (Node *) makeA_Expr(AEXPR_OP_ANY, $2, $1, $5);
6830 $$ = (Node *) makeA_Expr(AEXPR_OP_ALL, $2, $1, $5);
6832 | UNIQUE select_with_parens %prec Op
6834 /* Not sure how to get rid of the parentheses
6835 * but there are lots of shift/reduce errors without them.
6837 * Should be able to implement this by plopping the entire
6838 * select into a node, then transforming the target expressions
6839 * from whatever they are into count(*), and testing the
6840 * entire result equal to one.
6841 * But, will probably implement a separate node in the executor.
6844 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
6845 errmsg("UNIQUE predicate is not yet implemented")));
6850 * Restricted expressions
6852 * b_expr is a subset of the complete expression syntax defined by a_expr.
6854 * Presently, AND, NOT, IS, and IN are the a_expr keywords that would
6855 * cause trouble in the places where b_expr is used. For simplicity, we
6856 * just eliminate all the boolean-keyword-operator productions from b_expr.
6860 | b_expr TYPECAST Typename
6861 { $$ = makeTypeCast($1, $3); }
6862 | '+' b_expr %prec UMINUS
6863 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2); }
6864 | '-' b_expr %prec UMINUS
6865 { $$ = doNegate($2); }
6867 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", $1, $3); }
6869 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "-", $1, $3); }
6871 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "*", $1, $3); }
6873 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "/", $1, $3); }
6875 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, $3); }
6877 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, $3); }
6879 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $3); }
6881 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $3); }
6883 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "=", $1, $3); }
6884 | b_expr qual_Op b_expr %prec Op
6885 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, $3); }
6886 | qual_Op b_expr %prec Op
6887 { $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2); }
6888 | b_expr qual_Op %prec POSTFIXOP
6889 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, NULL); }
6890 | b_expr IS DISTINCT FROM b_expr %prec IS
6892 $$ = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $5);
6894 | b_expr IS NOT DISTINCT FROM b_expr %prec IS
6896 $$ = (Node *) makeA_Expr(AEXPR_NOT, NIL,
6897 NULL, (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $6));
6899 | b_expr IS OF '(' type_list ')' %prec IS
6901 $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "=", $1, (Node *) $5);
6903 | b_expr IS NOT OF '(' type_list ')' %prec IS
6905 $$ = (Node *) makeSimpleA_Expr(AEXPR_OF, "<>", $1, (Node *) $6);
6910 * Productions that can be used in both a_expr and b_expr.
6912 * Note: productions that refer recursively to a_expr or b_expr mostly
6913 * cannot appear here. However, it's OK to refer to a_exprs that occur
6914 * inside parentheses, such as function arguments; that cannot introduce
6915 * ambiguity to the b_expr syntax.
6917 c_expr: columnref { $$ = $1; }
6918 | AexprConst { $$ = $1; }
6919 | PARAM opt_indirection
6921 ParamRef *p = makeNode(ParamRef);
6925 A_Indirection *n = makeNode(A_Indirection);
6926 n->arg = (Node *) p;
6927 n->indirection = $2;
6933 | '(' a_expr ')' opt_indirection
6937 A_Indirection *n = makeNode(A_Indirection);
6939 n->indirection = $4;
6949 | select_with_parens %prec UMINUS
6951 SubLink *n = makeNode(SubLink);
6952 n->subLinkType = EXPR_SUBLINK;
6958 | EXISTS select_with_parens
6960 SubLink *n = makeNode(SubLink);
6961 n->subLinkType = EXISTS_SUBLINK;
6967 | ARRAY select_with_parens
6969 SubLink *n = makeNode(SubLink);
6970 n->subLinkType = ARRAY_SUBLINK;
6980 RowExpr *r = makeNode(RowExpr);
6982 r->row_typeid = InvalidOid; /* not analyzed yet */
6988 * func_expr is split out from c_expr just so that we have a classification
6989 * for "everything that is a function call or looks like one". This isn't
6990 * very important, but it saves us having to document which variants are
6991 * legal in the backwards-compatible functional-index syntax for CREATE INDEX.
6992 * (Note that many of the special SQL functions wouldn't actually make any
6993 * sense as functional index entries, but we ignore that consideration here.)
6995 func_expr: func_name '(' ')'
6997 FuncCall *n = makeNode(FuncCall);
7000 n->agg_star = FALSE;
7001 n->agg_distinct = FALSE;
7004 | func_name '(' expr_list ')'
7006 FuncCall *n = makeNode(FuncCall);
7009 n->agg_star = FALSE;
7010 n->agg_distinct = FALSE;
7013 | func_name '(' ALL expr_list ')'
7015 FuncCall *n = makeNode(FuncCall);
7018 n->agg_star = FALSE;
7019 n->agg_distinct = FALSE;
7020 /* Ideally we'd mark the FuncCall node to indicate
7021 * "must be an aggregate", but there's no provision
7022 * for that in FuncCall at the moment.
7026 | func_name '(' DISTINCT expr_list ')'
7028 FuncCall *n = makeNode(FuncCall);
7031 n->agg_star = FALSE;
7032 n->agg_distinct = TRUE;
7035 | func_name '(' '*' ')'
7038 * For now, we transform AGGREGATE(*) into AGGREGATE(1).
7040 * This does the right thing for COUNT(*) (in fact,
7041 * any certainly-non-null expression would do for COUNT),
7042 * and there are no other aggregates in SQL92 that accept
7045 * The FuncCall node is also marked agg_star = true,
7046 * so that later processing can detect what the argument
7049 FuncCall *n = makeNode(FuncCall);
7050 A_Const *star = makeNode(A_Const);
7052 star->val.type = T_Integer;
7053 star->val.val.ival = 1;
7055 n->args = list_make1(star);
7057 n->agg_distinct = FALSE;
7063 * Translate as "'now'::text::date".
7065 * We cannot use "'now'::date" because coerce_type() will
7066 * immediately reduce that to a constant representing
7067 * today's date. We need to delay the conversion until
7068 * runtime, else the wrong things will happen when
7069 * CURRENT_DATE is used in a column default value or rule.
7071 * This could be simplified if we had a way to generate
7072 * an expression tree representing runtime application
7073 * of type-input conversion functions. (As of PG 7.3
7074 * that is actually possible, but not clear that we want
7077 A_Const *s = makeNode(A_Const);
7080 s->val.type = T_String;
7081 s->val.val.str = "now";
7082 s->typename = SystemTypeName("text");
7084 d = SystemTypeName("date");
7086 $$ = (Node *)makeTypeCast((Node *)s, d);
7091 * Translate as "'now'::text::timetz".
7092 * See comments for CURRENT_DATE.
7094 A_Const *s = makeNode(A_Const);
7097 s->val.type = T_String;
7098 s->val.val.str = "now";
7099 s->typename = SystemTypeName("text");
7101 d = SystemTypeName("timetz");
7103 $$ = (Node *)makeTypeCast((Node *)s, d);
7105 | CURRENT_TIME '(' Iconst ')'
7108 * Translate as "'now'::text::timetz(n)".
7109 * See comments for CURRENT_DATE.
7111 A_Const *s = makeNode(A_Const);
7114 s->val.type = T_String;
7115 s->val.val.str = "now";
7116 s->typename = SystemTypeName("text");
7117 d = SystemTypeName("timetz");
7120 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
7121 errmsg("CURRENT_TIME(%d) precision must not be negative",
7123 if ($3 > MAX_TIME_PRECISION)
7126 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
7127 errmsg("CURRENT_TIME(%d) precision reduced to maximum allowed, %d",
7128 $3, MAX_TIME_PRECISION)));
7129 $3 = MAX_TIME_PRECISION;
7133 $$ = (Node *)makeTypeCast((Node *)s, d);
7138 * Translate as "now()", since we have a function that
7139 * does exactly what is needed.
7141 FuncCall *n = makeNode(FuncCall);
7142 n->funcname = SystemFuncName("now");
7144 n->agg_star = FALSE;
7145 n->agg_distinct = FALSE;
7148 | CURRENT_TIMESTAMP '(' Iconst ')'
7151 * Translate as "'now'::text::timestamptz(n)".
7152 * See comments for CURRENT_DATE.
7154 A_Const *s = makeNode(A_Const);
7157 s->val.type = T_String;
7158 s->val.val.str = "now";
7159 s->typename = SystemTypeName("text");
7161 d = SystemTypeName("timestamptz");
7164 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
7165 errmsg("CURRENT_TIMESTAMP(%d) precision must not be negative",
7167 if ($3 > MAX_TIMESTAMP_PRECISION)
7170 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
7171 errmsg("CURRENT_TIMESTAMP(%d) precision reduced to maximum allowed, %d",
7172 $3, MAX_TIMESTAMP_PRECISION)));
7173 $3 = MAX_TIMESTAMP_PRECISION;
7177 $$ = (Node *)makeTypeCast((Node *)s, d);
7182 * Translate as "'now'::text::time".
7183 * See comments for CURRENT_DATE.
7185 A_Const *s = makeNode(A_Const);
7188 s->val.type = T_String;
7189 s->val.val.str = "now";
7190 s->typename = SystemTypeName("text");
7192 d = SystemTypeName("time");
7194 $$ = (Node *)makeTypeCast((Node *)s, d);
7196 | LOCALTIME '(' Iconst ')'
7199 * Translate as "'now'::text::time(n)".
7200 * See comments for CURRENT_DATE.
7202 A_Const *s = makeNode(A_Const);
7205 s->val.type = T_String;
7206 s->val.val.str = "now";
7207 s->typename = SystemTypeName("text");
7208 d = SystemTypeName("time");
7211 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
7212 errmsg("LOCALTIME(%d) precision must not be negative",
7214 if ($3 > MAX_TIME_PRECISION)
7217 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
7218 errmsg("LOCALTIME(%d) precision reduced to maximum allowed, %d",
7219 $3, MAX_TIME_PRECISION)));
7220 $3 = MAX_TIME_PRECISION;
7224 $$ = (Node *)makeTypeCast((Node *)s, d);
7229 * Translate as "'now'::text::timestamp".
7230 * See comments for CURRENT_DATE.
7232 A_Const *s = makeNode(A_Const);
7235 s->val.type = T_String;
7236 s->val.val.str = "now";
7237 s->typename = SystemTypeName("text");
7239 d = SystemTypeName("timestamp");
7241 $$ = (Node *)makeTypeCast((Node *)s, d);
7243 | LOCALTIMESTAMP '(' Iconst ')'
7246 * Translate as "'now'::text::timestamp(n)".
7247 * See comments for CURRENT_DATE.
7249 A_Const *s = makeNode(A_Const);
7252 s->val.type = T_String;
7253 s->val.val.str = "now";
7254 s->typename = SystemTypeName("text");
7256 d = SystemTypeName("timestamp");
7259 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
7260 errmsg("LOCALTIMESTAMP(%d) precision must not be negative",
7262 if ($3 > MAX_TIMESTAMP_PRECISION)
7265 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
7266 errmsg("LOCALTIMESTAMP(%d) precision reduced to maximum allowed, %d",
7267 $3, MAX_TIMESTAMP_PRECISION)));
7268 $3 = MAX_TIMESTAMP_PRECISION;
7272 $$ = (Node *)makeTypeCast((Node *)s, d);
7276 FuncCall *n = makeNode(FuncCall);
7277 n->funcname = SystemFuncName("current_user");
7279 n->agg_star = FALSE;
7280 n->agg_distinct = FALSE;
7285 FuncCall *n = makeNode(FuncCall);
7286 n->funcname = SystemFuncName("current_user");
7288 n->agg_star = FALSE;
7289 n->agg_distinct = FALSE;
7294 FuncCall *n = makeNode(FuncCall);
7295 n->funcname = SystemFuncName("session_user");
7297 n->agg_star = FALSE;
7298 n->agg_distinct = FALSE;
7303 FuncCall *n = makeNode(FuncCall);
7304 n->funcname = SystemFuncName("current_user");
7306 n->agg_star = FALSE;
7307 n->agg_distinct = FALSE;
7310 | CAST '(' a_expr AS Typename ')'
7311 { $$ = makeTypeCast($3, $5); }
7312 | EXTRACT '(' extract_list ')'
7314 FuncCall *n = makeNode(FuncCall);
7315 n->funcname = SystemFuncName("date_part");
7317 n->agg_star = FALSE;
7318 n->agg_distinct = FALSE;
7321 | OVERLAY '(' overlay_list ')'
7323 /* overlay(A PLACING B FROM C FOR D) is converted to
7324 * substring(A, 1, C-1) || B || substring(A, C+1, C+D)
7325 * overlay(A PLACING B FROM C) is converted to
7326 * substring(A, 1, C-1) || B || substring(A, C+1, C+char_length(B))
7328 FuncCall *n = makeNode(FuncCall);
7329 n->funcname = SystemFuncName("overlay");
7331 n->agg_star = FALSE;
7332 n->agg_distinct = FALSE;
7335 | POSITION '(' position_list ')'
7337 /* position(A in B) is converted to position(B, A) */
7338 FuncCall *n = makeNode(FuncCall);
7339 n->funcname = SystemFuncName("position");
7341 n->agg_star = FALSE;
7342 n->agg_distinct = FALSE;
7345 | SUBSTRING '(' substr_list ')'
7347 /* substring(A from B for C) is converted to
7348 * substring(A, B, C) - thomas 2000-11-28
7350 FuncCall *n = makeNode(FuncCall);
7351 n->funcname = SystemFuncName("substring");
7353 n->agg_star = FALSE;
7354 n->agg_distinct = FALSE;
7357 | TREAT '(' a_expr AS Typename ')'
7359 /* TREAT(expr AS target) converts expr of a particular type to target,
7360 * which is defined to be a subtype of the original expression.
7361 * In SQL99, this is intended for use with structured UDTs,
7362 * but let's make this a generally useful form allowing stronger
7363 * coersions than are handled by implicit casting.
7365 FuncCall *n = makeNode(FuncCall);
7366 /* Convert SystemTypeName() to SystemFuncName() even though
7367 * at the moment they result in the same thing.
7369 n->funcname = SystemFuncName(((Value *)llast($5->names))->val.str);
7370 n->args = list_make1($3);
7373 | TRIM '(' BOTH trim_list ')'
7375 /* various trim expressions are defined in SQL92
7376 * - thomas 1997-07-19
7378 FuncCall *n = makeNode(FuncCall);
7379 n->funcname = SystemFuncName("btrim");
7381 n->agg_star = FALSE;
7382 n->agg_distinct = FALSE;
7385 | TRIM '(' LEADING trim_list ')'
7387 FuncCall *n = makeNode(FuncCall);
7388 n->funcname = SystemFuncName("ltrim");
7390 n->agg_star = FALSE;
7391 n->agg_distinct = FALSE;
7394 | TRIM '(' TRAILING trim_list ')'
7396 FuncCall *n = makeNode(FuncCall);
7397 n->funcname = SystemFuncName("rtrim");
7399 n->agg_star = FALSE;
7400 n->agg_distinct = FALSE;
7403 | TRIM '(' trim_list ')'
7405 FuncCall *n = makeNode(FuncCall);
7406 n->funcname = SystemFuncName("btrim");
7408 n->agg_star = FALSE;
7409 n->agg_distinct = FALSE;
7412 | CONVERT '(' a_expr USING any_name ')'
7414 FuncCall *n = makeNode(FuncCall);
7415 A_Const *c = makeNode(A_Const);
7417 c->val.type = T_String;
7418 c->val.val.str = NameListToQuotedString($5);
7420 n->funcname = SystemFuncName("convert_using");
7421 n->args = list_make2($3, c);
7422 n->agg_star = FALSE;
7423 n->agg_distinct = FALSE;
7426 | CONVERT '(' expr_list ')'
7428 FuncCall *n = makeNode(FuncCall);
7429 n->funcname = SystemFuncName("convert");
7431 n->agg_star = FALSE;
7432 n->agg_distinct = FALSE;
7435 | NULLIF '(' a_expr ',' a_expr ')'
7437 $$ = (Node *) makeSimpleA_Expr(AEXPR_NULLIF, "=", $3, $5);
7439 | COALESCE '(' expr_list ')'
7441 CoalesceExpr *c = makeNode(CoalesceExpr);
7445 | GREATEST '(' expr_list ')'
7447 MinMaxExpr *v = makeNode(MinMaxExpr);
7449 v->op = IS_GREATEST;
7452 | LEAST '(' expr_list ')'
7454 MinMaxExpr *v = makeNode(MinMaxExpr);
7462 * Supporting nonterminals for expressions.
7465 /* Explicit row production.
7467 * SQL99 allows an optional ROW keyword, so we can now do single-element rows
7468 * without conflicting with the parenthesized a_expr production. Without the
7469 * ROW keyword, there must be more than one a_expr inside the parens.
7471 row: ROW '(' expr_list ')' { $$ = $3; }
7472 | ROW '(' ')' { $$ = NIL; }
7473 | '(' expr_list ',' a_expr ')' { $$ = lappend($2, $4); }
7476 sub_type: ANY { $$ = ANY_SUBLINK; }
7477 | SOME { $$ = ANY_SUBLINK; }
7478 | ALL { $$ = ALL_SUBLINK; }
7481 all_Op: Op { $$ = $1; }
7482 | MathOp { $$ = $1; }
7485 MathOp: '+' { $$ = "+"; }
7497 { $$ = list_make1(makeString($1)); }
7498 | OPERATOR '(' any_operator ')'
7504 { $$ = list_make1(makeString($1)); }
7505 | OPERATOR '(' any_operator ')'
7511 { $$ = list_make1(makeString($1)); }
7512 | OPERATOR '(' any_operator ')'
7515 { $$ = list_make1(makeString("~~")); }
7517 { $$ = list_make1(makeString("!~~")); }
7519 { $$ = list_make1(makeString("~~*")); }
7521 { $$ = list_make1(makeString("!~~*")); }
7522 /* cannot put SIMILAR TO here, because SIMILAR TO is a hack.
7523 * the regular expression is preprocessed by a function (similar_escape),
7524 * and the ~ operator for posix regular expressions is used.
7525 * x SIMILAR TO y -> x ~ similar_escape(y)
7526 * this transformation is made on the fly by the parser upwards.
7527 * however the SubLink structure which handles any/some/all stuff
7528 * is not ready for such a thing.
7534 $$ = list_make1($1);
7536 | expr_list ',' a_expr
7538 $$ = lappend($1, $3);
7543 extract_arg FROM a_expr
7545 A_Const *n = makeNode(A_Const);
7546 n->val.type = T_String;
7547 n->val.val.str = $1;
7548 $$ = list_make2((Node *) n, $3);
7550 | /*EMPTY*/ { $$ = NIL; }
7553 type_list: type_list ',' Typename
7555 $$ = lappend($1, $3);
7559 $$ = list_make1($1);
7563 array_expr_list: array_expr
7564 { $$ = list_make1($1); }
7565 | array_expr_list ',' array_expr
7566 { $$ = lappend($1, $3); }
7569 array_expr: '[' expr_list ']'
7571 ArrayExpr *n = makeNode(ArrayExpr);
7575 | '[' array_expr_list ']'
7577 ArrayExpr *n = makeNode(ArrayExpr);
7583 /* Allow delimited string SCONST in extract_arg as an SQL extension.
7584 * - thomas 2001-04-12
7589 | YEAR_P { $$ = "year"; }
7590 | MONTH_P { $$ = "month"; }
7591 | DAY_P { $$ = "day"; }
7592 | HOUR_P { $$ = "hour"; }
7593 | MINUTE_P { $$ = "minute"; }
7594 | SECOND_P { $$ = "second"; }
7595 | SCONST { $$ = $1; }
7598 /* OVERLAY() arguments
7599 * SQL99 defines the OVERLAY() function:
7600 * o overlay(text placing text from int for int)
7601 * o overlay(text placing text from int)
7604 a_expr overlay_placing substr_from substr_for
7606 $$ = list_make4($1, $2, $3, $4);
7608 | a_expr overlay_placing substr_from
7610 $$ = list_make3($1, $2, $3);
7619 /* position_list uses b_expr not a_expr to avoid conflict with general IN */
7622 b_expr IN_P b_expr { $$ = list_make2($3, $1); }
7623 | /*EMPTY*/ { $$ = NIL; }
7626 /* SUBSTRING() arguments
7627 * SQL9x defines a specific syntax for arguments to SUBSTRING():
7628 * o substring(text from int for int)
7629 * o substring(text from int) get entire string from starting point "int"
7630 * o substring(text for int) get first "int" characters of string
7631 * o substring(text from pattern) get entire string matching pattern
7632 * o substring(text from pattern for escape) same with specified escape char
7633 * We also want to support generic substring functions which accept
7634 * the usual generic list of arguments. So we will accept both styles
7635 * here, and convert the SQL9x style to the generic list for further
7636 * processing. - thomas 2000-11-28
7639 a_expr substr_from substr_for
7641 $$ = list_make3($1, $2, $3);
7643 | a_expr substr_for substr_from
7645 /* not legal per SQL99, but might as well allow it */
7646 $$ = list_make3($1, $3, $2);
7648 | a_expr substr_from
7650 $$ = list_make2($1, $2);
7655 * Since there are no cases where this syntax allows
7656 * a textual FOR value, we forcibly cast the argument
7657 * to int4. This is a kluge to avoid surprising results
7658 * when the argument is, say, int8. It'd be better if
7659 * there were not an implicit cast from int8 to text ...
7661 A_Const *n = makeNode(A_Const);
7662 n->val.type = T_Integer;
7663 n->val.val.ival = 1;
7664 $$ = list_make3($1, (Node *) n,
7665 makeTypeCast($2, SystemTypeName("int4")));
7676 FROM a_expr { $$ = $2; }
7679 substr_for: FOR a_expr { $$ = $2; }
7682 trim_list: a_expr FROM expr_list { $$ = lappend($3, $1); }
7683 | FROM expr_list { $$ = $2; }
7684 | expr_list { $$ = $1; }
7687 in_expr: select_with_parens
7689 SubLink *n = makeNode(SubLink);
7691 /* other fields will be filled later */
7694 | '(' expr_list ')' { $$ = (Node *)$2; }
7698 * Define SQL92-style case clause.
7699 * - Full specification
7700 * CASE WHEN a = b THEN c ... ELSE d END
7701 * - Implicit argument
7702 * CASE a WHEN b THEN c ... ELSE d END
7704 case_expr: CASE case_arg when_clause_list case_default END_P
7706 CaseExpr *c = makeNode(CaseExpr);
7707 c->casetype = InvalidOid; /* not analyzed yet */
7708 c->arg = (Expr *) $2;
7710 c->defresult = (Expr *) $4;
7716 /* There must be at least one */
7717 when_clause { $$ = list_make1($1); }
7718 | when_clause_list when_clause { $$ = lappend($1, $2); }
7722 WHEN a_expr THEN a_expr
7724 CaseWhen *w = makeNode(CaseWhen);
7725 w->expr = (Expr *) $2;
7726 w->result = (Expr *) $4;
7732 ELSE a_expr { $$ = $2; }
7733 | /*EMPTY*/ { $$ = NULL; }
7736 case_arg: a_expr { $$ = $1; }
7737 | /*EMPTY*/ { $$ = NULL; }
7741 * columnref starts with relation_name not ColId, so that OLD and NEW
7742 * references can be accepted. Note that when there are more than two
7743 * dotted names, the first name is not actually a relation name...
7745 columnref: relation_name
7747 $$ = makeColumnRef($1, NIL);
7749 | relation_name indirection
7751 $$ = makeColumnRef($1, $2);
7758 $$ = (Node *) makeString($2);
7762 $$ = (Node *) makeString("*");
7766 A_Indices *ai = makeNode(A_Indices);
7771 | '[' a_expr ':' a_expr ']'
7773 A_Indices *ai = makeNode(A_Indices);
7781 indirection_el { $$ = list_make1($1); }
7782 | indirection indirection_el { $$ = lappend($1, $2); }
7786 /*EMPTY*/ { $$ = NIL; }
7787 | opt_indirection indirection_el { $$ = lappend($1, $2); }
7790 opt_asymmetric: ASYMMETRIC
7795 /*****************************************************************************
7797 * target lists for SELECT, UPDATE, INSERT
7799 *****************************************************************************/
7802 target_el { $$ = list_make1($1); }
7803 | target_list ',' target_el { $$ = lappend($1, $3); }
7806 /* AS is not optional because shift/red conflict with unary ops */
7807 target_el: a_expr AS ColLabel
7809 $$ = makeNode(ResTarget);
7811 $$->indirection = NIL;
7812 $$->val = (Node *)$1;
7816 $$ = makeNode(ResTarget);
7818 $$->indirection = NIL;
7819 $$->val = (Node *)$1;
7823 ColumnRef *n = makeNode(ColumnRef);
7824 n->fields = list_make1(makeString("*"));
7826 $$ = makeNode(ResTarget);
7828 $$->indirection = NIL;
7829 $$->val = (Node *)n;
7834 update_target_el { $$ = list_make1($1); }
7835 | update_target_list ',' update_target_el { $$ = lappend($1,$3); }
7839 ColId opt_indirection '=' a_expr
7841 $$ = makeNode(ResTarget);
7843 $$->indirection = $2;
7844 $$->val = (Node *) $4;
7846 | ColId opt_indirection '=' DEFAULT
7848 $$ = makeNode(ResTarget);
7850 $$->indirection = $2;
7851 $$->val = (Node *) makeNode(SetToDefault);
7857 insert_target_el { $$ = list_make1($1); }
7858 | insert_target_list ',' insert_target_el { $$ = lappend($1, $3); }
7864 $$ = makeNode(ResTarget);
7866 $$->indirection = NIL;
7867 $$->val = (Node *)$1;
7871 $$ = makeNode(ResTarget);
7873 $$->indirection = NIL;
7874 $$->val = (Node *) makeNode(SetToDefault);
7879 /*****************************************************************************
7881 * Names and constants
7883 *****************************************************************************/
7886 SpecialRuleRelation { $$ = $1; }
7887 | ColId { $$ = $1; }
7890 qualified_name_list:
7891 qualified_name { $$ = list_make1($1); }
7892 | qualified_name_list ',' qualified_name { $$ = lappend($1, $3); }
7896 * The production for a qualified relation name has to exactly match the
7897 * production for a qualified func_name, because in a FROM clause we cannot
7898 * tell which we are parsing until we see what comes after it ('(' for a
7899 * func_name, something else for a relation). Therefore we allow 'indirection'
7900 * which may contain subscripts, and reject that case in the C code.
7905 $$ = makeNode(RangeVar);
7906 $$->catalogname = NULL;
7907 $$->schemaname = NULL;
7910 | relation_name indirection
7912 check_qualified_name($2);
7913 $$ = makeNode(RangeVar);
7914 switch (list_length($2))
7917 $$->catalogname = NULL;
7918 $$->schemaname = $1;
7919 $$->relname = strVal(linitial($2));
7922 $$->catalogname = $1;
7923 $$->schemaname = strVal(linitial($2));
7924 $$->relname = strVal(lsecond($2));
7928 (errcode(ERRCODE_SYNTAX_ERROR),
7929 errmsg("improper qualified name (too many dotted names): %s",
7930 NameListToString(lcons(makeString($1), $2)))));
7937 { $$ = list_make1(makeString($1)); }
7938 | name_list ',' name
7939 { $$ = lappend($1, makeString($3)); }
7943 name: ColId { $$ = $1; };
7951 attr_name: ColLabel { $$ = $1; };
7953 index_name: ColId { $$ = $1; };
7955 file_name: Sconst { $$ = $1; };
7958 * The production for a qualified func_name has to exactly match the
7959 * production for a qualified columnref, because we cannot tell which we
7960 * are parsing until we see what comes after it ('(' for a func_name,
7961 * anything else for a columnref). Therefore we allow 'indirection' which
7962 * may contain subscripts, and reject that case in the C code. (If we
7963 * ever implement SQL99-like methods, such syntax may actually become legal!)
7965 func_name: function_name
7966 { $$ = list_make1(makeString($1)); }
7967 | relation_name indirection
7968 { $$ = check_func_name(lcons(makeString($1), $2)); }
7977 A_Const *n = makeNode(A_Const);
7978 n->val.type = T_Integer;
7979 n->val.val.ival = $1;
7984 A_Const *n = makeNode(A_Const);
7985 n->val.type = T_Float;
7986 n->val.val.str = $1;
7991 A_Const *n = makeNode(A_Const);
7992 n->val.type = T_String;
7993 n->val.val.str = $1;
7998 A_Const *n = makeNode(A_Const);
7999 n->val.type = T_BitString;
8000 n->val.val.str = $1;
8005 /* This is a bit constant per SQL99:
8006 * Without Feature F511, "BIT data type",
8007 * a <general literal> shall not be a
8008 * <bit string literal> or a <hex string literal>.
8010 A_Const *n = makeNode(A_Const);
8011 n->val.type = T_BitString;
8012 n->val.val.str = $1;
8015 | ConstTypename Sconst
8017 A_Const *n = makeNode(A_Const);
8019 n->val.type = T_String;
8020 n->val.val.str = $2;
8023 | ConstInterval Sconst opt_interval
8025 A_Const *n = makeNode(A_Const);
8027 n->val.type = T_String;
8028 n->val.val.str = $2;
8029 /* precision is not specified, but fields may be... */
8030 if ($3 != INTERVAL_FULL_RANGE)
8031 n->typename->typmod = INTERVAL_TYPMOD(INTERVAL_FULL_PRECISION, $3);
8034 | ConstInterval '(' Iconst ')' Sconst opt_interval
8036 A_Const *n = makeNode(A_Const);
8038 n->val.type = T_String;
8039 n->val.val.str = $5;
8040 /* precision specified, and fields may be... */
8043 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
8044 errmsg("INTERVAL(%d) precision must not be negative",
8046 if ($3 > MAX_INTERVAL_PRECISION)
8049 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
8050 errmsg("INTERVAL(%d) precision reduced to maximum allowed, %d",
8051 $3, MAX_INTERVAL_PRECISION)));
8052 $3 = MAX_INTERVAL_PRECISION;
8054 n->typename->typmod = INTERVAL_TYPMOD($3, $6);
8059 $$ = (Node *)makeBoolAConst(TRUE);
8063 $$ = (Node *)makeBoolAConst(FALSE);
8067 A_Const *n = makeNode(A_Const);
8068 n->val.type = T_Null;
8073 Iconst: ICONST { $$ = $1; };
8074 Sconst: SCONST { $$ = $1; };
8075 RoleId: ColId { $$ = $1; };
8077 SignedIconst: ICONST { $$ = $1; }
8078 | '-' ICONST { $$ = - $2; }
8082 * Name classification hierarchy.
8084 * IDENT is the lexeme returned by the lexer for identifiers that match
8085 * no known keyword. In most cases, we can accept certain keywords as
8086 * names, not only IDENTs. We prefer to accept as many such keywords
8087 * as possible to minimize the impact of "reserved words" on programmers.
8088 * So, we divide names into several possible classes. The classification
8089 * is chosen in part to make keywords acceptable as names wherever possible.
8092 /* Column identifier --- names that can be column, table, etc names.
8094 ColId: IDENT { $$ = $1; }
8095 | unreserved_keyword { $$ = pstrdup($1); }
8096 | col_name_keyword { $$ = pstrdup($1); }
8099 /* Type identifier --- names that can be type names.
8101 type_name: IDENT { $$ = $1; }
8102 | unreserved_keyword { $$ = pstrdup($1); }
8105 /* Function identifier --- names that can be function names.
8109 | unreserved_keyword { $$ = pstrdup($1); }
8110 | func_name_keyword { $$ = pstrdup($1); }
8113 /* Column label --- allowed labels in "AS" clauses.
8114 * This presently includes *all* Postgres keywords.
8116 ColLabel: IDENT { $$ = $1; }
8117 | unreserved_keyword { $$ = pstrdup($1); }
8118 | col_name_keyword { $$ = pstrdup($1); }
8119 | func_name_keyword { $$ = pstrdup($1); }
8120 | reserved_keyword { $$ = pstrdup($1); }
8125 * Keyword classification lists. Generally, every keyword present in
8126 * the Postgres grammar should appear in exactly one of these lists.
8128 * Put a new keyword into the first list that it can go into without causing
8129 * shift or reduce conflicts. The earlier lists define "less reserved"
8130 * categories of keywords.
8133 /* "Unreserved" keywords --- available for use as any kind of name.
8345 /* Column identifier --- keywords that can be column, table, etc names.
8347 * Many of these keywords will in fact be recognized as type or function
8348 * names too; but they have special productions for the purpose, and so
8349 * can't be treated as "generic" type or function names.
8351 * The type names appearing here are not usable as function names
8352 * because they can be followed by '(' in typename productions, which
8353 * looks too much like a function call for an LR(1) parser.
8395 /* Function identifier --- keywords that can be function names.
8397 * Most of these are keywords that are used as operators in expressions;
8398 * in general such keywords can't be column names because they would be
8399 * ambiguous with variables, but they are unambiguous as function identifiers.
8401 * Do not include POSITION, SUBSTRING, etc here since they have explicit
8402 * productions in a_expr to support the goofy SQL9x argument syntax.
8403 * - thomas 2000-11-28
8428 /* Reserved keyword --- these keywords are usable only as a ColLabel.
8430 * Keywords appear here if they could not be distinguished from variable,
8431 * type, or function names in some contexts. Don't put things here unless
8511 SpecialRuleRelation:
8518 (errcode(ERRCODE_SYNTAX_ERROR),
8519 errmsg("OLD used in query that is not in a rule")));
8527 (errcode(ERRCODE_SYNTAX_ERROR),
8528 errmsg("NEW used in query that is not in a rule")));
8535 makeColumnRef(char *relname, List *indirection)
8538 * Generate a ColumnRef node, with an A_Indirection node added if there
8539 * is any subscripting in the specified indirection list. However,
8540 * any field selection at the start of the indirection list must be
8541 * transposed into the "fields" part of the ColumnRef node.
8543 ColumnRef *c = makeNode(ColumnRef);
8547 foreach(l, indirection)
8549 if (IsA(lfirst(l), A_Indices))
8551 A_Indirection *i = makeNode(A_Indirection);
8555 /* easy case - all indirection goes to A_Indirection */
8556 c->fields = list_make1(makeString(relname));
8557 i->indirection = indirection;
8561 /* got to split the list in two */
8562 i->indirection = list_copy_tail(indirection, nfields);
8563 indirection = list_truncate(indirection, nfields);
8564 c->fields = lcons(makeString(relname), indirection);
8566 i->arg = (Node *) c;
8571 /* No subscripting, so all indirection gets added to field list */
8572 c->fields = lcons(makeString(relname), indirection);
8577 makeTypeCast(Node *arg, TypeName *typename)
8580 * Simply generate a TypeCast node.
8582 * Earlier we would determine whether an A_Const would
8583 * be acceptable, however Domains require coerce_type()
8584 * to process them -- applying constraints as required.
8586 TypeCast *n = makeNode(TypeCast);
8588 n->typename = typename;
8593 makeStringConst(char *str, TypeName *typename)
8595 A_Const *n = makeNode(A_Const);
8597 n->val.type = T_String;
8598 n->val.val.str = str;
8599 n->typename = typename;
8605 makeIntConst(int val)
8607 A_Const *n = makeNode(A_Const);
8608 n->val.type = T_Integer;
8609 n->val.val.ival = val;
8610 n->typename = SystemTypeName("int4");
8616 makeFloatConst(char *str)
8618 A_Const *n = makeNode(A_Const);
8620 n->val.type = T_Float;
8621 n->val.val.str = str;
8622 n->typename = SystemTypeName("float8");
8628 makeAConst(Value *v)
8635 n = makeFloatConst(v->val.str);
8639 n = makeIntConst(v->val.ival);
8644 n = makeStringConst(v->val.str, NULL);
8652 * Create a DefElem node and set contents.
8653 * Could be moved to nodes/makefuncs.c if this is useful elsewhere.
8656 makeDefElem(char *name, Node *arg)
8658 DefElem *f = makeNode(DefElem);
8665 * Create an A_Const node and initialize to a boolean constant.
8668 makeBoolAConst(bool state)
8670 A_Const *n = makeNode(A_Const);
8671 n->val.type = T_String;
8672 n->val.val.str = (state? "t": "f");
8673 n->typename = SystemTypeName("bool");
8677 /* makeRowNullTest()
8678 * Generate separate operator nodes for a single row descriptor test.
8680 * Eventually this should be eliminated in favor of making the NullTest
8681 * node type capable of handling it directly.
8684 makeRowNullTest(NullTestType test, RowExpr *row)
8686 Node *result = NULL;
8689 foreach(arg, row->args)
8693 n = makeNode(NullTest);
8694 n->arg = (Expr *) lfirst(arg);
8695 n->nulltesttype = test;
8698 result = (Node *) n;
8699 else if (test == IS_NOT_NULL)
8700 result = (Node *) makeA_Expr(AEXPR_OR, NIL, result, (Node *)n);
8702 result = (Node *) makeA_Expr(AEXPR_AND, NIL, result, (Node *)n);
8707 /* zero-length rows? Generate constant TRUE or FALSE */
8708 result = (Node *) makeBoolAConst(test == IS_NULL);
8715 * Create and populate a FuncCall node to support the OVERLAPS operator.
8718 makeOverlaps(List *largs, List *rargs)
8720 FuncCall *n = makeNode(FuncCall);
8721 n->funcname = SystemFuncName("overlaps");
8722 if (list_length(largs) == 1)
8723 largs = lappend(largs, largs);
8724 else if (list_length(largs) != 2)
8726 (errcode(ERRCODE_SYNTAX_ERROR),
8727 errmsg("wrong number of parameters on left side of OVERLAPS expression")));
8728 if (list_length(rargs) == 1)
8729 rargs = lappend(rargs, rargs);
8730 else if (list_length(rargs) != 2)
8732 (errcode(ERRCODE_SYNTAX_ERROR),
8733 errmsg("wrong number of parameters on right side of OVERLAPS expression")));
8734 n->args = list_concat(largs, rargs);
8735 n->agg_star = FALSE;
8736 n->agg_distinct = FALSE;
8740 /* check_qualified_name --- check the result of qualified_name production
8742 * It's easiest to let the grammar production for qualified_name allow
8743 * subscripts and '*', which we then must reject here.
8746 check_qualified_name(List *names)
8752 if (!IsA(lfirst(i), String))
8753 yyerror("syntax error");
8754 else if (strcmp(strVal(lfirst(i)), "*") == 0)
8755 yyerror("syntax error");
8759 /* check_func_name --- check the result of func_name production
8761 * It's easiest to let the grammar production for func_name allow subscripts
8762 * and '*', which we then must reject here.
8765 check_func_name(List *names)
8771 if (!IsA(lfirst(i), String))
8772 yyerror("syntax error");
8773 else if (strcmp(strVal(lfirst(i)), "*") == 0)
8774 yyerror("syntax error");
8779 /* extractArgTypes()
8780 * Given a list of FunctionParameter nodes, extract a list of just the
8781 * argument types (TypeNames) for input parameters only. This is what
8782 * is needed to look up an existing function, which is what is wanted by
8783 * the productions that use this call.
8786 extractArgTypes(List *parameters)
8791 foreach(i, parameters)
8793 FunctionParameter *p = (FunctionParameter *) lfirst(i);
8795 if (p->mode != FUNC_PARAM_OUT) /* keep if IN or INOUT */
8796 result = lappend(result, p->argType);
8801 /* findLeftmostSelect()
8802 * Find the leftmost component SelectStmt in a set-operation parsetree.
8805 findLeftmostSelect(SelectStmt *node)
8807 while (node && node->op != SETOP_NONE)
8809 Assert(node && IsA(node, SelectStmt) && node->larg == NULL);
8813 /* insertSelectOptions()
8814 * Insert ORDER BY, etc into an already-constructed SelectStmt.
8816 * This routine is just to avoid duplicating code in SelectStmt productions.
8819 insertSelectOptions(SelectStmt *stmt,
8820 List *sortClause, Node *lockingClause,
8821 Node *limitOffset, Node *limitCount)
8824 * Tests here are to reject constructs like
8825 * (SELECT foo ORDER BY bar) ORDER BY baz
8829 if (stmt->sortClause)
8831 (errcode(ERRCODE_SYNTAX_ERROR),
8832 errmsg("multiple ORDER BY clauses not allowed")));
8833 stmt->sortClause = sortClause;
8837 if (stmt->lockingClause)
8839 (errcode(ERRCODE_SYNTAX_ERROR),
8840 errmsg("multiple FOR UPDATE/FOR SHARE clauses not allowed")));
8841 stmt->lockingClause = (LockingClause *) lockingClause;
8845 if (stmt->limitOffset)
8847 (errcode(ERRCODE_SYNTAX_ERROR),
8848 errmsg("multiple OFFSET clauses not allowed")));
8849 stmt->limitOffset = limitOffset;
8853 if (stmt->limitCount)
8855 (errcode(ERRCODE_SYNTAX_ERROR),
8856 errmsg("multiple LIMIT clauses not allowed")));
8857 stmt->limitCount = limitCount;
8862 makeSetOp(SetOperation op, bool all, Node *larg, Node *rarg)
8864 SelectStmt *n = makeNode(SelectStmt);
8868 n->larg = (SelectStmt *) larg;
8869 n->rarg = (SelectStmt *) rarg;
8874 * Build a properly-qualified reference to a built-in function.
8877 SystemFuncName(char *name)
8879 return list_make2(makeString("pg_catalog"), makeString(name));
8883 * Build a properly-qualified reference to a built-in type.
8885 * typmod is defaulted, but may be changed afterwards by caller.
8888 SystemTypeName(char *name)
8890 TypeName *n = makeNode(TypeName);
8892 n->names = list_make2(makeString("pg_catalog"), makeString(name));
8898 * Initialize to parse one query string
8903 QueryIsRule = FALSE;
8906 /* exprIsNullConstant()
8907 * Test whether an a_expr is a plain NULL constant or not.
8910 exprIsNullConstant(Node *arg)
8912 if (arg && IsA(arg, A_Const))
8914 A_Const *con = (A_Const *) arg;
8916 if (con->val.type == T_Null &&
8917 con->typename == NULL)
8924 * Handle negation of a numeric constant.
8926 * Formerly, we did this here because the optimizer couldn't cope with
8927 * indexquals that looked like "var = -4" --- it wants "var = const"
8928 * and a unary minus operator applied to a constant didn't qualify.
8929 * As of Postgres 7.0, that problem doesn't exist anymore because there
8930 * is a constant-subexpression simplifier in the optimizer. However,
8931 * there's still a good reason for doing this here, which is that we can
8932 * postpone committing to a particular internal representation for simple
8933 * negative constants. It's better to leave "-123.456" in string form
8934 * until we know what the desired type is.
8939 if (IsA(n, A_Const))
8941 A_Const *con = (A_Const *)n;
8943 if (con->val.type == T_Integer)
8945 con->val.val.ival = -con->val.val.ival;
8948 if (con->val.type == T_Float)
8950 doNegateFloat(&con->val);
8955 return (Node *) makeSimpleA_Expr(AEXPR_OP, "-", NULL, n);
8959 doNegateFloat(Value *v)
8961 char *oldval = v->val.str;
8963 Assert(IsA(v, Float));
8967 v->val.str = oldval+1; /* just strip the '-' */
8970 char *newval = (char *) palloc(strlen(oldval) + 2);
8973 strcpy(newval+1, oldval);
8974 v->val.str = newval;