Changeset: e1071353defb for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e1071353defb
Modified Files:
sql/include/sql_relation.h
sql/server/rel_dump.c
sql/server/rel_schema.c
sql/server/sql_parser.y
Branch: Aug2024
Log Message:
introduce sql_exp comment field and use it to store CHECK constraint SQL
expression
diffs (132 lines):
diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h
--- a/sql/include/sql_relation.h
+++ b/sql/include/sql_relation.h
@@ -72,6 +72,7 @@ typedef struct expression {
symmetric:1; /* compare between symmetric */
sql_subtype tpe;
void *p; /* properties for the optimizer */
+ str comment;
} sql_exp;
#define TABLE_PROD_FUNC 1
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -348,6 +348,12 @@ exp_print(mvc *sql, stream *fout, sql_ex
mnstr_printf(fout, "\"%s\".",
dump_escape_ident(sql->ta, exp_relname(e)));
mnstr_printf(fout, "\"%s\"", dump_escape_ident(sql->ta,
exp_name(e)));
}
+
+ if (e->comment) {
+ str s = ATOMformat(TYPE_str, e->comment);
+ mnstr_printf(fout, " COMMENT %s ", s);
+ GDKfree(s);
+ }
if (comma)
mnstr_printf(fout, ", ");
}
@@ -1756,6 +1762,19 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
if (rlabel && rlabel == nlabel)
exp->alias.label = rlabel;
}
+
+ skipWS(r, pos);
+
+
+ //void *ptr = readAtomString(tpe->type->localtype, r, pos);
+ if (strncmp(r+*pos, "COMMENT", strlen("COMMENT")) == 0) {
+ (*pos)+= (int) strlen("COMMENT");
+ skipWS(r, pos);
+ str comment = readAtomString(TYPE_str, r, pos);
+ exp->comment = sa_strdup(sql->sa, comment);
+ GDKfree(comment);
+ }
+
return exp;
}
diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -412,7 +412,9 @@ create_check_plan(sql_query *query, symb
mvc *sql = query->sql;
exp_kind ek = {type_value, card_value, FALSE};
sql_rel *rel = rel_basetable(sql, t, t->base.name);
- sql_exp *e = rel_logical_value_exp(query, &rel, s->data.sym, sql_sel |
sql_no_subquery, ek);
+ sql_exp *e = rel_logical_value_exp(query, &rel,
s->data.lval->h->data.sym, sql_sel | sql_no_subquery, ek);
+ e->comment = sa_strdup(sql->sa, s->data.lval->h->next->data.sval);
+
if (!e || !rel || !is_basetable(rel->op))
return NULL;
rel->exps = rel_base_projection(sql, rel, 0);
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -243,6 +243,8 @@ int yydebug=1;
column_exp
column_option
column_options
+ check_parenthesis_open
+ check_search_condition
comment_on_statement
comparison_predicate
control_statement
@@ -429,6 +431,7 @@ int yydebug=1;
blobstring
calc_ident
calc_restricted_ident
+ check_parenthesis_close
clob
column
forest_element_name
@@ -661,6 +664,8 @@ int yydebug=1;
%right <sval> STRING USTRING XSTRING
%right <sval> X_BODY
+%token name
+
/* sql prefixes to avoid name clashes on various architectures */
%token <sval>
IDENT UIDENT aTYPE RANK MARGFUNC sqlINT OIDNUM HEXADECIMALNUM OCTALNUM
BINARYNUM INTNUM APPROXNUM
@@ -2171,6 +2176,32 @@ opt_match:
| MATCH opt_match_type { $$ = $2; }
;
+check_parenthesis_open:
+ '('
+ {
+ struct scanner *lc = &m->scanner;
+ lc->as = lc->rs->pos + lc->yycur;
+ }
+;
+
+check_parenthesis_close:
+ ')'
+ {
+ struct scanner *lc = &m->scanner;
+ char* check_sql = sa_strndup(SA, lc->rs->buf+lc->as,
lc->rs->pos + lc->yycur - lc->as - 1);
+ $$ = check_sql;
+ }
+;
+
+ check_search_condition:
+ check_parenthesis_open search_condition check_parenthesis_close
+ {
+ dlist *l = L();
+ append_symbol(l, $2);
+ append_string(l, $3);
+ $$ = _symbol_create_list(SQL_CHECK, l);
+ }
+
column_constraint_type:
NOT sqlNULL { $$ = _symbol_create( SQL_NOT_NULL, NULL); }
| sqlNULL { $$ = _symbol_create( SQL_NULL, NULL); }
@@ -2186,7 +2217,7 @@ column_constraint_type:
append_int(l, $4 );
append_int(l, $5 );
$$ = _symbol_create_list( SQL_FOREIGN_KEY, l); }
- | CHECK '(' search_condition ')' { $$ = _symbol_create_symbol(SQL_CHECK,
$3); }
+ | CHECK check_search_condition { $$ = $2; }
;
table_constraint_type:
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]