Commit 42423c71 authored by Bruce Momjian's avatar Bruce Momjian

Manually indent gram.y to be consistent.

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