CHECK/DEFAULT syntax
This commit is contained in:
parent
bb951c6cb4
commit
4527172b80
@ -10,7 +10,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.36 1997/08/19 04:44:01 vadim Exp $
|
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.37 1997/08/20 01:12:02 vadim Exp $
|
||||||
*
|
*
|
||||||
* HISTORY
|
* HISTORY
|
||||||
* AUTHOR DATE MAJOR EVENT
|
* AUTHOR DATE MAJOR EVENT
|
||||||
@ -49,6 +49,11 @@ static bool QueryIsRule = FALSE;
|
|||||||
static Node *saved_In_Expr;
|
static Node *saved_In_Expr;
|
||||||
extern List *parsetree;
|
extern List *parsetree;
|
||||||
|
|
||||||
|
extern int CurScanPosition(void);
|
||||||
|
extern int DefaultStartPosition;
|
||||||
|
extern int CheckStartPosition;
|
||||||
|
extern char *parseString;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If you need access to certain yacc-generated variables and find that
|
* If you need access to certain yacc-generated variables and find that
|
||||||
* they're static by default, uncomment the next line. (this is not a
|
* they're static by default, uncomment the next line. (this is not a
|
||||||
@ -113,7 +118,7 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
|
|||||||
%type <str> relation_name, copy_file_name, copy_delimiter, def_name,
|
%type <str> relation_name, copy_file_name, copy_delimiter, def_name,
|
||||||
database_name, access_method_clause, access_method, attr_name,
|
database_name, access_method_clause, access_method, attr_name,
|
||||||
class, index_name, name, file_name, recipe_name,
|
class, index_name, name, file_name, recipe_name,
|
||||||
var_name, aggr_argtype
|
var_name, aggr_argtype, OptDefault, CheckElem
|
||||||
|
|
||||||
%type <str> opt_id, opt_portal_name,
|
%type <str> opt_id, opt_portal_name,
|
||||||
before_clause, after_clause, all_Op, MathOp, opt_name, opt_unique,
|
before_clause, after_clause, all_Op, MathOp, opt_name, opt_unique,
|
||||||
@ -124,14 +129,14 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
|
|||||||
%type <chr> operation
|
%type <chr> operation
|
||||||
|
|
||||||
%type <list> stmtblock, stmtmulti,
|
%type <list> stmtblock, stmtmulti,
|
||||||
relation_name_list, OptTableElementList,
|
relation_name_list, OptTableElementList, tableElementList,
|
||||||
tableElementList, OptInherit, definition,
|
OptInherit, OptCheck, CheckList, definition,
|
||||||
opt_with, def_args, def_name_list, func_argtypes,
|
opt_with, def_args, def_name_list, func_argtypes,
|
||||||
oper_argtypes, OptStmtList, OptStmtBlock, OptStmtMulti,
|
oper_argtypes, OptStmtList, OptStmtBlock, OptStmtMulti,
|
||||||
opt_column_list, columnList, opt_va_list, va_list,
|
opt_column_list, columnList, opt_va_list, va_list,
|
||||||
sort_clause, sortby_list, index_params, index_list,
|
sort_clause, sortby_list, index_params, index_list, name_list,
|
||||||
name_list, from_clause, from_list, opt_array_bounds, nest_array_bounds,
|
from_clause, from_list, opt_array_bounds, nest_array_bounds,
|
||||||
expr_list, attrs, res_target_list, res_target_list2,
|
expr_list, default_expr_list, attrs, res_target_list, res_target_list2,
|
||||||
def_list, opt_indirection, group_clause, groupby_list
|
def_list, opt_indirection, group_clause, groupby_list
|
||||||
|
|
||||||
%type <boolean> opt_inh_star, opt_binary, opt_instead, opt_with_copy,
|
%type <boolean> opt_inh_star, opt_binary, opt_instead, opt_with_copy,
|
||||||
@ -154,8 +159,9 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
|
|||||||
%type <defelt> def_elem
|
%type <defelt> def_elem
|
||||||
%type <node> def_arg, columnElem, where_clause,
|
%type <node> def_arg, columnElem, where_clause,
|
||||||
a_expr, a_expr_or_null, AexprConst,
|
a_expr, a_expr_or_null, AexprConst,
|
||||||
|
default_expr, default_expr_or_null,
|
||||||
in_expr_nodes, not_in_expr_nodes,
|
in_expr_nodes, not_in_expr_nodes,
|
||||||
having_clause
|
having_clause, default_expr
|
||||||
%type <value> NumConst
|
%type <value> NumConst
|
||||||
%type <attr> event_object, attr
|
%type <attr> event_object, attr
|
||||||
%type <sortgroupby> groupby
|
%type <sortgroupby> groupby
|
||||||
@ -182,9 +188,9 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
|
|||||||
%token ABORT_TRANS, ACL, ADD, AFTER, AGGREGATE, ALL, ALTER, ANALYZE,
|
%token ABORT_TRANS, ACL, ADD, AFTER, AGGREGATE, ALL, ALTER, ANALYZE,
|
||||||
AND, APPEND, ARCHIVE, ARCH_STORE, AS, ASC,
|
AND, APPEND, ARCHIVE, ARCH_STORE, AS, ASC,
|
||||||
BACKWARD, BEFORE, BEGIN_TRANS, BETWEEN, BINARY, BY,
|
BACKWARD, BEFORE, BEGIN_TRANS, BETWEEN, BINARY, BY,
|
||||||
CAST, CHANGE, CLOSE, CLUSTER, COLUMN, COMMIT, COPY, CREATE,
|
CAST, CHANGE, CHECK, CLOSE, CLUSTER, COLUMN, COMMIT, COPY, CREATE,
|
||||||
CURRENT, CURSOR, DATABASE, DECLARE, DELETE, DELIMITERS, DESC,
|
CURRENT, CURSOR, DATABASE, DECLARE, DEFAULT, DELETE,
|
||||||
DISTINCT, DO, DROP, END_TRANS,
|
DELIMITERS, DESC, DISTINCT, DO, DROP, END_TRANS,
|
||||||
EXTEND, FETCH, FOR, FORWARD, FROM, FUNCTION, GRANT, GROUP,
|
EXTEND, FETCH, FOR, FORWARD, FROM, FUNCTION, GRANT, GROUP,
|
||||||
HAVING, HEAVY, IN, INDEX, INHERITS, INSERT, INSTEAD, INTO, IS,
|
HAVING, HEAVY, IN, INDEX, INHERITS, INSERT, INSTEAD, INTO, IS,
|
||||||
ISNULL, LANGUAGE, LIGHT, LISTEN, LOAD, MERGE, MOVE, NEW,
|
ISNULL, LANGUAGE, LIGHT, LISTEN, LOAD, MERGE, MOVE, NEW,
|
||||||
@ -333,20 +339,123 @@ AddAttrStmt: ALTER TABLE relation_name opt_inh_star ADD COLUMN columnDef
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
columnDef: Id Typename opt_null
|
columnDef: Id Typename OptDefault opt_null
|
||||||
{
|
{
|
||||||
$$ = makeNode(ColumnDef);
|
$$ = makeNode(ColumnDef);
|
||||||
$$->colname = $1;
|
$$->colname = $1;
|
||||||
$$->typename = $2;
|
$$->typename = $2;
|
||||||
$$->is_not_null = $3;
|
$$->defval = $3;
|
||||||
|
$$->is_not_null = $4;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
opt_null: PNULL { $$ = false; }
|
OptDefault: DEFAULT default_expr {
|
||||||
| NOT PNULL { $$ = true; }
|
int deflen = CurScanPosition() - DefaultStartPosition;
|
||||||
| NOTNULL { $$ = true; }
|
char *defval;
|
||||||
| /* EMPTY */ { $$ = false; }
|
|
||||||
;
|
defval = (char*) palloc (deflen + 1);
|
||||||
|
memcpy (defval,
|
||||||
|
parseString + DefaultStartPosition,
|
||||||
|
deflen);
|
||||||
|
defval[deflen] = 0;
|
||||||
|
$$ = defval;
|
||||||
|
}
|
||||||
|
| /*EMPTY*/ { $$ = NULL; }
|
||||||
|
;
|
||||||
|
|
||||||
|
default_expr_or_null: default_expr
|
||||||
|
{ $$ = $1;}
|
||||||
|
| Pnull
|
||||||
|
{
|
||||||
|
A_Const *n = makeNode(A_Const);
|
||||||
|
n->val.type = T_Null;
|
||||||
|
$$ = (Node *)n;
|
||||||
|
}
|
||||||
|
|
||||||
|
default_expr: AexprConst
|
||||||
|
{
|
||||||
|
if (nodeTag($1) != T_A_Const)
|
||||||
|
elog (WARN, "Cannot handle parameter in DEFAULT");
|
||||||
|
$$ = $1;
|
||||||
|
}
|
||||||
|
| '-' default_expr %prec UMINUS
|
||||||
|
{ $$ = makeA_Expr(OP, "-", NULL, $2); }
|
||||||
|
| default_expr '+' default_expr
|
||||||
|
{ $$ = makeA_Expr(OP, "+", $1, $3); }
|
||||||
|
| default_expr '-' default_expr
|
||||||
|
{ $$ = makeA_Expr(OP, "-", $1, $3); }
|
||||||
|
| default_expr '/' default_expr
|
||||||
|
{ $$ = makeA_Expr(OP, "/", $1, $3); }
|
||||||
|
| default_expr '*' default_expr
|
||||||
|
{ $$ = makeA_Expr(OP, "*", $1, $3); }
|
||||||
|
| default_expr '<' default_expr
|
||||||
|
{ $$ = makeA_Expr(OP, "<", $1, $3); }
|
||||||
|
| default_expr '>' default_expr
|
||||||
|
{ $$ = makeA_Expr(OP, ">", $1, $3); }
|
||||||
|
| default_expr '=' default_expr
|
||||||
|
{ $$ = makeA_Expr(OP, "=", $1, $3); }
|
||||||
|
| ':' default_expr
|
||||||
|
{ $$ = makeA_Expr(OP, ":", NULL, $2); }
|
||||||
|
| ';' default_expr
|
||||||
|
{ $$ = makeA_Expr(OP, ";", NULL, $2); }
|
||||||
|
| '|' default_expr
|
||||||
|
{ $$ = makeA_Expr(OP, "|", NULL, $2); }
|
||||||
|
| AexprConst TYPECAST Typename
|
||||||
|
{
|
||||||
|
/* AexprConst can be either A_Const or ParamNo */
|
||||||
|
if (nodeTag($1) == T_A_Const) {
|
||||||
|
((A_Const *)$1)->typename = $3;
|
||||||
|
}else {
|
||||||
|
elog (WARN, "Cannot handle parameter in DEFAULT");
|
||||||
|
}
|
||||||
|
$$ = (Node *)$1;
|
||||||
|
}
|
||||||
|
| CAST AexprConst AS Typename
|
||||||
|
{
|
||||||
|
/* AexprConst can be either A_Const or ParamNo */
|
||||||
|
if (nodeTag($2) == T_A_Const) {
|
||||||
|
((A_Const *)$2)->typename = $4;
|
||||||
|
}else {
|
||||||
|
elog (WARN, "Cannot handle parameter in DEFAULT");
|
||||||
|
}
|
||||||
|
$$ = (Node *)$2;
|
||||||
|
}
|
||||||
|
| '(' default_expr ')'
|
||||||
|
{ $$ = $2; }
|
||||||
|
| default_expr Op default_expr
|
||||||
|
{ $$ = makeA_Expr(OP, $2, $1, $3); }
|
||||||
|
| Op default_expr
|
||||||
|
{ $$ = makeA_Expr(OP, $1, NULL, $2); }
|
||||||
|
| default_expr Op
|
||||||
|
{ $$ = makeA_Expr(OP, $2, $1, NULL); }
|
||||||
|
| name '(' ')'
|
||||||
|
{
|
||||||
|
FuncCall *n = makeNode(FuncCall);
|
||||||
|
n->funcname = $1;
|
||||||
|
n->args = NIL;
|
||||||
|
$$ = (Node *)n;
|
||||||
|
}
|
||||||
|
| name '(' default_expr_list ')'
|
||||||
|
{
|
||||||
|
FuncCall *n = makeNode(FuncCall);
|
||||||
|
n->funcname = $1;
|
||||||
|
n->args = $3;
|
||||||
|
$$ = (Node *)n;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
default_expr_list: default_expr_or_null
|
||||||
|
{ $$ = lcons($1, NIL); }
|
||||||
|
| default_expr_list ',' default_expr_or_null
|
||||||
|
{ $$ = lappend($1, $3); }
|
||||||
|
;
|
||||||
|
|
||||||
|
opt_null: PNULL { $$ = false; }
|
||||||
|
| NOT PNULL { $$ = true; }
|
||||||
|
| NOTNULL { $$ = true; }
|
||||||
|
| /* EMPTY */ { $$ = false; }
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
@ -425,15 +534,17 @@ copy_delimiter: USING DELIMITERS Sconst { $$ = $3;}
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
CreateStmt: CREATE TABLE relation_name '(' OptTableElementList ')'
|
CreateStmt: CREATE TABLE relation_name '(' OptTableElementList ')'
|
||||||
OptInherit OptArchiveType OptLocation OptArchiveLocation
|
OptInherit OptCheck OptArchiveType OptLocation
|
||||||
|
OptArchiveLocation
|
||||||
{
|
{
|
||||||
CreateStmt *n = makeNode(CreateStmt);
|
CreateStmt *n = makeNode(CreateStmt);
|
||||||
n->relname = $3;
|
n->relname = $3;
|
||||||
n->tableElts = $5;
|
n->tableElts = $5;
|
||||||
n->inhRelnames = $7;
|
n->inhRelnames = $7;
|
||||||
n->archiveType = $8;
|
n->check = $8;
|
||||||
n->location = $9;
|
n->archiveType = $9;
|
||||||
n->archiveLoc = $10;
|
n->location = $10;
|
||||||
|
n->archiveLoc = $11;
|
||||||
$$ = (Node *)n;
|
$$ = (Node *)n;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
@ -475,6 +586,29 @@ OptInherit: INHERITS '(' relation_name_list ')' { $$ = $3; }
|
|||||||
| /*EMPTY*/ { $$ = NIL; }
|
| /*EMPTY*/ { $$ = NIL; }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
OptCheck: CheckList { $$ = $1; }
|
||||||
|
| { $$ = NULL; }
|
||||||
|
;
|
||||||
|
|
||||||
|
CheckList :
|
||||||
|
CheckList ',' CheckElem
|
||||||
|
{ $$ = lappend($1, $3); }
|
||||||
|
| CheckElem
|
||||||
|
{ $$ = lcons($1, NIL); }
|
||||||
|
;
|
||||||
|
|
||||||
|
CheckElem: CHECK a_expr {
|
||||||
|
int chklen = CurScanPosition() - CheckStartPosition;
|
||||||
|
char *check;
|
||||||
|
|
||||||
|
check = (char*) palloc (chklen + 1);
|
||||||
|
memcpy (check,
|
||||||
|
parseString + CheckStartPosition,
|
||||||
|
chklen);
|
||||||
|
check[chklen] = 0;
|
||||||
|
$$ = check;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.10 1997/04/23 06:04:46 vadim Exp $
|
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.11 1997/08/20 01:12:04 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -54,6 +54,7 @@ static ScanKeyword ScanKeywords[] = {
|
|||||||
{ "by", BY },
|
{ "by", BY },
|
||||||
{ "cast", CAST },
|
{ "cast", CAST },
|
||||||
{ "change", CHANGE },
|
{ "change", CHANGE },
|
||||||
|
{ "check", CHECK },
|
||||||
{ "close", CLOSE },
|
{ "close", CLOSE },
|
||||||
{ "cluster", CLUSTER },
|
{ "cluster", CLUSTER },
|
||||||
{ "column", COLUMN },
|
{ "column", COLUMN },
|
||||||
@ -64,6 +65,7 @@ static ScanKeyword ScanKeywords[] = {
|
|||||||
{ "cursor", CURSOR },
|
{ "cursor", CURSOR },
|
||||||
{ "database", DATABASE },
|
{ "database", DATABASE },
|
||||||
{ "declare", DECLARE },
|
{ "declare", DECLARE },
|
||||||
|
{ "default", DEFAULT },
|
||||||
{ "delete", DELETE },
|
{ "delete", DELETE },
|
||||||
{ "delimiters", DELIMITERS },
|
{ "delimiters", DELIMITERS },
|
||||||
{ "desc", DESC },
|
{ "desc", DESC },
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
* Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: parsenodes.h,v 1.17 1997/08/19 04:46:15 vadim Exp $
|
* $Id: parsenodes.h,v 1.18 1997/08/20 01:12:38 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -136,6 +136,7 @@ typedef struct CreateStmt {
|
|||||||
ArchType archiveType; /* archive mode (ARCH_NONE if none */
|
ArchType archiveType; /* archive mode (ARCH_NONE if none */
|
||||||
int location; /* smgrid (-1 if none) */
|
int location; /* smgrid (-1 if none) */
|
||||||
int archiveLoc; /* smgrid (-1 if none) */
|
int archiveLoc; /* smgrid (-1 if none) */
|
||||||
|
List *check; /* list of CHECK constr */
|
||||||
} CreateStmt;
|
} CreateStmt;
|
||||||
|
|
||||||
/* ----------------------
|
/* ----------------------
|
||||||
@ -607,7 +608,8 @@ typedef struct ColumnDef {
|
|||||||
NodeTag type;
|
NodeTag type;
|
||||||
char *colname; /* name of column */
|
char *colname; /* name of column */
|
||||||
TypeName *typename; /* type of column */
|
TypeName *typename; /* type of column */
|
||||||
bool is_not_null; /* flag to NOT NULL constraint */
|
bool is_not_null; /* flag to NOT NULL constraint */
|
||||||
|
char *defval; /* default value of column */
|
||||||
} ColumnDef;
|
} ColumnDef;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user