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

Reply via email to