Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
Postgres FD Implementation
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Abuhujair Javed
Postgres FD Implementation
Commits
42423c71
Commit
42423c71
authored
Jun 17, 2002
by
Bruce Momjian
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Manually indent gram.y to be consistent.
parent
134a1c81
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
1905 additions
and
1833 deletions
+1905
-1833
src/backend/parser/gram.y
src/backend/parser/gram.y
+1905
-1833
No files found.
src/backend/parser/gram.y
View file @
42423c71
%{
%{
/*#define YYDEBUG 1*/
/*-------------------------------------------------------------------------
...
...
@@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.32
5 2002/06/17 07:00:24
momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.32
6 2002/06/17 20:27:43
momjian Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
...
...
@@ -186,8 +186,7 @@ static void doNegateFloat(Value *v);
%type <range> qualified_name, OptConstrFromTable
%type <str> opt_id,
all_Op, MathOp, opt_name, SpecialRuleRelation
%type <str> opt_id, all_Op, MathOp, opt_name, SpecialRuleRelation
%type <str> opt_level, opt_encoding
%type <node> grantee
...
...
@@ -431,8 +430,7 @@ static void doNegateFloat(Value *v);
* psql already handles such cases, but other interfaces don't.
* bjm 1999/10/05
*/
stmtblock: stmtmulti
{ parsetree = $1; }
stmtblock: stmtmulti { parsetree = $1; }
;
/* the thrashing around here is to discard "empty" statements... */
...
...
@@ -450,7 +448,8 @@ stmtmulti: stmtmulti ';' stmt
}
;
stmt : AlterDatabaseSetStmt
stmt :
AlterDatabaseSetStmt
| AlterGroupStmt
| AlterSchemaStmt
| AlterTableStmt
...
...
@@ -520,7 +519,8 @@ stmt : AlterDatabaseSetStmt
*
*****************************************************************************/
CreateUserStmt: CREATE USER UserId opt_with OptUserList
CreateUserStmt:
CREATE USER UserId opt_with OptUserList
{
CreateUserStmt *n = makeNode(CreateUserStmt);
n->user = $3;
...
...
@@ -541,7 +541,8 @@ opt_with: WITH { $$ = TRUE; }
*
*****************************************************************************/
AlterUserStmt: ALTER USER UserId opt_with OptUserList
AlterUserStmt:
ALTER USER UserId opt_with OptUserList
{
AlterUserStmt *n = makeNode(AlterUserStmt);
n->user = $3;
...
...
@@ -551,7 +552,8 @@ AlterUserStmt: ALTER USER UserId opt_with OptUserList
;
AlterUserSetStmt: ALTER USER UserId SET set_rest
AlterUserSetStmt:
ALTER USER UserId SET set_rest
{
AlterUserSetStmt *n = makeNode(AlterUserSetStmt);
n->user = $3;
...
...
@@ -577,7 +579,8 @@ AlterUserSetStmt: ALTER USER UserId SET set_rest
*
*****************************************************************************/
DropUserStmt: DROP USER user_list
DropUserStmt:
DROP USER user_list
{
DropUserStmt *n = makeNode(DropUserStmt);
n->users = $3;
...
...
@@ -588,11 +591,13 @@ DropUserStmt: DROP USER user_list
/*
* Options for CREATE USER and ALTER USER
*/
OptUserList: OptUserList OptUserElem { $$ = lappend($1, $2); }
OptUserList:
OptUserList OptUserElem { $$ = lappend($1, $2); }
| /* EMPTY */ { $$ = NIL; }
;
OptUserElem: PASSWORD Sconst
OptUserElem:
PASSWORD Sconst
{
$$ = makeNode(DefElem);
$$->defname = "password";
...
...
@@ -673,7 +678,8 @@ user_list: user_list ',' UserId
*
*****************************************************************************/
CreateGroupStmt: CREATE GROUP_P UserId opt_with OptGroupList
CreateGroupStmt:
CREATE GROUP_P UserId opt_with OptGroupList
{
CreateGroupStmt *n = makeNode(CreateGroupStmt);
n->name = $3;
...
...
@@ -685,11 +691,13 @@ CreateGroupStmt: CREATE GROUP_P UserId opt_with OptGroupList
/*
* Options for CREATE GROUP
*/
OptGroupList: OptGroupList OptGroupElem { $$ = lappend($1, $2); }
OptGroupList:
OptGroupList OptGroupElem { $$ = lappend($1, $2); }
| /* EMPTY */ { $$ = NIL; }
;
OptGroupElem: USER user_list
OptGroupElem:
USER user_list
{
$$ = makeNode(DefElem);
$$->defname = "userElts";
...
...
@@ -711,7 +719,8 @@ OptGroupElem: USER user_list
*
*****************************************************************************/
AlterGroupStmt: ALTER GROUP_P UserId add_drop USER user_list
AlterGroupStmt:
ALTER GROUP_P UserId add_drop USER user_list
{
AlterGroupStmt *n = makeNode(AlterGroupStmt);
n->name = $3;
...
...
@@ -733,7 +742,8 @@ add_drop: ADD { $$ = +1; }
*
*****************************************************************************/
DropGroupStmt: DROP GROUP_P UserId
DropGroupStmt:
DROP GROUP_P UserId
{
DropGroupStmt *n = makeNode(DropGroupStmt);
n->name = $3;
...
...
@@ -749,7 +759,8 @@ DropGroupStmt: DROP GROUP_P UserId
*
*****************************************************************************/
CreateSchemaStmt: CREATE SCHEMA OptSchemaName AUTHORIZATION UserId OptSchemaEltList
CreateSchemaStmt:
CREATE SCHEMA OptSchemaName AUTHORIZATION UserId OptSchemaEltList
{
CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
/* One can omit the schema name or the authorization id... */
...
...
@@ -772,23 +783,27 @@ CreateSchemaStmt: CREATE SCHEMA OptSchemaName AUTHORIZATION UserId OptSchemaElt
}
;
AlterSchemaStmt: ALTER SCHEMA ColId
AlterSchemaStmt:
ALTER SCHEMA ColId
{
elog(ERROR, "ALTER SCHEMA not yet supported");
}
;
DropSchemaStmt: DROP SCHEMA ColId
DropSchemaStmt:
DROP SCHEMA ColId
{
elog(ERROR, "DROP SCHEMA not yet supported");
}
;
OptSchemaName: ColId { $$ = $1; }
OptSchemaName:
ColId { $$ = $1; }
| /* EMPTY */ { $$ = NULL; }
;
OptSchemaEltList: OptSchemaEltList schema_stmt { $$ = lappend($1, $2); }
OptSchemaEltList:
OptSchemaEltList schema_stmt { $$ = lappend($1, $2); }
| /* EMPTY */ { $$ = NIL; }
;
...
...
@@ -796,7 +811,8 @@ OptSchemaEltList: OptSchemaEltList schema_stmt { $$ = lappend($1, $2); }
* schema_stmt are the ones that can show up inside a CREATE SCHEMA
* statement (in addition to by themselves).
*/
schema_stmt: CreateStmt
schema_stmt:
CreateStmt
| GrantStmt
| ViewStmt
;
...
...
@@ -811,7 +827,8 @@ schema_stmt: CreateStmt
*
*****************************************************************************/
VariableSetStmt: SET set_rest
VariableSetStmt:
SET set_rest
{
VariableSetStmt *n = $2;
n->is_local = false;
...
...
@@ -891,16 +908,14 @@ set_rest: ColId TO var_list_or_default
}
;
var_list_or_default: var_list
{ $$ = $1; }
| DEFAULT
{ $$ = NIL; }
var_list_or_default:
var_list { $$ = $1; }
| DEFAULT { $$ = NIL; }
;
var_list: var_value
{ $$ = makeList1($1); }
| var_list ',' var_value
{ $$ = lappend($1, $3); }
var_list:
var_value { $$ = makeList1($1); }
| var_list ',' var_value { $$ = lappend($1, $3); }
;
var_value: opt_boolean
...
...
@@ -915,7 +930,8 @@ opt_level: READ COMMITTED { $$ = "read committed"; }
| SERIALIZABLE { $$ = "serializable"; }
;
opt_boolean: TRUE_P { $$ = "true"; }
opt_boolean:
TRUE_P { $$ = "true"; }
| FALSE_P { $$ = "false"; }
| ON { $$ = "on"; }
| OFF { $$ = "off"; }
...
...
@@ -929,7 +945,8 @@ opt_boolean: TRUE_P { $$ = "true"; }
* ColId gives reduce/reduce errors against ConstInterval and LOCAL,
* so use IDENT and reject anything which is a reserved word.
*/
zone_value: Sconst
zone_value:
Sconst
{
$$ = makeStringConst($1, NULL);
}
...
...
@@ -943,7 +960,8 @@ zone_value: Sconst
if ($3 != -1)
{
if (($3 & ~(MASK(HOUR) | MASK(MINUTE))) != 0)
elog(ERROR, "Time zone interval must be HOUR or HOUR TO MINUTE");
elog(ERROR,
"Time zone interval must be HOUR or HOUR TO MINUTE");
n->typename->typmod = ((($3 & 0x7FFF) << 16) | 0xFFFF);
}
$$ = (Node *)n;
...
...
@@ -952,12 +970,14 @@ zone_value: Sconst
{
A_Const *n = (A_Const *) makeStringConst($5, $1);
if (($3 < 0) || ($3 > MAX_INTERVAL_PRECISION))
elog(ERROR, "INTERVAL(%d) precision must be between %d and %d",
elog(ERROR,
"INTERVAL(%d) precision must be between %d and %d",
$3, 0, MAX_INTERVAL_PRECISION);
if ($6 != -1)
{
if (($6 & ~(MASK(HOUR) | MASK(MINUTE))) != 0)
elog(ERROR, "Time zone interval must be HOUR or HOUR TO MINUTE");
elog(ERROR,
"Time zone interval must be HOUR or HOUR TO MINUTE");
n->typename->typmod = ((($6 & 0x7FFF) << 16) | $3);
}
else
...
...
@@ -972,17 +992,20 @@ zone_value: Sconst
| LOCAL { $$ = NULL; }
;
opt_encoding: Sconst { $$ = $1; }
opt_encoding:
Sconst { $$ = $1; }
| DEFAULT { $$ = NULL; }
| /*EMPTY*/ { $$ = NULL; }
;
ColId_or_Sconst: ColId { $$ = $1; }
ColId_or_Sconst:
ColId { $$ = $1; }
| SCONST { $$ = $1; }
;
VariableShowStmt: SHOW ColId
VariableShowStmt:
SHOW ColId
{
VariableShowStmt *n = makeNode(VariableShowStmt);
n->name = $2;
...
...
@@ -1014,7 +1037,8 @@ VariableShowStmt: SHOW ColId
}
;
VariableResetStmt: RESET ColId
VariableResetStmt:
RESET ColId
{
VariableResetStmt *n = makeNode(VariableResetStmt);
n->name = $2;
...
...
@@ -1047,7 +1071,8 @@ VariableResetStmt: RESET ColId
;
ConstraintsSetStmt: SET CONSTRAINTS constraints_set_list constraints_set_mode
ConstraintsSetStmt:
SET CONSTRAINTS constraints_set_list constraints_set_mode
{
ConstraintsSetStmt *n = makeNode(ConstraintsSetStmt);
n->constraints = $3;
...
...
@@ -1056,11 +1081,13 @@ ConstraintsSetStmt: SET CONSTRAINTS constraints_set_list constraints_set_mode
}
;
constraints_set_list: ALL { $$ = NIL; }
constraints_set_list:
ALL { $$ = NIL; }
| name_list { $$ = $1; }
;
constraints_set_mode: DEFERRED { $$ = TRUE; }
constraints_set_mode:
DEFERRED { $$ = TRUE; }
| IMMEDIATE { $$ = FALSE; }
;
...
...
@@ -1068,13 +1095,15 @@ constraints_set_mode: DEFERRED { $$ = TRUE; }
/*
* Checkpoint statement
*/
CheckPointStmt: CHECKPOINT
CheckPointStmt:
CHECKPOINT
{
CheckPointStmt *n = makeNode(CheckPointStmt);
$$ = (Node *)n;
}
;
/*****************************************************************************
*
* ALTER TABLE variations
...
...
@@ -1082,7 +1111,7 @@ CheckPointStmt: CHECKPOINT
*****************************************************************************/
AlterTableStmt:
/* ALTER TABLE <relation> ADD [COLUMN] <coldef> */
/* ALTER TABLE <relation> ADD [COLUMN] <coldef> */
ALTER TABLE relation_expr ADD opt_column columnDef
{
AlterTableStmt *n = makeNode(AlterTableStmt);
...
...
@@ -1091,7 +1120,7 @@ AlterTableStmt:
n->def = $6;
$$ = (Node *)n;
}
/* ALTER TABLE <relation> ALTER [COLUMN] <colname> {SET DEFAULT <expr>|DROP DEFAULT} */
/* ALTER TABLE <relation> ALTER [COLUMN] <colname> {SET DEFAULT <expr>|DROP DEFAULT} */
| ALTER TABLE relation_expr ALTER opt_column ColId alter_column_default
{
AlterTableStmt *n = makeNode(AlterTableStmt);
...
...
@@ -1101,7 +1130,7 @@ AlterTableStmt:
n->def = $7;
$$ = (Node *)n;
}
/* ALTER TABLE <relation> ALTER [COLUMN] <colname> DROP NOT NULL */
/* ALTER TABLE <relation> ALTER [COLUMN] <colname> DROP NOT NULL */
| ALTER TABLE relation_expr ALTER opt_column ColId DROP NOT NULL_P
{
AlterTableStmt *n = makeNode(AlterTableStmt);
...
...
@@ -1110,7 +1139,7 @@ AlterTableStmt:
n->name = $6;
$$ = (Node *)n;
}
/* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET NOT NULL */
/* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET NOT NULL */
| ALTER TABLE relation_expr ALTER opt_column ColId SET NOT NULL_P
{
AlterTableStmt *n = makeNode(AlterTableStmt);
...
...
@@ -1119,7 +1148,7 @@ AlterTableStmt:
n->name = $6;
$$ = (Node *)n;
}
/* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET STATISTICS <Iconst> */
/* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET STATISTICS <Iconst> */
| ALTER TABLE relation_expr ALTER opt_column ColId SET STATISTICS Iconst
{
AlterTableStmt *n = makeNode(AlterTableStmt);
...
...
@@ -1129,7 +1158,7 @@ AlterTableStmt:
n->def = (Node *) makeInteger($9);
$$ = (Node *)n;
}
/* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET STORAGE <storagemode> */
/* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET STORAGE <storagemode> */
| ALTER TABLE relation_expr ALTER opt_column ColId SET STORAGE ColId
{
AlterTableStmt *n = makeNode(AlterTableStmt);
...
...
@@ -1139,7 +1168,7 @@ AlterTableStmt:
n->def = (Node *) makeString($9);
$$ = (Node *)n;
}
/* ALTER TABLE <relation> DROP [COLUMN] <colname> {RESTRICT|CASCADE} */
/* ALTER TABLE <relation> DROP [COLUMN] <colname> {RESTRICT|CASCADE} */
| ALTER TABLE relation_expr DROP opt_column ColId drop_behavior
{
AlterTableStmt *n = makeNode(AlterTableStmt);
...
...
@@ -1149,7 +1178,7 @@ AlterTableStmt:
n->behavior = $7;
$$ = (Node *)n;
}
/* ALTER TABLE <relation> ADD CONSTRAINT ... */
/* ALTER TABLE <relation> ADD CONSTRAINT ... */
| ALTER TABLE relation_expr ADD TableConstraint
{
AlterTableStmt *n = makeNode(AlterTableStmt);
...
...
@@ -1158,7 +1187,7 @@ AlterTableStmt:
n->def = $5;
$$ = (Node *)n;
}
/* ALTER TABLE <relation> DROP CONSTRAINT <name> {RESTRICT|CASCADE} */
/* ALTER TABLE <relation> DROP CONSTRAINT <name> {RESTRICT|CASCADE} */
| ALTER TABLE relation_expr DROP CONSTRAINT name drop_behavior
{
AlterTableStmt *n = makeNode(AlterTableStmt);
...
...
@@ -1168,7 +1197,7 @@ AlterTableStmt:
n->behavior = $7;
$$ = (Node *)n;
}
/* ALTER TABLE <name> CREATE TOAST TABLE */
/* ALTER TABLE <name> CREATE TOAST TABLE */
| ALTER TABLE qualified_name CREATE TOAST TABLE
{
AlterTableStmt *n = makeNode(AlterTableStmt);
...
...
@@ -1177,7 +1206,7 @@ AlterTableStmt:
n->relation = $3;
$$ = (Node *)n;
}
/* ALTER TABLE <name> OWNER TO UserId */
/* ALTER TABLE <name> OWNER TO UserId */
| ALTER TABLE qualified_name OWNER TO UserId
{
AlterTableStmt *n = makeNode(AlterTableStmt);
...
...
@@ -1201,11 +1230,13 @@ alter_column_default:
| DROP DEFAULT { $$ = NULL; }
;
drop_behavior: CASCADE { $$ = CASCADE; }
drop_behavior:
CASCADE { $$ = CASCADE; }
| RESTRICT { $$ = RESTRICT; }
;
opt_drop_behavior: CASCADE { $$ = CASCADE; }
opt_drop_behavior:
CASCADE { $$ = CASCADE; }
| RESTRICT { $$ = RESTRICT; }
| /* EMPTY */ { $$ = RESTRICT; /* default */ }
;
...
...
@@ -1219,7 +1250,8 @@ opt_drop_behavior: CASCADE { $$ = CASCADE; }
*
*****************************************************************************/
ClosePortalStmt: CLOSE opt_id
ClosePortalStmt:
CLOSE opt_id
{
ClosePortalStmt *n = makeNode(ClosePortalStmt);
n->portalname = $2;
...
...
@@ -1254,10 +1286,8 @@ CopyStmt: COPY opt_binary qualified_name opt_with_copy copy_dirn copy_file_name
}
;
copy_dirn: TO
{ $$ = TO; }
| FROM
{ $$ = FROM; }
copy_dirn: TO { $$ = TO; }
| FROM { $$ = FROM; }
;
/*
...
...
@@ -1265,7 +1295,8 @@ copy_dirn: TO
* used depends on the direction. (It really doesn't make sense to copy from
* stdout. We silently correct the "typo". - AY 9/94
*/
copy_file_name: Sconst { $$ = $1; }
copy_file_name:
Sconst { $$ = $1; }
| STDIN { $$ = NULL; }
| STDOUT { $$ = NULL; }
;
...
...
@@ -1274,14 +1305,16 @@ opt_binary: BINARY { $$ = TRUE; }
| /*EMPTY*/ { $$ = FALSE; }
;
opt_with_copy: WITH OIDS { $$ = TRUE; }
opt_with_copy:
WITH OIDS { $$ = TRUE; }
| /*EMPTY*/ { $$ = FALSE; }
;
/*
* the default copy delimiter is tab but the user can configure it
*/
copy_delimiter: opt_using DELIMITERS Sconst { $$ = $3; }
copy_delimiter:
opt_using DELIMITERS Sconst { $$ = $3; }
| /*EMPTY*/ { $$ = "\t"; }
;
...
...
@@ -1334,7 +1367,8 @@ OptTemp: TEMPORARY { $$ = TRUE; }
| /*EMPTY*/ { $$ = FALSE; }
;
OptTableElementList: OptTableElementList ',' OptTableElement
OptTableElementList:
OptTableElementList ',' OptTableElement
{
if ($3 != NULL)
$$ = lappend($1, $3);
...
...
@@ -1351,7 +1385,8 @@ OptTableElementList: OptTableElementList ',' OptTableElement
| /*EMPTY*/ { $$ = NIL; }
;
OptTableElement: columnDef { $$ = $1; }
OptTableElement:
columnDef { $$ = $1; }
| TableConstraint { $$ = $1; }
;
...
...
@@ -1370,7 +1405,8 @@ columnDef: ColId Typename ColQualList opt_collate
}
;
ColQualList: ColQualList ColConstraint { $$ = lappend($1, $2); }
ColQualList:
ColQualList ColConstraint { $$ = lappend($1, $2); }
| /*EMPTY*/ { $$ = NIL; }
;
...
...
@@ -1396,10 +1432,8 @@ ColConstraint:
}
$$ = $3;
}
| ColConstraintElem
{ $$ = $1; }
| ConstraintAttr
{ $$ = $1; }
| ColConstraintElem { $$ = $1; }
| ConstraintAttr { $$ = $1; }
;
/* DEFAULT NULL is already the default for Postgres.
...
...
@@ -1512,7 +1546,8 @@ ColConstraintElem:
* See also ConstraintAttributeSpec, which can be used in places where
* there is no parsing conflict.
*/
ConstraintAttr: DEFERRABLE
ConstraintAttr:
DEFERRABLE
{
Constraint *n = makeNode(Constraint);
n->contype = CONSTR_ATTR_DEFERRABLE;
...
...
@@ -1543,7 +1578,8 @@ ConstraintAttr: DEFERRABLE
* a column definition. ColConstraintElem specifies the embedded form.
* - thomas 1997-12-03
*/
TableConstraint: CONSTRAINT name ConstraintElem
TableConstraint:
CONSTRAINT name ConstraintElem
{
switch (nodeTag($3))
{
...
...
@@ -1564,11 +1600,11 @@ TableConstraint: CONSTRAINT name ConstraintElem
}
$$ = $3;
}
| ConstraintElem
{ $$ = $1; }
| ConstraintElem { $$ = $1; }
;
ConstraintElem: CHECK '(' a_expr ')'
ConstraintElem:
CHECK '(' a_expr ')'
{
Constraint *n = makeNode(Constraint);
n->contype = CONSTR_CHECK;
...
...
@@ -1613,14 +1649,13 @@ ConstraintElem: CHECK '(' a_expr ')'
}
;
opt_column_list: '(' columnList ')' { $$ = $2; }
opt_column_list:
'(' columnList ')' { $$ = $2; }
| /*EMPTY*/ { $$ = NIL; }
;
columnList: columnList ',' columnElem
{ $$ = lappend($1, $3); }
| columnElem
{ $$ = makeList1($1); }
columnList: columnList ',' columnElem { $$ = lappend($1, $3); }
| columnElem { $$ = makeList1($1); }
;
columnElem: ColId
...
...
@@ -1631,10 +1666,7 @@ columnElem: ColId
}
;
key_match: MATCH FULL
{
$$ = "FULL";
}
key_match: MATCH FULL { $$ = "FULL"; }
| MATCH PARTIAL
{
elog(ERROR, "FOREIGN KEY/MATCH PARTIAL not yet implemented");
...
...
@@ -1646,7 +1678,8 @@ key_match: MATCH FULL
}
;
key_actions: key_delete { $$ = $1; }
key_actions:
key_delete { $$ = $1; }
| key_update { $$ = $1; }
| key_delete key_update { $$ = $1 | $2; }
| key_update key_delete { $$ = $1 | $2; }
...
...
@@ -1659,7 +1692,8 @@ key_delete: ON DELETE_P key_reference { $$ = $3 << FKCONSTR_ON_DELETE_SHIFT; }
key_update: ON UPDATE key_reference { $$ = $3 << FKCONSTR_ON_UPDATE_SHIFT; }
;
key_reference: NO ACTION { $$ = FKCONSTR_ON_KEY_NOACTION; }
key_reference:
NO ACTION { $$ = FKCONSTR_ON_KEY_NOACTION; }
| RESTRICT { $$ = FKCONSTR_ON_KEY_RESTRICT; }
| CASCADE { $$ = FKCONSTR_ON_KEY_CASCADE; }
| SET NULL_P { $$ = FKCONSTR_ON_KEY_SETNULL; }
...
...
@@ -1670,7 +1704,8 @@ OptInherit: INHERITS '(' qualified_name_list ')' { $$ = $3; }
| /*EMPTY*/ { $$ = NIL; }
;
OptWithOids: WITH OIDS { $$ = TRUE; }
OptWithOids:
WITH OIDS { $$ = TRUE; }
| WITHOUT OIDS { $$ = FALSE; }
| /*EMPTY*/ { $$ = TRUE; }
;
...
...
@@ -1681,7 +1716,8 @@ OptWithOids: WITH OIDS { $$ = TRUE; }
* SELECT ... INTO.
*/
CreateAsStmt: CREATE OptTemp TABLE qualified_name OptCreateAs AS SelectStmt
CreateAsStmt:
CREATE OptTemp TABLE qualified_name OptCreateAs AS SelectStmt
{
/*
* When the SelectStmt is a set-operation tree, we must
...
...
@@ -1700,15 +1736,18 @@ CreateAsStmt: CREATE OptTemp TABLE qualified_name OptCreateAs AS SelectStmt
}
;
OptCreateAs: '(' CreateAsList ')' { $$ = $2; }
OptCreateAs:
'(' CreateAsList ')' { $$ = $2; }
| /*EMPTY*/ { $$ = NIL; }
;
CreateAsList: CreateAsList ',' CreateAsElement { $$ = lappend($1, $3); }
CreateAsList:
CreateAsList ',' CreateAsElement { $$ = lappend($1, $3); }
| CreateAsElement { $$ = makeList1($1); }
;
CreateAsElement: ColId
CreateAsElement:
ColId
{
ColumnDef *n = makeNode(ColumnDef);
n->colname = $1;
...
...
@@ -1729,7 +1768,8 @@ CreateAsElement: ColId
*
*****************************************************************************/
CreateSeqStmt: CREATE OptTemp SEQUENCE qualified_name OptSeqList
CreateSeqStmt:
CREATE OptTemp SEQUENCE qualified_name OptSeqList
{
CreateSeqStmt *n = makeNode(CreateSeqStmt);
$4->istemp = $2;
...
...
@@ -1739,8 +1779,7 @@ CreateSeqStmt: CREATE OptTemp SEQUENCE qualified_name OptSeqList
}
;
OptSeqList: OptSeqList OptSeqElem
{ $$ = lappend($1, $2); }
OptSeqList: OptSeqList OptSeqElem { $$ = lappend($1, $2); }
| { $$ = NIL; }
;
...
...
@@ -1782,14 +1821,12 @@ OptSeqElem: CACHE NumericOnly
}
;
NumericOnly: FloatOnly { $$ = $1; }
NumericOnly:
FloatOnly { $$ = $1; }
| IntegerOnly { $$ = $1; }
;
FloatOnly: FCONST
{
$$ = makeFloat($1);
}
FloatOnly: FCONST { $$ = makeFloat($1); }
| '-' FCONST
{
$$ = makeFloat($2);
...
...
@@ -1797,7 +1834,8 @@ FloatOnly: FCONST
}
;
IntegerOnly: Iconst
IntegerOnly:
Iconst
{
$$ = makeInteger($1);
}
...
...
@@ -1816,7 +1854,8 @@ IntegerOnly: Iconst
*
*****************************************************************************/
CreatePLangStmt: CREATE opt_trusted opt_procedural LANGUAGE ColId_or_Sconst
CreatePLangStmt:
CREATE opt_trusted opt_procedural LANGUAGE ColId_or_Sconst
HANDLER handler_name opt_validator opt_lancompiler
{
CreatePLangStmt *n = makeNode(CreatePLangStmt);
...
...
@@ -1829,7 +1868,8 @@ CreatePLangStmt: CREATE opt_trusted opt_procedural LANGUAGE ColId_or_Sconst
}
;
opt_trusted: TRUSTED { $$ = TRUE; }
opt_trusted:
TRUSTED { $$ = TRUE; }
| /*EMPTY*/ { $$ = FALSE; }
;
...
...
@@ -1837,21 +1877,23 @@ opt_trusted: TRUSTED { $$ = TRUE; }
* (CREATE LANGUAGE is the only place where func_name isn't followed by '(').
* Work around by using name and dotted_name separately.
*/
handler_name: name
{ $$ = makeList1(makeString($1)); }
| dotted_name
{ $$ = $1; }
handler_name:
name { $$ = makeList1(makeString($1)); }
| dotted_name { $$ = $1; }
;
opt_lancompiler: LANCOMPILER Sconst { $$ = $2; }
opt_lancompiler:
LANCOMPILER Sconst { $$ = $2; }
| /*EMPTY*/ { $$ = ""; }
;
opt_validator: VALIDATOR handler_name { $$ = $2; }
opt_validator:
VALIDATOR handler_name { $$ = $2; }
| /*EMPTY*/ { $$ = NULL; }
;
DropPLangStmt: DROP opt_procedural LANGUAGE ColId_or_Sconst
DropPLangStmt:
DROP opt_procedural LANGUAGE ColId_or_Sconst
{
DropPLangStmt *n = makeNode(DropPLangStmt);
n->plname = $4;
...
...
@@ -1859,7 +1901,8 @@ DropPLangStmt: DROP opt_procedural LANGUAGE ColId_or_Sconst
}
;
opt_procedural: PROCEDURAL { $$ = TRUE; }
opt_procedural:
PROCEDURAL { $$ = TRUE; }
| /*EMPTY*/ { $$ = TRUE; }
;
...
...
@@ -1871,7 +1914,8 @@ opt_procedural: PROCEDURAL { $$ = TRUE; }
*
*****************************************************************************/
CreateTrigStmt: CREATE TRIGGER name TriggerActionTime TriggerEvents ON
CreateTrigStmt:
CREATE TRIGGER name TriggerActionTime TriggerEvents ON
qualified_name TriggerForSpec EXECUTE PROCEDURE
func_name '(' TriggerFuncArgs ')'
{
...
...
@@ -1922,11 +1966,13 @@ CreateTrigStmt: CREATE TRIGGER name TriggerActionTime TriggerEvents ON
}
;
TriggerActionTime: BEFORE { $$ = TRUE; }
TriggerActionTime:
BEFORE { $$ = TRUE; }
| AFTER { $$ = FALSE; }
;
TriggerEvents: TriggerOneEvent
TriggerEvents:
TriggerOneEvent
{
char *e = palloc (4);
e[0] = $1; e[1] = 0; $$ = e;
...
...
@@ -1944,68 +1990,56 @@ TriggerEvents: TriggerOneEvent
}
;
TriggerOneEvent: INSERT { $$ = 'i'; }
TriggerOneEvent:
INSERT { $$ = 'i'; }
| DELETE_P { $$ = 'd'; }
| UPDATE { $$ = 'u'; }
;
TriggerForSpec: FOR TriggerForOpt TriggerForType
TriggerForSpec:
FOR TriggerForOpt TriggerForType
{
$$ = $3;
}
;
TriggerForOpt: EACH { $$ = TRUE; }
TriggerForOpt:
EACH { $$ = TRUE; }
| /*EMPTY*/ { $$ = FALSE; }
;
TriggerForType: ROW { $$ = TRUE; }
TriggerForType:
ROW { $$ = TRUE; }
| STATEMENT { $$ = FALSE; }
;
TriggerFuncArgs:
TriggerFuncArg
{ $$ = makeList1($1); }
TriggerFuncArgs:
TriggerFuncArg
{ $$ = makeList1($1); }
| TriggerFuncArgs ',' TriggerFuncArg
{ $$ = lappend($1, $3); }
| /*EMPTY*/
{ $$ = NIL; }
| /*EMPTY*/ { $$ = NIL; }
;
TriggerFuncArg: ICONST
TriggerFuncArg:
ICONST
{
char buf[64];
sprintf (buf, "%d", $1);
$$ = makeString(pstrdup(buf));
}
| FCONST
{
$$ = makeString($1);
}
| Sconst
{
$$ = makeString($1);
}
| BITCONST
{
$$ = makeString($1);
}
| ColId
{
$$ = makeString($1);
}
| FCONST { $$ = makeString($1); }
| Sconst { $$ = makeString($1); }
| BITCONST { $$ = makeString($1); }
| ColId { $$ = makeString($1); }
;
OptConstrFromTable: /* Empty */
{
$$ = NULL;
}
| FROM qualified_name
{
$$ = $2;
}
OptConstrFromTable:
FROM qualified_name { $$ = $2; }
| /*EMPTY*/ { $$ = NULL; }
;
ConstraintAttributeSpec: ConstraintDeferrabilitySpec
ConstraintAttributeSpec:
ConstraintDeferrabilitySpec
{ $$ = $1; }
| ConstraintDeferrabilitySpec ConstraintTimeSpec
{
...
...
@@ -2026,24 +2060,23 @@ ConstraintAttributeSpec: ConstraintDeferrabilitySpec
elog(ERROR, "INITIALLY DEFERRED constraint must be DEFERRABLE");
$$ = $1 | $2;
}
| /* Empty
*/
| /*EMPTY
*/
{ $$ = 0; }
;
ConstraintDeferrabilitySpec: NOT DEFERRABLE
{ $$ = 0; }
| DEFERRABLE
{ $$ = 1; }
ConstraintDeferrabilitySpec:
NOT DEFERRABLE { $$ = 0; }
| DEFERRABLE { $$ = 1; }
;
ConstraintTimeSpec: INITIALLY IMMEDIATE
{ $$ = 0; }
| INITIALLY DEFERRED
{ $$ = 2; }
ConstraintTimeSpec:
INITIALLY IMMEDIATE { $$ = 0; }
| INITIALLY DEFERRED { $$ = 2; }
;
DropTrigStmt: DROP TRIGGER name ON qualified_name
DropTrigStmt:
DROP TRIGGER name ON qualified_name
{
DropPropertyStmt *n = makeNode(DropPropertyStmt);
n->relation = $5;
...
...
@@ -2062,8 +2095,8 @@ DropTrigStmt: DROP TRIGGER name ON qualified_name
*
*****************************************************************************/
CreateAssertStmt:
CREATE ASSERTION name
CHECK '(' a_expr ')' ConstraintAttributeSpec
CreateAssertStmt:
C
REATE ASSERTION name C
HECK '(' a_expr ')' ConstraintAttributeSpec
{
CreateTrigStmt *n = makeNode(CreateTrigStmt);
n->trigname = $3;
...
...
@@ -2078,7 +2111,8 @@ CreateAssertStmt: CREATE ASSERTION name
}
;
DropAssertStmt: DROP ASSERTION name
DropAssertStmt:
DROP ASSERTION name
{
DropPropertyStmt *n = makeNode(DropPropertyStmt);
n->relation = NULL;
...
...
@@ -2097,7 +2131,8 @@ DropAssertStmt: DROP ASSERTION name
*
*****************************************************************************/
DefineStmt: CREATE AGGREGATE func_name definition
DefineStmt:
CREATE AGGREGATE func_name definition
{
DefineStmt *n = makeNode(DefineStmt);
n->defType = AGGREGATE;
...
...
@@ -2186,16 +2221,13 @@ drop_type: TABLE { $$ = DROP_TABLE; }
| DOMAIN_P { $$ = DROP_DOMAIN; }
;
any_name_list: any_name
{ $$ = makeList1($1); }
| any_name_list ',' any_name
{ $$ = lappend($1, $3); }
any_name_list:
any_name { $$ = makeList1($1); }
| any_name_list ',' any_name { $$ = lappend($1, $3); }
;
any_name: ColId
{ $$ = makeList1(makeString($1)); }
| dotted_name
{ $$ = $1; }
any_name: ColId { $$ = makeList1(makeString($1)); }
| dotted_name { $$ = $1; }
;
/*****************************************************************************
...
...
@@ -2205,7 +2237,8 @@ any_name: ColId
*
*****************************************************************************/
TruncateStmt: TRUNCATE opt_table qualified_name
TruncateStmt:
TRUNCATE opt_table qualified_name
{
TruncateStmt *n = makeNode(TruncateStmt);
n->relation = $3;
...
...
@@ -2226,7 +2259,8 @@ TruncateStmt: TRUNCATE opt_table qualified_name
*
*****************************************************************************/
CommentStmt: COMMENT ON comment_type any_name IS comment_text
CommentStmt:
COMMENT ON comment_type any_name IS comment_text
{
CommentStmt *n = makeNode(CommentStmt);
n->objtype = $3;
...
...
@@ -2292,7 +2326,8 @@ CommentStmt: COMMENT ON comment_type any_name IS comment_text
}
;
comment_type: COLUMN { $$ = COLUMN; }
comment_type:
COLUMN { $$ = COLUMN; }
| DATABASE { $$ = DATABASE; }
| SCHEMA { $$ = SCHEMA; }
| INDEX { $$ = INDEX; }
...
...
@@ -2303,7 +2338,8 @@ comment_type: COLUMN { $$ = COLUMN; }
| VIEW { $$ = VIEW; }
;
comment_text: Sconst { $$ = $1; }
comment_text:
Sconst { $$ = $1; }
| NULL_P { $$ = NULL; }
;
...
...
@@ -2384,7 +2420,6 @@ FetchStmt: FETCH direction fetch_how_many from_in name
n->ismove = FALSE;
$$ = (Node *)n;
}
| MOVE direction fetch_how_many from_in name
{
FetchStmt *n = makeNode(FetchStmt);
...
...
@@ -2455,7 +2490,8 @@ direction: FORWARD { $$ = FORWARD; }
}
;
fetch_how_many: Iconst { $$ = $1; }
fetch_how_many:
Iconst { $$ = $1; }
| '-' Iconst { $$ = - $2; }
| ALL { $$ = 0; /* 0 means fetch all tuples*/ }
| NEXT { $$ = 1; }
...
...
@@ -2504,7 +2540,8 @@ privileges: privilege_list { $$ = $1; }
| ALL PRIVILEGES { $$ = makeListi1(ACL_ALL_RIGHTS); }
;
privilege_list: privilege { $$ = makeListi1($1); }
privilege_list:
privilege { $$ = makeListi1($1); }
| privilege_list ',' privilege { $$ = lappendi($1, $3); }
;
...
...
@@ -2528,7 +2565,8 @@ privilege: SELECT { $$ = ACL_SELECT; }
/* Don't bother trying to fold the first two rules into one using
opt_table. You're going to get conflicts. */
privilege_target: qualified_name_list
privilege_target:
qualified_name_list
{
PrivTarget *n = makeNode(PrivTarget);
n->objtype = ACL_OBJECT_RELATION;
...
...
@@ -2573,7 +2611,8 @@ privilege_target: qualified_name_list
;
grantee_list: grantee { $$ = makeList1($1); }
grantee_list:
grantee { $$ = makeList1($1); }
| grantee_list ',' grantee { $$ = lappend($1, $3); }
;
...
...
@@ -2602,14 +2641,16 @@ grantee: ColId
;
opt_grant_grant_option: WITH GRANT OPTION
opt_grant_grant_option:
WITH GRANT OPTION
{
elog(ERROR, "grant options are not implemented");
}
| /*EMPTY*/
;
opt_revoke_grant_option: GRANT OPTION FOR
opt_revoke_grant_option:
GRANT OPTION FOR
{
elog(ERROR, "grant options are not implemented");
}
...
...
@@ -2617,13 +2658,15 @@ opt_revoke_grant_option: GRANT OPTION FOR
;
function_with_argtypes_list: function_with_argtypes
function_with_argtypes_list:
function_with_argtypes
{ $$ = makeList1($1); }
| function_with_argtypes_list ',' function_with_argtypes
{ $$ = lappend($1, $3); }
;
function_with_argtypes: func_name func_args
function_with_argtypes:
func_name func_args
{
FuncWithArgs *n = makeNode(FuncWithArgs);
n->funcname = $1;
...
...
@@ -2656,16 +2699,19 @@ IndexStmt: CREATE index_opt_unique INDEX index_name ON qualified_name
}
;
index_opt_unique: UNIQUE { $$ = TRUE; }
index_opt_unique:
UNIQUE { $$ = TRUE; }
| /*EMPTY*/ { $$ = FALSE; }
;
access_method_clause: USING access_method { $$ = $2; }
access_method_clause:
USING access_method { $$ = $2; }
/* If btree changes as our default, update pg_get_indexdef() */
| /*EMPTY*/ { $$ = DEFAULT_INDEX_TYPE; }
;
index_params: index_list { $$ = $1; }
index_params:
index_list { $$ = $1; }
| func_index { $$ = makeList1($1); }
;
...
...
@@ -2756,7 +2802,8 @@ RecipeStmt: EXECUTE RECIPE recipe_name
*
*****************************************************************************/
CreateFunctionStmt: CREATE opt_or_replace FUNCTION func_name func_args
CreateFunctionStmt:
CREATE opt_or_replace FUNCTION func_name func_args
RETURNS func_return createfunc_opt_list opt_definition
{
CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
...
...
@@ -2767,9 +2814,11 @@ CreateFunctionStmt: CREATE opt_or_replace FUNCTION func_name func_args
n->options = $8;
n->withClause = $9;
$$ = (Node *)n;
};
}
;
opt_or_replace: OR REPLACE { $$ = TRUE; }
opt_or_replace:
OR REPLACE { $$ = TRUE; }
| /*EMPTY*/ { $$ = FALSE; }
;
...
...
@@ -2777,10 +2826,9 @@ func_args: '(' func_args_list ')' { $$ = $2; }
| '(' ')' { $$ = NIL; }
;
func_args_list: func_arg
{ $$ = makeList1($1); }
| func_args_list ',' func_arg
{ $$ = lappend($1, $3); }
func_args_list:
func_arg { $$ = makeList1($1); }
| func_args_list ',' func_arg { $$ = lappend($1, $3); }
;
func_arg: opt_arg func_type
...
...
@@ -2791,16 +2839,10 @@ func_arg: opt_arg func_type
*/
$$ = $2;
}
| func_type
{
$$ = $1;
}
| func_type { $$ = $1; }
;
opt_arg: IN_P
{
$$ = FALSE;
}
opt_arg: IN_P { $$ = FALSE; }
| OUT_P
{
elog(ERROR, "CREATE FUNCTION / OUT parameters are not supported");
...
...
@@ -2813,7 +2855,8 @@ opt_arg: IN_P
}
;
func_return: func_type
func_return:
func_type
{
/* We can catch over-specified arguments here if we want to,
* but for now better to silently swallow typmod, etc.
...
...
@@ -2827,10 +2870,7 @@ func_return: func_type
* We would like to make the second production here be ColId attrs etc,
* but that causes reduce/reduce conflicts. type_name is next best choice.
*/
func_type: Typename
{
$$ = $1;
}
func_type: Typename { $$ = $1; }
| type_name attrs '%' TYPE_P
{
$$ = makeNode(TypeName);
...
...
@@ -2841,13 +2881,13 @@ func_type: Typename
;
createfunc_opt_list: createfunc_opt_item
{ $$ = makeList1($1); }
| createfunc_opt_list createfunc_opt_item
{ $$ = lappend($1, $2); }
createfunc_opt_list:
createfunc_opt_item { $$ = makeList1($1); }
| createfunc_opt_list createfunc_opt_item { $$ = lappend($1, $2); }
;
createfunc_opt_item: AS func_as
createfunc_opt_item:
AS func_as
{
$$ = makeNode(DefElem);
$$->defname = "as";
...
...
@@ -2927,13 +2967,12 @@ createfunc_opt_item: AS func_as
}
;
func_as: Sconst
{ $$ = makeList1(makeString($1)); }
| Sconst ',' Sconst
{ $$ = makeList2(makeString($1), makeString($3)); }
func_as: Sconst { $$ = makeList1(makeString($1)); }
| Sconst ',' Sconst { $$ = makeList2(makeString($1), makeString($3)); }
;
opt_definition: WITH definition { $$ = $2; }
opt_definition:
WITH definition { $$ = $2; }
| /*EMPTY*/ { $$ = NIL; }
;
...
...
@@ -2948,7 +2987,8 @@ opt_definition: WITH definition { $$ = $2; }
*
*****************************************************************************/
RemoveFuncStmt: DROP FUNCTION func_name func_args
RemoveFuncStmt:
DROP FUNCTION func_name func_args
{
RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
n->funcname = $3;
...
...
@@ -2957,7 +2997,8 @@ RemoveFuncStmt: DROP FUNCTION func_name func_args
}
;
RemoveAggrStmt: DROP AGGREGATE func_name '(' aggr_argtype ')'
RemoveAggrStmt:
DROP AGGREGATE func_name '(' aggr_argtype ')'
{
RemoveAggrStmt *n = makeNode(RemoveAggrStmt);
n->aggname = $3;
...
...
@@ -2966,11 +3007,13 @@ RemoveAggrStmt: DROP AGGREGATE func_name '(' aggr_argtype ')'
}
;
aggr_argtype: Typename { $$ = $1; }
aggr_argtype:
Typename { $$ = $1; }
| '*' { $$ = NULL; }
;
RemoveOperStmt: DROP OPERATOR any_operator '(' oper_argtypes ')'
RemoveOperStmt:
DROP OPERATOR any_operator '(' oper_argtypes ')'
{
RemoveOperStmt *n = makeNode(RemoveOperStmt);
n->opname = $3;
...
...
@@ -2979,22 +3022,19 @@ RemoveOperStmt: DROP OPERATOR any_operator '(' oper_argtypes ')'
}
;
oper_argtypes: Typename
oper_argtypes:
Typename
{
elog(ERROR,"parser: argument type missing (use NONE for unary operators)");
}
| Typename ',' Typename
{ $$ = makeList2($1, $3); }
| NONE ',' Typename /* left unary */
{ $$ = makeList2(NULL, $3); }
| Typename ',' NONE /* right unary */
{ $$ = makeList2($1, NULL); }
| Typename ',' Typename { $$ = makeList2($1, $3); }
| NONE ',' Typename /* left unary */ { $$ = makeList2(NULL, $3); }
| Typename ',' NONE /* right unary */ { $$ = makeList2($1, NULL); }
;
any_operator: all_Op
{ $$ = makeList1(makeString($1)); }
| ColId '.' any_operator
{ $$ = lcons(makeString($1), $3); }
any_operator:
all_Op { $$ = makeList1(makeString($1)); }
| ColId '.' any_operator { $$ = lcons(makeString($1), $3); }
;
...
...
@@ -3006,7 +3046,8 @@ any_operator: all_Op
*
*****************************************************************************/
ReindexStmt: REINDEX reindex_type qualified_name opt_force
ReindexStmt:
REINDEX reindex_type qualified_name opt_force
{
ReindexStmt *n = makeNode(ReindexStmt);
n->reindexType = $2;
...
...
@@ -3026,7 +3067,8 @@ ReindexStmt: REINDEX reindex_type qualified_name opt_force
}
;
reindex_type: INDEX { $$ = INDEX; }
reindex_type:
INDEX { $$ = INDEX; }
| TABLE { $$ = TABLE; }
;
...
...
@@ -3098,13 +3140,15 @@ RuleStmt: CREATE RULE name AS
}
;
RuleActionList: NOTHING { $$ = NIL; }
RuleActionList:
NOTHING { $$ = NIL; }
| RuleActionStmt { $$ = makeList1($1); }
| '(' RuleActionMulti ')' { $$ = $2; }
;
/* the thrashing around here is to discard "empty" statements... */
RuleActionMulti: RuleActionMulti ';' RuleActionStmtOrEmpty
RuleActionMulti:
RuleActionMulti ';' RuleActionStmtOrEmpty
{ if ($3 != (Node *) NULL)
$$ = lappend($1, $3);
else
...
...
@@ -3118,16 +3162,17 @@ RuleActionMulti: RuleActionMulti ';' RuleActionStmtOrEmpty
}
;
RuleActionStmt: SelectStmt
RuleActionStmt:
SelectStmt
| InsertStmt
| UpdateStmt
| DeleteStmt
| NotifyStmt
;
RuleActionStmtOrEmpty:
RuleActionStmt
| /*EMPTY*/
{ $$ = (Node *)NULL; }
RuleActionStmtOrEmpty:
RuleActionStmt { $$ = $1; }
| /*EMPTY*/
{ $$ = (Node *)NULL; }
;
/* change me to select, update, etc. some day */
...
...
@@ -3137,12 +3182,14 @@ event: SELECT { $$ = CMD_SELECT; }
| INSERT { $$ = CMD_INSERT; }
;
opt_instead: INSTEAD { $$ = TRUE; }
opt_instead:
INSTEAD { $$ = TRUE; }
| /*EMPTY*/ { $$ = FALSE; }
;
DropRuleStmt: DROP RULE name ON qualified_name
DropRuleStmt:
DROP RULE name ON qualified_name
{
DropPropertyStmt *n = makeNode(DropPropertyStmt);
n->relation = $5;
...
...
@@ -3177,7 +3224,8 @@ ListenStmt: LISTEN qualified_name
}
;
UnlistenStmt: UNLISTEN qualified_name
UnlistenStmt:
UNLISTEN qualified_name
{
UnlistenStmt *n = makeNode(UnlistenStmt);
n->relation = $2;
...
...
@@ -3203,7 +3251,8 @@ UnlistenStmt: UNLISTEN qualified_name
*
*****************************************************************************/
TransactionStmt: ABORT_TRANS opt_trans
TransactionStmt:
ABORT_TRANS opt_trans
{
TransactionStmt *n = makeNode(TransactionStmt);
n->command = ROLLBACK;
...
...
@@ -3252,8 +3301,7 @@ opt_trans: WORK { $$ = TRUE; }
| /*EMPTY*/ { $$ = TRUE; }
;
opt_chain: AND NO CHAIN
{ $$ = FALSE; }
opt_chain: AND NO CHAIN { $$ = FALSE; }
| AND CHAIN
{
/* SQL99 asks that conforming dbs reject AND CHAIN
...
...
@@ -3306,7 +3354,8 @@ LoadStmt: LOAD file_name
*
*****************************************************************************/
CreatedbStmt: CREATE DATABASE database_name opt_with createdb_opt_list
CreatedbStmt:
CREATE DATABASE database_name opt_with createdb_opt_list
{
CreatedbStmt *n = makeNode(CreatedbStmt);
List *l;
...
...
@@ -3352,17 +3401,17 @@ CreatedbStmt: CREATE DATABASE database_name opt_with createdb_opt_list
}
;
createdb_opt_list: createdb_opt_item
{ $$ = makeList1($1); }
| createdb_opt_list createdb_opt_item
{ $$ = lappend($1, $2); }
createdb_opt_list:
createdb_opt_item { $$ = makeList1($1); }
| createdb_opt_list createdb_opt_item { $$ = lappend($1, $2); }
;
/*
* createdb_opt_item returns 2-element lists, with the first element
* being an integer code to indicate which item was specified.
*/
createdb_opt_item: LOCATION opt_equal Sconst
createdb_opt_item:
LOCATION opt_equal Sconst
{
$$ = lconsi(1, makeList1($3));
}
...
...
@@ -3433,7 +3482,8 @@ opt_equal: '=' { $$ = TRUE; }
*
*****************************************************************************/
AlterDatabaseSetStmt: ALTER DATABASE database_name SET set_rest
AlterDatabaseSetStmt:
ALTER DATABASE database_name SET set_rest
{
AlterDatabaseSetStmt *n = makeNode(AlterDatabaseSetStmt);
n->dbname = $3;
...
...
@@ -3473,7 +3523,8 @@ DropdbStmt: DROP DATABASE database_name
*
*****************************************************************************/
CreateDomainStmt: CREATE DOMAIN_P any_name opt_as Typename ColQualList opt_collate
CreateDomainStmt:
CREATE DOMAIN_P any_name opt_as Typename ColQualList opt_collate
{
CreateDomainStmt *n = makeNode(CreateDomainStmt);
n->domainname = $3;
...
...
@@ -3499,7 +3550,8 @@ opt_as: AS {$$ = TRUE; }
*
*****************************************************************************/
ClusterStmt: CLUSTER index_name ON qualified_name
ClusterStmt:
CLUSTER index_name ON qualified_name
{
ClusterStmt *n = makeNode(ClusterStmt);
n->relation = $4;
...
...
@@ -3551,7 +3603,8 @@ VacuumStmt: VACUUM opt_full opt_freeze opt_verbose
}
;
AnalyzeStmt: analyze_keyword opt_verbose
AnalyzeStmt:
analyze_keyword opt_verbose
{
VacuumStmt *n = makeNode(VacuumStmt);
n->vacuum = false;
...
...
@@ -3577,11 +3630,13 @@ AnalyzeStmt: analyze_keyword opt_verbose
}
;
analyze_keyword: ANALYZE { $$ = TRUE; }
analyze_keyword:
ANALYZE { $$ = TRUE; }
| ANALYSE /* British */ { $$ = TRUE; }
;
opt_verbose: VERBOSE { $$ = TRUE; }
opt_verbose:
VERBOSE { $$ = TRUE; }
| /*EMPTY*/ { $$ = FALSE; }
;
...
...
@@ -3593,7 +3648,8 @@ opt_freeze: FREEZE { $$ = TRUE; }
| /*EMPTY*/ { $$ = FALSE; }
;
opt_name_list: '(' name_list ')' { $$ = $2; }
opt_name_list:
'(' name_list ')' { $$ = $2; }
| /*EMPTY*/ { $$ = NIL; }
;
...
...
@@ -3606,7 +3662,8 @@ opt_name_list: '(' name_list ')' { $$ = $2; }
*
*****************************************************************************/
ExplainStmt: EXPLAIN opt_verbose OptimizableStmt
ExplainStmt:
EXPLAIN opt_verbose OptimizableStmt
{
ExplainStmt *n = makeNode(ExplainStmt);
n->verbose = $2;
...
...
@@ -3636,7 +3693,8 @@ ExplainStmt: EXPLAIN opt_verbose OptimizableStmt
* *
*****************************************************************************/
OptimizableStmt: SelectStmt
OptimizableStmt:
SelectStmt
| CursorStmt
| UpdateStmt
| InsertStmt
...
...
@@ -3651,14 +3709,16 @@ OptimizableStmt: SelectStmt
*
*****************************************************************************/
InsertStmt: INSERT INTO qualified_name insert_rest
InsertStmt:
INSERT INTO qualified_name insert_rest
{
$4->relation = $3;
$$ = (Node *) $4;
}
;
insert_rest: VALUES '(' insert_target_list ')'
insert_rest:
VALUES '(' insert_target_list ')'
{
$$ = makeNode(InsertStmt);
$$->cols = NIL;
...
...
@@ -3695,13 +3755,13 @@ insert_rest: VALUES '(' insert_target_list ')'
}
;
insert_column_list: insert_column_list ',' insert_column_item
{ $$ = lappend($1, $3); }
| insert_column_item
{ $$ = makeList1($1); }
insert_column_list:
insert_column_list ',' insert_column_item { $$ = lappend($1, $3); }
| insert_column_item { $$ = makeList1($1); }
;
insert_column_item: ColId opt_indirection
insert_column_item:
ColId opt_indirection
{
ResTarget *n = makeNode(ResTarget);
n->name = $1;
...
...
@@ -3846,20 +3906,13 @@ SelectStmt: select_no_parens %prec UMINUS
| select_with_parens %prec UMINUS
;
select_with_parens: '(' select_no_parens ')'
{
$$ = $2;
}
| '(' select_with_parens ')'
{
$$ = $2;
}
select_with_parens:
'(' select_no_parens ')' { $$ = $2; }
| '(' select_with_parens ')' { $$ = $2; }
;
select_no_parens: simple_select
{
$$ = $1;
}
select_no_parens:
simple_select { $$ = $1; }
| select_clause sort_clause opt_for_update_clause opt_select_limit
{
insertSelectOptions((SelectStmt *) $1, $2, $3,
...
...
@@ -3880,8 +3933,9 @@ select_no_parens: simple_select
}
;
select_clause: simple_select
| select_with_parens
select_clause:
simple_select { $$ = $1; }
| select_with_parens { $$ = $1; }
;
/*
...
...
@@ -3907,7 +3961,8 @@ select_clause: simple_select
* NOTE: only the leftmost component SelectStmt should have INTO.
* However, this is not checked by the grammar; parse analysis must check it.
*/
simple_select: SELECT opt_distinct target_list
simple_select:
SELECT opt_distinct target_list
into_clause from_clause where_clause
group_clause having_clause
{
...
...
@@ -3936,7 +3991,8 @@ simple_select: SELECT opt_distinct target_list
}
;
into_clause: INTO OptTempTableName { $$ = $2; }
into_clause:
INTO OptTempTableName { $$ = $2; }
| /*EMPTY*/ { $$ = NULL; }
;
...
...
@@ -3944,7 +4000,8 @@ into_clause: INTO OptTempTableName { $$ = $2; }
* Redundancy here is needed to avoid shift/reduce conflicts,
* since TEMP is not a reserved word. See also OptTemp.
*/
OptTempTableName: TEMPORARY opt_table qualified_name
OptTempTableName:
TEMPORARY opt_table qualified_name
{
$$ = $3;
$$->istemp = true;
...
...
@@ -3999,16 +4056,19 @@ opt_all: ALL { $$ = TRUE; }
/* We use (NIL) as a placeholder to indicate that all target expressions
* should be placed in the DISTINCT list during parsetree analysis.
*/
opt_distinct: DISTINCT { $$ = makeList1(NIL); }
opt_distinct:
DISTINCT { $$ = makeList1(NIL); }
| DISTINCT ON '(' expr_list ')' { $$ = $4; }
| ALL { $$ = NIL; }
| /*EMPTY*/ { $$ = NIL; }
;
sort_clause: ORDER BY sortby_list { $$ = $3; }
sort_clause:
ORDER BY sortby_list { $$ = $3; }
;
sortby_list: sortby { $$ = makeList1($1); }
sortby_list:
sortby { $$ = makeList1($1); }
| sortby_list ',' sortby { $$ = lappend($1, $3); }
;
...
...
@@ -4020,8 +4080,7 @@ sortby: a_expr OptUseOp
}
;
OptUseOp: USING qual_all_Op
{ $$ = $2; }
OptUseOp: USING qual_all_Op { $$ = $2; }
| ASC
{ $$ = makeList1(makeString("<")); }
| DESC
...
...
@@ -4031,7 +4090,8 @@ OptUseOp: USING qual_all_Op
;
select_limit: LIMIT select_limit_value OFFSET select_offset_value
select_limit:
LIMIT select_limit_value OFFSET select_offset_value
{ $$ = makeList2($4, $2); }
| OFFSET select_offset_value LIMIT select_limit_value
{ $$ = makeList2($2, $4); }
...
...
@@ -4045,11 +4105,13 @@ select_limit: LIMIT select_limit_value OFFSET select_offset_value
;
opt_select_limit: select_limit { $$ = $1; }
opt_select_limit:
select_limit { $$ = $1; }
| /* EMPTY */ { $$ = makeList2(NULL,NULL); }
;
select_limit_value: Iconst
select_limit_value:
Iconst
{
Const *n = makeNode(Const);
...
...
@@ -4090,7 +4152,8 @@ select_limit_value: Iconst
}
;
select_offset_value: Iconst
select_offset_value:
Iconst
{
Const *n = makeNode(Const);
...
...
@@ -4125,26 +4188,28 @@ select_offset_value: Iconst
* cases for these.
*/
group_clause: GROUP_P BY expr_list { $$ = $3; }
group_clause:
GROUP_P BY expr_list { $$ = $3; }
| /*EMPTY*/ { $$ = NIL; }
;
having_clause: HAVING a_expr
{
$$ = $2;
}
having_clause:
HAVING a_expr { $$ = $2; }
| /*EMPTY*/ { $$ = NULL; }
;
for_update_clause: FOR UPDATE update_list { $$ = $3; }
for_update_clause:
FOR UPDATE update_list { $$ = $3; }
| FOR READ ONLY { $$ = NULL; }
;
opt_for_update_clause: for_update_clause { $$ = $1; }
opt_for_update_clause:
for_update_clause { $$ = $1; }
| /* EMPTY */ { $$ = NULL; }
;
update_list: OF name_list { $$ = $2; }
update_list:
OF name_list { $$ = $2; }
| /* EMPTY */ { $$ = makeList1(NULL); }
;
...
...
@@ -4156,7 +4221,8 @@ update_list: OF name_list { $$ = $2; }
*
*****************************************************************************/
from_clause: FROM from_list { $$ = $2; }
from_clause:
FROM from_list { $$ = $2; }
| /*EMPTY*/ { $$ = NIL; }
;
...
...
@@ -4246,7 +4312,8 @@ table_ref: relation_expr
* in common. We'll collect columns during the later transformations.
*/
joined_table: '(' joined_table ')'
joined_table:
'(' joined_table ')'
{
$$ = $2;
}
...
...
@@ -4328,7 +4395,8 @@ joined_table: '(' joined_table ')'
}
;
alias_clause: AS ColId '(' name_list ')'
alias_clause:
AS ColId '(' name_list ')'
{
$$ = makeNode(Alias);
$$->aliasname = $2;
...
...
@@ -4377,7 +4445,8 @@ join_qual: USING '(' name_list ')' { $$ = (Node *) $3; }
;
relation_expr: qualified_name
relation_expr:
qualified_name
{
/* default inheritance */
$$ = $1;
...
...
@@ -4422,7 +4491,8 @@ func_table: func_name '(' ')'
;
where_clause: WHERE a_expr { $$ = $2; }
where_clause:
WHERE a_expr { $$ = $2; }
| /*EMPTY*/ { $$ = NULL; /* no qualifiers */ }
;
...
...
@@ -4449,7 +4519,8 @@ Typename: SimpleTypename opt_array_bounds
}
;
opt_array_bounds: opt_array_bounds '[' ']'
opt_array_bounds:
opt_array_bounds '[' ']'
{ $$ = lappend($1, makeInteger(-1)); }
| opt_array_bounds '[' Iconst ']'
{ $$ = lappend($1, makeInteger($3)); }
...
...
@@ -4465,7 +4536,8 @@ opt_array_bounds: opt_array_bounds '[' ']'
* reduce/reduce conflicts that I haven't been able to find a workaround
* for. FIXME later.
*/
SimpleTypename: ConstTypename
SimpleTypename:
ConstTypename { $$ = $1; }
| ConstInterval opt_interval
{
$$ = $1;
...
...
@@ -4488,14 +4560,16 @@ SimpleTypename: ConstTypename
}
;
ConstTypename: GenericType
| Numeric
| Bit
| Character
| ConstDatetime
ConstTypename:
GenericType { $$ = $1;}
| Numeric { $$ = $1;}
| Bit { $$ = $1;}
| Character { $$ = $1;}
| ConstDatetime { $$ = $1;}
;
GenericType: type_name
GenericType:
type_name
{
$$ = makeTypeName($1);
}
...
...
@@ -4572,7 +4646,8 @@ opt_float: '(' Iconst ')'
}
;
opt_numeric: '(' Iconst ',' Iconst ')'
opt_numeric:
'(' Iconst ',' Iconst ')'
{
if ($2 < 1 || $2 > NUMERIC_MAX_PRECISION)
elog(ERROR, "NUMERIC precision %d must be between 1 and %d",
...
...
@@ -4598,7 +4673,8 @@ opt_numeric: '(' Iconst ',' Iconst ')'
}
;
opt_decimal: '(' Iconst ',' Iconst ')'
opt_decimal:
'(' Iconst ',' Iconst ')'
{
if ($2 < 1 || $2 > NUMERIC_MAX_PRECISION)
elog(ERROR, "DECIMAL precision %d must be between 1 and %d",
...
...
@@ -4716,27 +4792,37 @@ Character: character '(' Iconst ')' opt_charset
}
;
character: CHARACTER opt_varying { $$ = $2 ? "varchar": "bpchar"; }
| CHAR_P opt_varying { $$ = $2 ? "varchar": "bpchar"; }
| VARCHAR { $$ = "varchar"; }
| NATIONAL CHARACTER opt_varying { $$ = $3 ? "varchar": "bpchar"; }
| NATIONAL CHAR_P opt_varying { $$ = $3 ? "varchar": "bpchar"; }
| NCHAR opt_varying { $$ = $2 ? "varchar": "bpchar"; }
character: CHARACTER opt_varying
{ $$ = $2 ? "varchar": "bpchar"; }
| CHAR_P opt_varying
{ $$ = $2 ? "varchar": "bpchar"; }
| VARCHAR
{ $$ = "varchar"; }
| NATIONAL CHARACTER opt_varying
{ $$ = $3 ? "varchar": "bpchar"; }
| NATIONAL CHAR_P opt_varying
{ $$ = $3 ? "varchar": "bpchar"; }
| NCHAR opt_varying
{ $$ = $2 ? "varchar": "bpchar"; }
;
opt_varying: VARYING { $$ = TRUE; }
opt_varying:
VARYING { $$ = TRUE; }
| /*EMPTY*/ { $$ = FALSE; }
;
opt_charset: CHARACTER SET ColId { $$ = $3; }
opt_charset:
CHARACTER SET ColId { $$ = $3; }
| /*EMPTY*/ { $$ = NULL; }
;
opt_collate: COLLATE ColId { $$ = $2; }
opt_collate:
COLLATE ColId { $$ = $2; }
| /*EMPTY*/ { $$ = NULL; }
;
ConstDatetime: TIMESTAMP '(' Iconst ')' opt_timezone
ConstDatetime:
TIMESTAMP '(' Iconst ')' opt_timezone
{
if ($5)
$$ = SystemTypeName("timestamptz");
...
...
@@ -4795,18 +4881,18 @@ ConstDatetime: TIMESTAMP '(' Iconst ')' opt_timezone
}
;
ConstInterval: INTERVAL
{
$$ = SystemTypeName("interval");
}
ConstInterval:
INTERVAL { $$ = SystemTypeName("interval"); }
;
opt_timezone: WITH TIME ZONE { $$ = TRUE; }
opt_timezone:
WITH TIME ZONE { $$ = TRUE; }
| WITHOUT TIME ZONE { $$ = FALSE; }
| /*EMPTY*/ { $$ = FALSE; }
;
opt_interval: YEAR_P { $$ = MASK(YEAR); }
opt_interval:
YEAR_P { $$ = MASK(YEAR); }
| MONTH_P { $$ = MASK(MONTH); }
| DAY_P { $$ = MASK(DAY); }
| HOUR_P { $$ = MASK(HOUR); }
...
...
@@ -4906,7 +4992,8 @@ row_expr: '(' row_descriptor ')' IN_P select_with_parens
}
;
row_descriptor: row_list ',' a_expr
row_descriptor:
row_list ',' a_expr
{
$$ = lappend($1, $3);
}
...
...
@@ -4927,7 +5014,9 @@ sub_type: ANY { $$ = ANY_SUBLINK; }
| ALL { $$ = ALL_SUBLINK; }
;
all_Op: Op | MathOp;
all_Op: Op { $$ = $1; }
| MathOp { $$ = $1; }
;
MathOp: '+' { $$ = "+"; }
| '-' { $$ = "-"; }
...
...
@@ -4940,16 +5029,13 @@ MathOp: '+' { $$ = "+"; }
| '=' { $$ = "="; }
;
qual_Op: Op
{ $$ = makeList1(makeString($1)); }
| OPERATOR '(' any_operator ')'
{ $$ = $3; }
qual_Op: Op { $$ = makeList1(makeString($1)); }
| OPERATOR '(' any_operator ')' { $$ = $3; }
;
qual_all_Op: all_Op
{ $$ = makeList1(makeString($1)); }
| OPERATOR '(' any_operator ')'
{ $$ = $3; }
qual_all_Op:
all_Op { $$ = makeList1(makeString($1)); }
| OPERATOR '(' any_operator ')' { $$ = $3; }
;
/*
...
...
@@ -4968,10 +5054,8 @@ qual_all_Op: all_Op
* c_expr is all the productions that are common to a_expr and b_expr;
* it's factored out just to eliminate redundant coding.
*/
a_expr: c_expr
{ $$ = $1; }
| a_expr TYPECAST Typename
{ $$ = makeTypeCast($1, $3); }
a_expr: c_expr { $$ = $1; }
| a_expr TYPECAST Typename { $$ = makeTypeCast($1, $3); }
| a_expr COLLATE ColId
{
FuncCall *n = makeNode(FuncCall);
...
...
@@ -5331,7 +5415,6 @@ b_expr: c_expr
{ $$ = (Node *) makeSimpleA_Expr(OP, ">", $1, $3); }
| b_expr '=' b_expr
{ $$ = (Node *) makeSimpleA_Expr(OP, "=", $1, $3); }
| b_expr qual_Op b_expr %prec Op
{ $$ = (Node *) makeA_Expr(OP, $2, $1, $3); }
| qual_Op b_expr %prec Op
...
...
@@ -5348,10 +5431,8 @@ b_expr: c_expr
* inside parentheses, such as function arguments; that cannot introduce
* ambiguity to the b_expr syntax.
*/
c_expr: columnref
{ $$ = (Node *) $1; }
| AexprConst
{ $$ = $1; }
c_expr: columnref { $$ = (Node *) $1; }
| AexprConst { $$ = $1; }
| PARAM attrs opt_indirection
{
/*
...
...
@@ -5780,7 +5861,8 @@ c_expr: columnref
* Supporting nonterminals for expressions.
*/
opt_indirection: opt_indirection '[' a_expr ']'
opt_indirection:
opt_indirection '[' a_expr ']'
{
A_Indices *ai = makeNode(A_Indices);
ai->lidx = NULL;
...
...
@@ -5798,30 +5880,28 @@ opt_indirection: opt_indirection '[' a_expr ']'
{ $$ = NIL; }
;
expr_list: a_expr
{ $$ = makeList1($1); }
| expr_list ',' a_expr
{ $$ = lappend($1, $3); }
| expr_list USING a_expr
{ $$ = lappend($1, $3); }
expr_list: a_expr { $$ = makeList1($1); }
| expr_list ',' a_expr { $$ = lappend($1, $3); }
| expr_list USING a_expr { $$ = lappend($1, $3); }
;
extract_list: extract_arg FROM a_expr
extract_list:
extract_arg FROM a_expr
{
A_Const *n = makeNode(A_Const);
n->val.type = T_String;
n->val.val.str = $1;
$$ = makeList2((Node *) n, $3);
}
| /*EMPTY*/
{ $$ = NIL; }
| /*EMPTY*/ { $$ = NIL; }
;
/* Allow delimited string SCONST in extract_arg as an SQL extension.
* - thomas 2001-04-12
*/
extract_arg: IDENT { $$ = $1; }
extract_arg:
IDENT { $$ = $1; }
| YEAR_P { $$ = "year"; }
| MONTH_P { $$ = "month"; }
| DAY_P { $$ = "day"; }
...
...
@@ -5836,7 +5916,8 @@ extract_arg: IDENT { $$ = $1; }
* o overlay(text placing text from int for int)
* o overlay(text placing text from int)
*/
overlay_list: a_expr overlay_placing substr_from substr_for
overlay_list:
a_expr overlay_placing substr_from substr_for
{
$$ = makeList4($1, $2, $3, $4);
}
...
...
@@ -5846,16 +5927,16 @@ overlay_list: a_expr overlay_placing substr_from substr_for
}
;
overlay_placing: PLACING a_expr
overlay_placing:
PLACING a_expr
{ $$ = $2; }
;
/* position_list uses b_expr not a_expr to avoid conflict with general IN */
position_list: b_expr IN_P b_expr
{ $$ = makeList2($3, $1); }
| /*EMPTY*/
{ $$ = NIL; }
position_list:
b_expr IN_P b_expr { $$ = makeList2($3, $1); }
| /*EMPTY*/ { $$ = NIL; }
;
/* SUBSTRING() arguments
...
...
@@ -5868,7 +5949,8 @@ position_list: b_expr IN_P b_expr
* here, and convert the SQL9x style to the generic list for further
* processing. - thomas 2000-11-28
*/
substr_list: a_expr substr_from substr_for
substr_list:
a_expr substr_from substr_for
{
$$ = makeList3($1, $2, $3);
}
...
...
@@ -5895,20 +5977,16 @@ substr_list: a_expr substr_from substr_for
{ $$ = NIL; }
;
substr_from:
FROM a_expr
{
$$ = $2; }
substr_from:
FROM a_expr {
$$ = $2; }
;
substr_for: FOR a_expr
{ $$ = $2; }
substr_for: FOR a_expr { $$ = $2; }
;
trim_list: a_expr FROM expr_list
{ $$ = lappend($3, $1); }
| FROM expr_list
{ $$ = $2; }
| expr_list
{ $$ = $1; }
trim_list: a_expr FROM expr_list { $$ = lappend($3, $1); }
| FROM expr_list { $$ = $2; }
| expr_list { $$ = $1; }
;
in_expr: select_with_parens
...
...
@@ -5917,14 +5995,12 @@ in_expr: select_with_parens
n->subselect = $1;
$$ = (Node *)n;
}
| '(' in_expr_nodes ')'
{ $$ = (Node *)$2; }
| '(' in_expr_nodes ')' { $$ = (Node *)$2; }
;
in_expr_nodes: a_expr
{ $$ = makeList1($1); }
| in_expr_nodes ',' a_expr
{ $$ = lappend($1, $3); }
in_expr_nodes:
a_expr { $$ = makeList1($1); }
| in_expr_nodes ',' a_expr { $$ = lappend($1, $3); }
;
/* Case clause
...
...
@@ -5979,13 +6055,13 @@ case_expr: CASE case_arg when_clause_list case_default END_TRANS
}
;
when_clause_list: when_clause_list when_clause
{ $$ = lappend($1, $2); }
| when_clause
{ $$ = makeList1($1); }
when_clause_list:
when_clause_list when_clause { $$ = lappend($1, $2); }
| when_clause { $$ = makeList1($1); }
;
when_clause: WHEN a_expr THEN a_expr
when_clause:
WHEN a_expr THEN a_expr
{
CaseWhen *w = makeNode(CaseWhen);
w->expr = $2;
...
...
@@ -5994,14 +6070,13 @@ when_clause: WHEN a_expr THEN a_expr
}
;
case_default: ELSE a_expr { $$ = $2; }
case_default:
ELSE a_expr { $$ = $2; }
| /*EMPTY*/ { $$ = NULL; }
;
case_arg: a_expr
{ $$ = $1; }
| /*EMPTY*/
{ $$ = NULL; }
case_arg: a_expr { $$ = $1; }
| /*EMPTY*/ { $$ = NULL; }
;
/*
...
...
@@ -6023,16 +6098,13 @@ columnref: relation_name opt_indirection
}
;
dotted_name:
relation_name attrs
{ $$ = lcons(makeString($1), $2); }
dotted_name:
relation_name attrs
{ $$ = lcons(makeString($1), $2); }
;
attrs: '.' attr_name
{ $$ = makeList1(makeString($2)); }
| '.' '*'
{ $$ = makeList1(makeString("*")); }
| '.' attr_name attrs
{ $$ = lcons(makeString($2), $3); }
attrs: '.' attr_name { $$ = makeList1(makeString($2)); }
| '.' '*' { $$ = makeList1(makeString("*")); }
| '.' attr_name attrs { $$ = lcons(makeString($2), $3); }
;
...
...
@@ -6044,10 +6116,9 @@ attrs: '.' attr_name
/* Target lists as found in SELECT ... and INSERT VALUES ( ... ) */
target_list: target_list ',' target_el
{ $$ = lappend($1, $3); }
| target_el
{ $$ = makeList1($1); }
target_list:
target_list ',' target_el { $$ = lappend($1, $3); }
| target_el { $$ = makeList1($1); }
;
/* AS is not optional because shift/red conflict with unary ops */
...
...
@@ -6083,13 +6154,13 @@ target_el: a_expr AS ColLabel
$$ = NULL;
}
*/
update_target_list: update_target_list ',' update_target_el
{ $$ = lappend($1,$3); }
| update_target_el
{ $$ = makeList1($1); }
update_target_list:
update_target_list ',' update_target_el { $$ = lappend($1,$3); }
| update_target_el { $$ = makeList1($1); }
;
update_target_el: ColId opt_indirection '=' a_expr
update_target_el:
ColId opt_indirection '=' a_expr
{
$$ = makeNode(ResTarget);
$$->name = $1;
...
...
@@ -6098,14 +6169,15 @@ update_target_el: ColId opt_indirection '=' a_expr
}
;
insert_target_list: insert_target_list ',' insert_target_el
{ $$ = lappend($1, $3); }
| insert_target_el
{ $$ = makeList1($1); }
insert_target_list:
insert_target_list ',' insert_target_el { $$ = lappend($1, $3); }
| insert_target_el { $$ = makeList1($1); }
;
insert_target_el: target_el { $$ = $1; }
| DEFAULT {
insert_target_el:
target_el { $$ = $1; }
| DEFAULT
{
InsertDefault *def = makeNode(InsertDefault);
$$ = makeNode(ResTarget);
$$->name = NULL;
...
...
@@ -6121,23 +6193,18 @@ insert_target_el: target_el { $$ = $1; }
*
*****************************************************************************/
relation_name: SpecialRuleRelation
{
$$ = $1;
}
| ColId
{
$$ = $1;
}
relation_name:
SpecialRuleRelation { $$ = $1; }
| ColId { $$ = $1; }
;
qualified_name_list: qualified_name
{ $$ = makeList1($1); }
| qualified_name_list ',' qualified_name
{ $$ = lappend($1, $3); }
qualified_name_list:
qualified_name { $$ = makeList1($1); }
| qualified_name_list ',' qualified_name { $$ = lappend($1, $3); }
;
qualified_name: relation_name
qualified_name:
relation_name
{
$$ = makeNode(RangeVar);
$$->catalogname = NULL;
...
...
@@ -6167,24 +6234,27 @@ qualified_name: relation_name
}
;
name_list: name
{ $$ = makeList1(makeString($1)); }
| name_list ',' name
{ $$ = lappend($1, makeString($3)); }
name_list: name { $$ = makeList1(makeString($1)); }
| name_list ',' name { $$ = lappend($1, makeString($3)); }
;
name: ColId { $$ = $1; };
database_name: ColId { $$ = $1; };
access_method: ColId { $$ = $1; };
database_name:
ColId { $$ = $1; };
access_method:
ColId { $$ = $1; };
attr_name: ColId { $$ = $1; };
index_name: ColId { $$ = $1; };
file_name: Sconst { $$ = $1; };
func_name: function_name
{ $$ = makeList1(makeString($1)); }
| dotted_name
{ $$ = $1; }
func_name: function_name { $$ = makeList1(makeString($1)); }
| dotted_name { $$ = $1; }
;
...
...
@@ -6319,7 +6389,8 @@ type_name: IDENT { $$ = $1; }
/* Function identifier --- names that can be function names.
*/
function_name: IDENT { $$ = $1; }
function_name:
IDENT { $$ = $1; }
| unreserved_keyword { $$ = pstrdup($1); }
| func_name_keyword { $$ = pstrdup($1); }
;
...
...
@@ -6670,7 +6741,8 @@ reserved_keyword:
;
SpecialRuleRelation: OLD
SpecialRuleRelation:
OLD
{
if (QueryIsRule)
$$ = "*OLD*";
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment