Skip to content

Commit 4527172

Browse files
committed
CHECK/DEFAULT syntax
1 parent bb951c6 commit 4527172

File tree

3 files changed

+163
-25
lines changed

3 files changed

+163
-25
lines changed

src/backend/parser/gram.y

Lines changed: 156 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
*
1212
* IDENTIFICATION
13-
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.36 1997/08/19 04:44:01 vadim Exp $
13+
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.37 1997/08/20 01:12:02 vadim Exp $
1414
*
1515
* HISTORY
1616
* AUTHOR DATE MAJOR EVENT
@@ -49,6 +49,11 @@ static bool QueryIsRule = FALSE;
4949
static Node *saved_In_Expr;
5050
extern List *parsetree;
5151

52+
extern int CurScanPosition(void);
53+
extern int DefaultStartPosition;
54+
extern int CheckStartPosition;
55+
extern char *parseString;
56+
5257
/*
5358
* If you need access to certain yacc-generated variables and find that
5459
* 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);
113118
%type <str> relation_name, copy_file_name, copy_delimiter, def_name,
114119
database_name, access_method_clause, access_method, attr_name,
115120
class, index_name, name, file_name, recipe_name,
116-
var_name, aggr_argtype
121+
var_name, aggr_argtype, OptDefault, CheckElem
117122

118123
%type <str> opt_id, opt_portal_name,
119124
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);
124129
%type <chr> operation
125130

126131
%type <list> stmtblock, stmtmulti,
127-
relation_name_list, OptTableElementList,
128-
tableElementList, OptInherit, definition,
132+
relation_name_list, OptTableElementList, tableElementList,
133+
OptInherit, OptCheck, CheckList, definition,
129134
opt_with, def_args, def_name_list, func_argtypes,
130135
oper_argtypes, OptStmtList, OptStmtBlock, OptStmtMulti,
131136
opt_column_list, columnList, opt_va_list, va_list,
132-
sort_clause, sortby_list, index_params, index_list,
133-
name_list, from_clause, from_list, opt_array_bounds, nest_array_bounds,
134-
expr_list, attrs, res_target_list, res_target_list2,
137+
sort_clause, sortby_list, index_params, index_list, name_list,
138+
from_clause, from_list, opt_array_bounds, nest_array_bounds,
139+
expr_list, default_expr_list, attrs, res_target_list, res_target_list2,
135140
def_list, opt_indirection, group_clause, groupby_list
136141

137142
%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);
154159
%type <defelt> def_elem
155160
%type <node> def_arg, columnElem, where_clause,
156161
a_expr, a_expr_or_null, AexprConst,
162+
default_expr, default_expr_or_null,
157163
in_expr_nodes, not_in_expr_nodes,
158-
having_clause
164+
having_clause, default_expr
159165
%type <value> NumConst
160166
%type <attr> event_object, attr
161167
%type <sortgroupby> groupby
@@ -182,9 +188,9 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
182188
%token ABORT_TRANS, ACL, ADD, AFTER, AGGREGATE, ALL, ALTER, ANALYZE,
183189
AND, APPEND, ARCHIVE, ARCH_STORE, AS, ASC,
184190
BACKWARD, BEFORE, BEGIN_TRANS, BETWEEN, BINARY, BY,
185-
CAST, CHANGE, CLOSE, CLUSTER, COLUMN, COMMIT, COPY, CREATE,
186-
CURRENT, CURSOR, DATABASE, DECLARE, DELETE, DELIMITERS, DESC,
187-
DISTINCT, DO, DROP, END_TRANS,
191+
CAST, CHANGE, CHECK, CLOSE, CLUSTER, COLUMN, COMMIT, COPY, CREATE,
192+
CURRENT, CURSOR, DATABASE, DECLARE, DEFAULT, DELETE,
193+
DELIMITERS, DESC, DISTINCT, DO, DROP, END_TRANS,
188194
EXTEND, FETCH, FOR, FORWARD, FROM, FUNCTION, GRANT, GROUP,
189195
HAVING, HEAVY, IN, INDEX, INHERITS, INSERT, INSTEAD, INTO, IS,
190196
ISNULL, LANGUAGE, LIGHT, LISTEN, LOAD, MERGE, MOVE, NEW,
@@ -333,20 +339,123 @@ AddAttrStmt: ALTER TABLE relation_name opt_inh_star ADD COLUMN columnDef
333339
}
334340
;
335341

336-
columnDef: Id Typename opt_null
342+
columnDef: Id Typename OptDefault opt_null
337343
{
338344
$$ = makeNode(ColumnDef);
339345
$$->colname = $1;
340346
$$->typename = $2;
341-
$$->is_not_null = $3;
347+
$$->defval = $3;
348+
$$->is_not_null = $4;
342349
}
343350
;
344351

345-
opt_null: PNULL { $$ = false; }
346-
| NOT PNULL { $$ = true; }
347-
| NOTNULL { $$ = true; }
348-
| /* EMPTY */ { $$ = false; }
349-
;
352+
OptDefault: DEFAULT default_expr {
353+
int deflen = CurScanPosition() - DefaultStartPosition;
354+
char *defval;
355+
356+
defval = (char*) palloc (deflen + 1);
357+
memcpy (defval,
358+
parseString + DefaultStartPosition,
359+
deflen);
360+
defval[deflen] = 0;
361+
$$ = defval;
362+
}
363+
| /*EMPTY*/ { $$ = NULL; }
364+
;
365+
366+
default_expr_or_null: default_expr
367+
{ $$ = $1;}
368+
| Pnull
369+
{
370+
A_Const *n = makeNode(A_Const);
371+
n->val.type = T_Null;
372+
$$ = (Node *)n;
373+
}
374+
375+
default_expr: AexprConst
376+
{
377+
if (nodeTag($1) != T_A_Const)
378+
elog (WARN, "Cannot handle parameter in DEFAULT");
379+
$$ = $1;
380+
}
381+
| '-' default_expr %prec UMINUS
382+
{ $$ = makeA_Expr(OP, "-", NULL, $2); }
383+
| default_expr '+' default_expr
384+
{ $$ = makeA_Expr(OP, "+", $1, $3); }
385+
| default_expr '-' default_expr
386+
{ $$ = makeA_Expr(OP, "-", $1, $3); }
387+
| default_expr '/' default_expr
388+
{ $$ = makeA_Expr(OP, "/", $1, $3); }
389+
| default_expr '*' default_expr
390+
{ $$ = makeA_Expr(OP, "*", $1, $3); }
391+
| default_expr '<' default_expr
392+
{ $$ = makeA_Expr(OP, "<", $1, $3); }
393+
| default_expr '>' default_expr
394+
{ $$ = makeA_Expr(OP, ">", $1, $3); }
395+
| default_expr '=' default_expr
396+
{ $$ = makeA_Expr(OP, "=", $1, $3); }
397+
| ':' default_expr
398+
{ $$ = makeA_Expr(OP, ":", NULL, $2); }
399+
| ';' default_expr
400+
{ $$ = makeA_Expr(OP, ";", NULL, $2); }
401+
| '|' default_expr
402+
{ $$ = makeA_Expr(OP, "|", NULL, $2); }
403+
| AexprConst TYPECAST Typename
404+
{
405+
/* AexprConst can be either A_Const or ParamNo */
406+
if (nodeTag($1) == T_A_Const) {
407+
((A_Const *)$1)->typename = $3;
408+
}else {
409+
elog (WARN, "Cannot handle parameter in DEFAULT");
410+
}
411+
$$ = (Node *)$1;
412+
}
413+
| CAST AexprConst AS Typename
414+
{
415+
/* AexprConst can be either A_Const or ParamNo */
416+
if (nodeTag($2) == T_A_Const) {
417+
((A_Const *)$2)->typename = $4;
418+
}else {
419+
elog (WARN, "Cannot handle parameter in DEFAULT");
420+
}
421+
$$ = (Node *)$2;
422+
}
423+
| '(' default_expr ')'
424+
{ $$ = $2; }
425+
| default_expr Op default_expr
426+
{ $$ = makeA_Expr(OP, $2, $1, $3); }
427+
| Op default_expr
428+
{ $$ = makeA_Expr(OP, $1, NULL, $2); }
429+
| default_expr Op
430+
{ $$ = makeA_Expr(OP, $2, $1, NULL); }
431+
| name '(' ')'
432+
{
433+
FuncCall *n = makeNode(FuncCall);
434+
n->funcname = $1;
435+
n->args = NIL;
436+
$$ = (Node *)n;
437+
}
438+
| name '(' default_expr_list ')'
439+
{
440+
FuncCall *n = makeNode(FuncCall);
441+
n->funcname = $1;
442+
n->args = $3;
443+
$$ = (Node *)n;
444+
}
445+
;
446+
447+
default_expr_list: default_expr_or_null
448+
{ $$ = lcons($1, NIL); }
449+
| default_expr_list ',' default_expr_or_null
450+
{ $$ = lappend($1, $3); }
451+
;
452+
453+
opt_null: PNULL { $$ = false; }
454+
| NOT PNULL { $$ = true; }
455+
| NOTNULL { $$ = true; }
456+
| /* EMPTY */ { $$ = false; }
457+
;
458+
350459

351460
/*****************************************************************************
352461
*
@@ -425,15 +534,17 @@ copy_delimiter: USING DELIMITERS Sconst { $$ = $3;}
425534
*****************************************************************************/
426535

427536
CreateStmt: CREATE TABLE relation_name '(' OptTableElementList ')'
428-
OptInherit OptArchiveType OptLocation OptArchiveLocation
537+
OptInherit OptCheck OptArchiveType OptLocation
538+
OptArchiveLocation
429539
{
430540
CreateStmt *n = makeNode(CreateStmt);
431541
n->relname = $3;
432542
n->tableElts = $5;
433543
n->inhRelnames = $7;
434-
n->archiveType = $8;
435-
n->location = $9;
436-
n->archiveLoc = $10;
544+
n->check = $8;
545+
n->archiveType = $9;
546+
n->location = $10;
547+
n->archiveLoc = $11;
437548
$$ = (Node *)n;
438549
}
439550
;
@@ -475,6 +586,29 @@ OptInherit: INHERITS '(' relation_name_list ')' { $$ = $3; }
475586
| /*EMPTY*/ { $$ = NIL; }
476587
;
477588

589+
OptCheck: CheckList { $$ = $1; }
590+
| { $$ = NULL; }
591+
;
592+
593+
CheckList :
594+
CheckList ',' CheckElem
595+
{ $$ = lappend($1, $3); }
596+
| CheckElem
597+
{ $$ = lcons($1, NIL); }
598+
;
599+
600+
CheckElem: CHECK a_expr {
601+
int chklen = CurScanPosition() - CheckStartPosition;
602+
char *check;
603+
604+
check = (char*) palloc (chklen + 1);
605+
memcpy (check,
606+
parseString + CheckStartPosition,
607+
chklen);
608+
check[chklen] = 0;
609+
$$ = check;
610+
}
611+
;
478612

479613
/*****************************************************************************
480614
*

src/backend/parser/keywords.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.10 1997/04/23 06:04:46 vadim Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.11 1997/08/20 01:12:04 vadim Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -54,6 +54,7 @@ static ScanKeyword ScanKeywords[] = {
5454
{ "by", BY },
5555
{ "cast", CAST },
5656
{ "change", CHANGE },
57+
{ "check", CHECK },
5758
{ "close", CLOSE },
5859
{ "cluster", CLUSTER },
5960
{ "column", COLUMN },
@@ -64,6 +65,7 @@ static ScanKeyword ScanKeywords[] = {
6465
{ "cursor", CURSOR },
6566
{ "database", DATABASE },
6667
{ "declare", DECLARE },
68+
{ "default", DEFAULT },
6769
{ "delete", DELETE },
6870
{ "delimiters", DELIMITERS },
6971
{ "desc", DESC },

src/include/nodes/parsenodes.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*
77
* Copyright (c) 1994, Regents of the University of California
88
*
9-
* $Id: parsenodes.h,v 1.17 1997/08/19 04:46:15 vadim Exp $
9+
* $Id: parsenodes.h,v 1.18 1997/08/20 01:12:38 vadim Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -136,6 +136,7 @@ typedef struct CreateStmt {
136136
ArchType archiveType; /* archive mode (ARCH_NONE if none */
137137
int location; /* smgrid (-1 if none) */
138138
int archiveLoc; /* smgrid (-1 if none) */
139+
List *check; /* list of CHECK constr */
139140
} CreateStmt;
140141

141142
/* ----------------------
@@ -607,7 +608,8 @@ typedef struct ColumnDef {
607608
NodeTag type;
608609
char *colname; /* name of column */
609610
TypeName *typename; /* type of column */
610-
bool is_not_null; /* flag to NOT NULL constraint */
611+
bool is_not_null; /* flag to NOT NULL constraint */
612+
char *defval; /* default value of column */
611613
} ColumnDef;
612614

613615
/*

0 commit comments

Comments
 (0)