Changeset: 8fe46f56238e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/8fe46f56238e
Modified Files:
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_cat.c
        sql/backends/monet5/sql_orderidx.c
        sql/backends/monet5/sql_strimps.c
        sql/test/orderidx/Tests/simpletable.test
        sql/test/orderidx/Tests/smalltable.test
Branch: Jan2022
Log Message:

Look for created views in bat storage, and make sure indexes are created on 
parent bats


diffs (261 lines):

diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -3770,11 +3770,8 @@ SQLdrop_hash(Client cntxt, MalBlkPtr mb,
        const char *tbl = *getArgReference_str(stk, pci, 2);
        sql_schema *s;
        sql_table *t;
-       sql_column *c;
        mvc *m = NULL;
        str msg;
-       BAT *b;
-       node *o;
 
        if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
                return msg;
@@ -3793,11 +3790,17 @@ SQLdrop_hash(Client cntxt, MalBlkPtr mb,
                          TABLE_TYPE_DESCRIPTION(t->type, t->properties), 
t->base.name);
 
        sqlstore *store = m->session->tr->store;
-       for (o = ol_first_node(t->columns); o; o = o->next) {
-               c = o->data;
-               b = store->storage_api.bind_col(m->session->tr, c, RDONLY);
-               if (b == NULL)
+       for (node *n = ol_first_node(t->columns); n; n = n->next) {
+               sql_column *c = n->data;
+               BAT *b = NULL, *nb = NULL;
+
+               if (!(b = store->storage_api.bind_col(m->session->tr, c, 
RDONLY)))
                        throw(SQL, "sql.drop_hash", SQLSTATE(HY005) "Cannot 
access column descriptor");
+               if (VIEWtparent(b) && (nb = BBP_cache(VIEWtparent(b)))) {
+                       BBPunfix(b->batCacheid);
+                       if (!(b = BATdescriptor(nb->batCacheid)))
+                               throw(SQL, "sql.drop_hash", SQLSTATE(HY005) 
"Cannot access column descriptor");
+               }
                HASHdestroy(b);
                BBPunfix(b->batCacheid);
        }
diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -737,10 +737,28 @@ drop_key(mvc *sql, char *sname, char *tn
 }
 
 static str
-drop_index(Client cntxt, mvc *sql, char *sname, char *iname)
+IDXdrop(mvc *sql, const char *sname, const char *tname, const char *iname, 
void (*func)(BAT *))
+{
+       BAT *b = mvc_bind(sql, sname, tname, iname, RDONLY), *nb = NULL;
+
+       if (!b)
+               throw(SQL,"sql.drop_index", SQLSTATE(HY005) "Column can not be 
accessed");
+       if (VIEWtparent(b) && (nb = BBP_cache(VIEWtparent(b)))) {
+               BBPunfix(b->batCacheid);
+               if (!(b = BATdescriptor(nb->batCacheid)))
+                       throw(SQL,"sql.drop_index", SQLSTATE(HY005) "Column can 
not be accessed");
+       }
+       func(b);
+       BBPunfix(b->batCacheid);
+       return MAL_SUCCEED;
+}
+
+static str
+drop_index(mvc *sql, char *sname, char *iname)
 {
        sql_schema *s = NULL;
        sql_idx *i = NULL;
+       str msg = MAL_SUCCEED;
 
        if (!(s = mvc_bind_schema(sql, sname)))
                throw(SQL,"sql.drop_index", SQLSTATE(3F000) "DROP INDEX: no 
such schema '%s'", sname);
@@ -750,21 +768,10 @@ drop_index(Client cntxt, mvc *sql, char 
                throw(SQL,"sql.drop_index", SQLSTATE(42S12) "DROP INDEX: no 
such index '%s'", iname);
        if (i->key)
                throw(SQL,"sql.drop_index", SQLSTATE(42S12) "DROP INDEX: cannot 
drop index '%s', because the constraint '%s' depends on it", iname, 
i->key->base.name);
-       if (i->type == ordered_idx) {
+       if (i->type == ordered_idx || i->type == imprints_idx) {
                sql_kc *ic = i->columns->h->data;
-               BAT *b = mvc_bind(sql, s->base.name, ic->c->t->base.name, 
ic->c->base.name, 0);
-               if (b) {
-                       OIDXdropImplementation(cntxt, b);
-                       BBPunfix(b->batCacheid);
-               }
-       }
-       if (i->type == imprints_idx) {
-               sql_kc *ic = i->columns->h->data;
-               BAT *b = mvc_bind(sql, s->base.name, ic->c->t->base.name, 
ic->c->base.name, 0);
-               if (b) {
-                       IMPSdestroy(b);
-                       BBPunfix(b->batCacheid);
-               }
+               if ((msg = IDXdrop(sql, s->base.name, ic->c->t->base.name, 
ic->c->base.name, i->type == ordered_idx ? OIDXdestroy : IMPSdestroy)))
+                       return msg;
        }
        switch (mvc_drop_idx(sql, s, i)) {
                case -1:
@@ -1243,15 +1250,20 @@ alter_table(Client cntxt, mvc *sql, char
                /* alter add index */
                for (n = ol_first_node(t->idxs); n; n = n->next) {
                        sql_idx *i = n->data;
+                       BAT *b = NULL, *nb = NULL;
 
                        if (!i->base.new || i->base.deleted)
                                continue;
 
                        if (i->type == ordered_idx) {
                                sql_kc *ic = i->columns->h->data;
-                               BAT *b = mvc_bind(sql, nt->s->base.name, 
nt->base.name, ic->c->base.name, 0);
-                               if (b == NULL)
+                               if (!(b = mvc_bind(sql, nt->s->base.name, 
nt->base.name, ic->c->base.name, RDONLY)))
                                        
throw(SQL,"sql.alter_table",SQLSTATE(HY005) "Cannot access ordered index 
%s_%s_%s", s->base.name, t->base.name, i->base.name);
+                               if (VIEWtparent(b) && (nb = 
BBP_cache(VIEWtparent(b)))) {
+                                       BBPunfix(b->batCacheid);
+                                       if (!(b = 
BATdescriptor(nb->batCacheid)))
+                                               
throw(SQL,"sql.alter_table",SQLSTATE(HY005) "Cannot access ordered index 
%s_%s_%s", s->base.name, t->base.name, i->base.name);
+                               }
                                char *msg = OIDXcreateImplementation(cntxt, 
newBatType(b->ttype), b, -1);
                                BBPunfix(b->batCacheid);
                                if (msg != MAL_SUCCEED) {
@@ -1263,9 +1275,13 @@ alter_table(Client cntxt, mvc *sql, char
                        if (i->type == imprints_idx) {
                                gdk_return r;
                                sql_kc *ic = i->columns->h->data;
-                               BAT *b = mvc_bind(sql, nt->s->base.name, 
nt->base.name, ic->c->base.name, 0);
-                               if (b == NULL)
+                               if (!(b = mvc_bind(sql, nt->s->base.name, 
nt->base.name, ic->c->base.name, RDONLY)))
                                        
throw(SQL,"sql.alter_table",SQLSTATE(HY005) "Cannot access imprints index 
%s_%s_%s", s->base.name, t->base.name, i->base.name);
+                               if (VIEWtparent(b) && (nb = 
BBP_cache(VIEWtparent(b)))) {
+                                       BBPunfix(b->batCacheid);
+                                       if (!(b = 
BATdescriptor(nb->batCacheid)))
+                                               
throw(SQL,"sql.alter_table",SQLSTATE(HY005) "Cannot access ordered index 
%s_%s_%s", s->base.name, t->base.name, i->base.name);
+                               }
                                r = BATimprints(b);
                                BBPunfix(b->batCacheid);
                                if (r != GDK_SUCCEED)
@@ -1797,7 +1813,7 @@ SQLdrop_index(Client cntxt, MalBlkPtr mb
        char *iname = *getArgReference_str(stk, pci, 2);
 
        initcontext();
-       msg = drop_index(cntxt, sql, sname, iname);
+       msg = drop_index(sql, sname, iname);
        return msg;
 }
 
diff --git a/sql/backends/monet5/sql_orderidx.c 
b/sql/backends/monet5/sql_orderidx.c
--- a/sql/backends/monet5/sql_orderidx.c
+++ b/sql/backends/monet5/sql_orderidx.c
@@ -30,7 +30,7 @@ sql_createorderindex(Client cntxt, MalBl
        sql_schema *s;
        sql_table *t;
        sql_column *c;
-       BAT *b;
+       BAT *b = NULL, *nb = NULL;
 
        if (msg != MAL_SUCCEED || (msg = checkSQLContext(cntxt)) != NULL)
                return msg;
@@ -38,6 +38,12 @@ sql_createorderindex(Client cntxt, MalBl
        sch = *getArgReference_str(stk, pci, 1);
        tbl = *getArgReference_str(stk, pci, 2);
        col = *getArgReference_str(stk, pci, 3);
+       if (strNil(sch))
+               throw(SQL, "sql.createorderindex", SQLSTATE(42000) "Schema name 
cannot be NULL");
+       if (strNil(tbl))
+               throw(SQL, "sql.createorderindex", SQLSTATE(42000) "Table name 
cannot be NULL");
+       if (strNil(col))
+               throw(SQL, "sql.createorderindex", SQLSTATE(42000) "Column name 
cannot be NULL");
 
        if (!(s = mvc_bind_schema(m, sch)))
                throw(SQL, "sql.createorderindex", SQLSTATE(3FOOO) "Unknown 
schema %s", sch);
@@ -50,9 +56,13 @@ sql_createorderindex(Client cntxt, MalBl
        if (!(c = mvc_bind_column(m, t, col)))
                throw(SQL, "sql.createorderindex", SQLSTATE(38000) "Unknown 
column %s.%s.%s", sch, tbl, col);
        sqlstore *store = m->session->tr->store;
-       b = store->storage_api.bind_col(m->session->tr, c, 0);
-       if (b == 0)
+       if (!(b = store->storage_api.bind_col(m->session->tr, c, RDONLY)))
                throw(SQL,"sql.createorderindex", SQLSTATE(HY005) "Column can 
not be accessed");
+       if (VIEWtparent(b) && (nb = BBP_cache(VIEWtparent(b)))) {
+               BBPunfix(b->batCacheid);
+               if (!(b = BATdescriptor(nb->batCacheid)))
+                       throw(SQL,"sql.createorderindex", SQLSTATE(HY005) 
"Column can not be accessed");
+       }
        /* create the ordered index on the column */
        msg = OIDXcreateImplementation(cntxt, newBatType(b->ttype), b, -1);
        BBPunfix(b->batCacheid);
@@ -68,7 +78,7 @@ sql_droporderindex(Client cntxt, MalBlkP
        sql_schema *s;
        sql_table *t;
        sql_column *c;
-       BAT *b;
+       BAT *b = NULL, *nb = NULL;
 
        if (msg != MAL_SUCCEED || (msg = checkSQLContext(cntxt)) != NULL)
                return msg;
@@ -76,6 +86,12 @@ sql_droporderindex(Client cntxt, MalBlkP
        sch = *getArgReference_str(stk, pci, 1);
        tbl = *getArgReference_str(stk, pci, 2);
        col = *getArgReference_str(stk, pci, 3);
+       if (strNil(sch))
+               throw(SQL, "sql.droporderindex", SQLSTATE(42000) "Schema name 
cannot be NULL");
+       if (strNil(tbl))
+               throw(SQL, "sql.droporderindex", SQLSTATE(42000) "Table name 
cannot be NULL");
+       if (strNil(col))
+               throw(SQL, "sql.droporderindex", SQLSTATE(42000) "Column name 
cannot be NULL");
 
        if (!(s = mvc_bind_schema(m, sch)))
                throw(SQL, "sql.droporderindex", SQLSTATE(3FOOO) "Unknown 
schema %s", sch);
@@ -88,10 +104,14 @@ sql_droporderindex(Client cntxt, MalBlkP
        if (!(c = mvc_bind_column(m, t, col)))
                throw(SQL, "sql.droporderindex", SQLSTATE(38000) "Unknown 
column %s.%s.%s", sch, tbl, col);
        sqlstore *store = m->session->tr->store;
-       b = store->storage_api.bind_col(m->session->tr, c, 0);
-       if (b == 0)
-               throw(SQL,"sql.droporderindex", SQLSTATE(38000) "Column can not 
be accessed");
-       msg = OIDXdropImplementation(cntxt, b);
+       if (!(b = store->storage_api.bind_col(m->session->tr, c, RDONLY)))
+               throw(SQL,"sql.droporderindex", SQLSTATE(HY005) "Column can not 
be accessed");
+       if (VIEWtparent(b) && (nb = BBP_cache(VIEWtparent(b)))) {
+               BBPunfix(b->batCacheid);
+               if (!(b = BATdescriptor(nb->batCacheid)))
+                       throw(SQL,"sql.droporderindex", SQLSTATE(HY005) "Column 
can not be accessed");
+       }
+       OIDXdestroy(b);
        BBPunfix(b->batCacheid);
        return msg;
 }
diff --git a/sql/backends/monet5/sql_strimps.c 
b/sql/backends/monet5/sql_strimps.c
--- a/sql/backends/monet5/sql_strimps.c
+++ b/sql/backends/monet5/sql_strimps.c
@@ -49,7 +49,7 @@ sql_load_bat(Client cntxt, MalBlkPtr mb,
                throw(SQL, "sql.createstrimps", SQLSTATE(38000) "Unknown column 
%s.%s.%s", sch, tbl, col);
 
        sqlstore *store = m->session->tr->store;
-       *b = store->storage_api.bind_col(m->session->tr, c, 0);
+       *b = store->storage_api.bind_col(m->session->tr, c, RDONLY);
        if (*b == 0)
                throw(SQL, "sql.createstrimps", SQLSTATE(HY005) "Cannot access 
column %s", col);
 
diff --git a/sql/test/orderidx/Tests/simpletable.test 
b/sql/test/orderidx/Tests/simpletable.test
--- a/sql/test/orderidx/Tests/simpletable.test
+++ b/sql/test/orderidx/Tests/simpletable.test
@@ -52,7 +52,7 @@ 12
 0
 0
 0
-0
+1
 
 query I rowsort
 SELECT * FROM xtmp1 WHERE i<0
diff --git a/sql/test/orderidx/Tests/smalltable.test 
b/sql/test/orderidx/Tests/smalltable.test
--- a/sql/test/orderidx/Tests/smalltable.test
+++ b/sql/test/orderidx/Tests/smalltable.test
@@ -122,7 +122,7 @@ 3
 0
 0
 0
-0
+1
 
 query I rowsort
 SELECT * FROM xtmp4 WHERE i>=0 AND i<8
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to