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 -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org