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