mirror of
https://github.com/postgres/postgres.git
synced 2025-05-28 00:03:23 -04:00
CHECK/DEFAULT syntax
This commit is contained in:
parent
bb951c6cb4
commit
4527172b80
@ -10,7 +10,7 @@
|
||||
*
|
||||
*
|
||||
* 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
|
||||
* AUTHOR DATE MAJOR EVENT
|
||||
@ -49,6 +49,11 @@ static bool QueryIsRule = FALSE;
|
||||
static Node *saved_In_Expr;
|
||||
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
|
||||
* 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,
|
||||
database_name, access_method_clause, access_method, attr_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,
|
||||
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 <list> stmtblock, stmtmulti,
|
||||
relation_name_list, OptTableElementList,
|
||||
tableElementList, OptInherit, definition,
|
||||
relation_name_list, OptTableElementList, tableElementList,
|
||||
OptInherit, OptCheck, CheckList, definition,
|
||||
opt_with, def_args, def_name_list, func_argtypes,
|
||||
oper_argtypes, OptStmtList, OptStmtBlock, OptStmtMulti,
|
||||
opt_column_list, columnList, opt_va_list, va_list,
|
||||
sort_clause, sortby_list, index_params, index_list,
|
||||
name_list, from_clause, from_list, opt_array_bounds, nest_array_bounds,
|
||||
expr_list, attrs, res_target_list, res_target_list2,
|
||||
sort_clause, sortby_list, index_params, index_list, name_list,
|
||||
from_clause, from_list, opt_array_bounds, nest_array_bounds,
|
||||
expr_list, default_expr_list, attrs, res_target_list, res_target_list2,
|
||||
def_list, opt_indirection, group_clause, groupby_list
|
||||
|
||||
%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 <node> def_arg, columnElem, where_clause,
|
||||
a_expr, a_expr_or_null, AexprConst,
|
||||
default_expr, default_expr_or_null,
|
||||
in_expr_nodes, not_in_expr_nodes,
|
||||
having_clause
|
||||
having_clause, default_expr
|
||||
%type <value> NumConst
|
||||
%type <attr> event_object, attr
|
||||
%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,
|
||||
AND, APPEND, ARCHIVE, ARCH_STORE, AS, ASC,
|
||||
BACKWARD, BEFORE, BEGIN_TRANS, BETWEEN, BINARY, BY,
|
||||
CAST, CHANGE, CLOSE, CLUSTER, COLUMN, COMMIT, COPY, CREATE,
|
||||
CURRENT, CURSOR, DATABASE, DECLARE, DELETE, DELIMITERS, DESC,
|
||||
DISTINCT, DO, DROP, END_TRANS,
|
||||
CAST, CHANGE, CHECK, CLOSE, CLUSTER, COLUMN, COMMIT, COPY, CREATE,
|
||||
CURRENT, CURSOR, DATABASE, DECLARE, DEFAULT, DELETE,
|
||||
DELIMITERS, DESC, DISTINCT, DO, DROP, END_TRANS,
|
||||
EXTEND, FETCH, FOR, FORWARD, FROM, FUNCTION, GRANT, GROUP,
|
||||
HAVING, HEAVY, IN, INDEX, INHERITS, INSERT, INSTEAD, INTO, IS,
|
||||
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);
|
||||
$$->colname = $1;
|
||||
$$->typename = $2;
|
||||
$$->is_not_null = $3;
|
||||
$$->defval = $3;
|
||||
$$->is_not_null = $4;
|
||||
}
|
||||
;
|
||||
|
||||
opt_null: PNULL { $$ = false; }
|
||||
| NOT PNULL { $$ = true; }
|
||||
| NOTNULL { $$ = true; }
|
||||
| /* EMPTY */ { $$ = false; }
|
||||
;
|
||||
OptDefault: DEFAULT default_expr {
|
||||
int deflen = CurScanPosition() - DefaultStartPosition;
|
||||
char *defval;
|
||||
|
||||
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 ')'
|
||||
OptInherit OptArchiveType OptLocation OptArchiveLocation
|
||||
OptInherit OptCheck OptArchiveType OptLocation
|
||||
OptArchiveLocation
|
||||
{
|
||||
CreateStmt *n = makeNode(CreateStmt);
|
||||
n->relname = $3;
|
||||
n->tableElts = $5;
|
||||
n->inhRelnames = $7;
|
||||
n->archiveType = $8;
|
||||
n->location = $9;
|
||||
n->archiveLoc = $10;
|
||||
n->check = $8;
|
||||
n->archiveType = $9;
|
||||
n->location = $10;
|
||||
n->archiveLoc = $11;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
;
|
||||
@ -475,6 +586,29 @@ OptInherit: INHERITS '(' relation_name_list ')' { $$ = $3; }
|
||||
| /*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
|
||||
* $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 },
|
||||
{ "cast", CAST },
|
||||
{ "change", CHANGE },
|
||||
{ "check", CHECK },
|
||||
{ "close", CLOSE },
|
||||
{ "cluster", CLUSTER },
|
||||
{ "column", COLUMN },
|
||||
@ -64,6 +65,7 @@ static ScanKeyword ScanKeywords[] = {
|
||||
{ "cursor", CURSOR },
|
||||
{ "database", DATABASE },
|
||||
{ "declare", DECLARE },
|
||||
{ "default", DEFAULT },
|
||||
{ "delete", DELETE },
|
||||
{ "delimiters", DELIMITERS },
|
||||
{ "desc", DESC },
|
||||
|
@ -6,7 +6,7 @@
|
||||
*
|
||||
* 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 */
|
||||
int location; /* smgrid (-1 if none) */
|
||||
int archiveLoc; /* smgrid (-1 if none) */
|
||||
List *check; /* list of CHECK constr */
|
||||
} CreateStmt;
|
||||
|
||||
/* ----------------------
|
||||
@ -607,7 +608,8 @@ typedef struct ColumnDef {
|
||||
NodeTag type;
|
||||
char *colname; /* name 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;
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user