Changeset: 0710c29f03e9 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0710c29f03e9
Modified Files:
        sql/common/sql_types.c
        sql/include/sql_catalog.h
        sql/server/rel_schema.c
        sql/server/rel_select.c
        sql/storage/sql_catalog.c
        sql/storage/store.c
Branch: graph0
Log Message:

SEMA: Avoid to explicitly refer to the sql type nested_table


diffs (109 lines):

diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -1031,6 +1031,7 @@ sql_create_type(sql_allocator *sa, const
        t->radix = radix;
        t->eclass = eclass;
        t->s = NULL;
+       t->storage = true;
        if (!keyword_exists(t->sqlname) && !EC_INTERVAL(eclass)) 
                keywords_insert(t->sqlname, KW_TYPE);
        list_append(types, t);
@@ -1269,6 +1270,7 @@ sqltypeinit( sql_allocator *sa)
        sql_func *f;
        sql_arg *sres;
        sql_type *LargestINT, *LargestDEC;
+       sql_type *NESTED_TABLE;
 
        ANY = sql_create_type(sa, "ANY", 0, 0, 0, EC_ANY, "void");
 
@@ -1347,7 +1349,8 @@ sqltypeinit( sql_allocator *sa)
 
        *t++ = sql_create_type(sa, "BLOB", 0, 0, 0, EC_BLOB, "sqlblob");
 
-       *t++ = sql_create_type(sa, "NESTED_TABLE", 0, 0, 0, EC_NESTED_TABLE, 
"nestedtable");
+       NESTED_TABLE = *t++ = sql_create_type(sa, "NESTED_TABLE", 0, 0, 0, 
EC_NESTED_TABLE, "nestedtable");
+       NESTED_TABLE->storage = false;
 
        if (geomcatalogfix_get() != NULL) {
                // the geom module is loaded 
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -249,6 +249,7 @@ typedef struct sql_type {
        unsigned int bits;
        unsigned char eclass;   /* types are grouped into equivalence classes */
        sql_schema *s;
+       bool storage;
 } sql_type;
 
 typedef struct sql_alias {
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
@@ -645,6 +645,11 @@ create_column(mvc *sql, symbol *s, sql_s
        if (cname && ctype) {
                sql_column *cs = NULL;
 
+               if(!ctype->type->storage){
+                       sql_error(sql, 02, "42S21!%s TABLE: cannot refer to the 
type '%s' in the attribute '%s'", (alter)?"ALTER":"CREATE", 
ctype->type->sqlname, cname);
+                       return SQL_ERR;
+               }
+
                cs = find_sql_column(t, cname);
                if (cs) {
                        sql_error(sql, 02, "42S21!%s TABLE: a column named '%s' 
already exists\n", (alter)?"ALTER":"CREATE", cname);
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -4885,9 +4885,8 @@ rel_unique_names(mvc *sql, sql_rel *rel)
        return rel;
 }
 
-
 static sql_rel *
-validate_result_type (mvc *sql, sql_rel *rel){
+validate_result_type(mvc *sql, sql_rel *rel){
        list *exps = rel_projections(sql, rel, NULL, true, false);
        for(node *n = exps->h; n; n = n->next){
                sql_exp *e = n->data;
diff --git a/sql/storage/sql_catalog.c b/sql/storage/sql_catalog.c
--- a/sql/storage/sql_catalog.c
+++ b/sql/storage/sql_catalog.c
@@ -264,6 +264,9 @@ sql_trans_bind_type(sql_trans *tr, sql_s
 
        if (!t && c)
                t = find_sql_type(c, name);
+
+       if(t && !t->storage){ return NULL; } // cannot explicitly refer to the 
nested table ftb
+
        return t;
 }
 
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -719,6 +719,7 @@ load_type(sql_trans *tr, sql_schema *s, 
        t->localtype = ATOMindex(t->base.name);
        t->bits = 0;
        t->s = s;
+       t->storage = (strcmp(s->base.name, "sys") == 0 && strcmp(t->sqlname, 
"nested_table") == 0) ? false : true; // a bit hacky
        return t;
 }
 
@@ -2433,6 +2434,7 @@ type_dup(sql_trans *tr, int flag, sql_ty
        t->bits = ot->bits;
        t->localtype = ot->localtype;
        t->s = s;
+       t->storage = ot->storage;
        return t;
 }
 
@@ -4058,6 +4060,7 @@ sql_trans_create_type(sql_trans *tr, sql
        t->eclass = eclass;
        t->localtype = localtype;
        t->s = s;
+       t->storage = true;
 
        cs_add(&s->types, t, TR_NEW);
        table_funcs.table_insert(tr, systype, &t->base.id, t->base.name, 
t->sqlname, &t->digits, &t->scale, &radix, &eclass, &s->base.id);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to