Changeset: 88586b9bb82c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=88586b9bb82c
Modified Files:
sql/backends/monet5/sql.c
sql/backends/monet5/sql_scenario.c
sql/include/sql_catalog.h
sql/server/sql_parser.y
sql/server/sql_scan.c
sql/storage/bat/bat_storage.c
Branch: leftmart
Log Message:
added support for create ordered index on sql level.
The bat_storage.c - create_idx will now call the OIDXcreateImplemantation.
(unfortunately something is still wrong there)
diffs (182 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
@@ -518,6 +518,13 @@ alter_table(mvc *sql, char *sname, sql_t
return sql_message("40000!CONSTRAINT
PRIMARY KEY: a table can have only one PRIMARY KEY\n");
}
}
+ if (t->access != TABLE_READONLY) {
+ for (n = t->idxs.nelm; n; n = n->next) {
+ sql_idx *i = n->data;
+ if (i && i->type == ordered_idx)
+ return sql_message("40000!ORDERED
INDEX: only READONLY tables can have an ORDERED INDEX\n");
+ }
+ }
}
/* check for changes */
diff --git a/sql/backends/monet5/sql_scenario.c
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -435,7 +435,7 @@ SQLinitClient(Client c)
MCpushClientInput(c, fdin, 0, "");
}
if (c->sqlcontext == 0) {
- m = mvc_create(c->idx, 0, SQLdebug, c->fdin, c->fdout);
+ m = mvc_create(c->idx, c->idx /*0*/, SQLdebug, c->fdin,
c->fdout);
global_variables(m, "monetdb", "sys");
if (isAdministrator(c) || strcmp(c->scenario, "msql") == 0)
/* console should return everything */
m->reply_size = -1;
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
@@ -352,11 +352,13 @@ typedef enum idx_type {
join_idx,
oph_idx, /* order preserving hash */
no_idx, /* no idx, ie no storage */
+ ordered_idx,
new_idx_types
} idx_type;
#define hash_index(t) (t == hash_idx || t == oph_idx )
-#define idx_has_column(t) (hash_index(t) || t == join_idx)
+#define idx_has_column(t) (hash_index(t) || t == join_idx || t ==
ordered_idx)
+#define oid_index(t) (t == join_idx || t == ordered_idx)
typedef struct sql_idx {
sql_base base;
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
@@ -486,7 +486,7 @@ int yydebug=1;
%token START TRANSACTION READ WRITE ONLY ISOLATION LEVEL
%token UNCOMMITTED COMMITTED sqlREPEATABLE SERIALIZABLE DIAGNOSTICS sqlSIZE
STORAGE
-%token <sval> ASYMMETRIC SYMMETRIC ORDER BY
+%token <sval> ASYMMETRIC SYMMETRIC ORDER ORDERED BY
%token <operation> EXISTS ESCAPE HAVING sqlGROUP sqlNULL
%token <operation> FROM FOR MATCH
@@ -1199,6 +1199,7 @@ index_def:
opt_index_type:
UNIQUE { $$ = hash_idx; }
+ | ORDERED { $$ = ordered_idx; }
| /* empty */ { $$ = hash_idx; }
;
diff --git a/sql/server/sql_scan.c b/sql/server/sql_scan.c
--- a/sql/server/sql_scan.c
+++ b/sql/server/sql_scan.c
@@ -157,6 +157,7 @@ scanner_init_keywords(void)
keywords_insert("OPTION", OPTION);
keywords_insert("OR", OR);
keywords_insert("ORDER", ORDER);
+ keywords_insert("ORDERED", ORDERED);
keywords_insert("OUTER", OUTER);
keywords_insert("OVER", OVER);
keywords_insert("PARTITION", PARTITION);
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -12,6 +12,7 @@
#include <sql_string.h>
#include <algebra.h>
#include <gdk_atoms.h>
+#include <orderidx.h>
#define SNAPSHOT_MINSIZE ((BUN) 1024*128)
@@ -123,7 +124,7 @@ bind_uidx(sql_trans *tr, sql_idx * i, in
i->t->data = timestamp_dbat(ot->data, tr->stime);
}
i->base.rtime = i->t->base.rtime = i->t->s->base.rtime = tr->rtime =
tr->stime;
- u = delta_bind_ubat(i->data, access,
(i->type==join_idx)?TYPE_oid:TYPE_wrd);
+ u = delta_bind_ubat(i->data, access,
(oid_index(i->type))?TYPE_oid:TYPE_wrd);
return u;
}
@@ -454,7 +455,7 @@ update_idx(sql_trans *tr, sql_idx * i, v
return;
if (!i->data || !i->base.allocated) {
- int type = (i->type==join_idx)?TYPE_oid:TYPE_wrd;
+ int type = (oid_index(i->type))?TYPE_oid:TYPE_wrd;
sql_idx *oi = tr_find_idx(tr->parent, i);
sql_delta *bat = i->data = ZNEW(sql_delta), *obat =
timestamp_delta(oi->data, tr->stime);
(void)dup_bat(tr, i->t, obat, bat, type, isNew(i), i->base.flag
== TR_NEW);
@@ -562,7 +563,7 @@ dup_idx(sql_trans *tr, sql_idx *i, sql_i
int ok = LOG_OK;
if (i->data) {
- int type = (ni->type==join_idx)?TYPE_oid:TYPE_wrd;
+ int type = (oid_index(ni->type))?TYPE_oid:TYPE_wrd;
sql_delta *bat = ni->data = ZNEW(sql_delta), *obat = i->data;
ok = dup_bat(tr, ni->t, obat, bat, type, isNew(i),
ni->base.flag == TR_NEW);
ni->base.allocated = 1;
@@ -648,7 +649,7 @@ append_idx(sql_trans *tr, sql_idx * i, v
return;
if (!i->data || !i->base.allocated) {
- int type = (i->type==join_idx)?TYPE_oid:TYPE_wrd;
+ int type = (oid_index(i->type))?TYPE_oid:TYPE_wrd;
sql_idx *oi = tr_find_idx(tr->parent, i);
sql_delta *bat = i->data = ZNEW(sql_delta), *obat =
timestamp_delta(oi->data, tr->stime);
(void)dup_bat(tr, i->t, obat, bat, type, isNew(i), i->base.flag
== TR_NEW);
@@ -1149,7 +1150,7 @@ create_idx(sql_trans *tr, sql_idx *ni)
sql_delta *bat = ni->data;
int type = TYPE_wrd;
- if (ni->type == join_idx)
+ if (oid_index(ni->type))
type = TYPE_oid;
if (!bat) {
@@ -1168,6 +1169,8 @@ create_idx(sql_trans *tr, sql_idx *ni)
sql_column *c = ni->t->columns.set->h->data;
sql_delta *d;
+ if (ni->type == ordered_idx)
+ c = ((sql_kc*)ni->columns->h->data)->c;
if (!c->data) {
sql_column *oc = tr_find_column(tr->parent, c);
c->data = timestamp_delta(oc->data, tr->stime);
@@ -1176,7 +1179,19 @@ create_idx(sql_trans *tr, sql_idx *ni)
/* Here we also handle indices created through alter stmts */
/* These need to be created aligned to the existing data */
- bat->bid = copyBat(d->bid, type, 0);
+ if (ni->type == ordered_idx) {
+ Client cntxt = mal_clients+tr->stk;
+ BAT *b = temp_descriptor(d->bid);
+ str msg;
+
+ /* what to do with the result msg */
+ msg = OIDXcreateImplementation(cntxt,
newBatType(TYPE_void,type), b, -1);
+ assert(msg == NULL);
+ bat->bid = b->torderidx.o;
+ (void)msg;
+ bat_destroy(b);
+ } else
+ bat->bid = copyBat(d->bid, type, 0);
bat->ibid = copyBat(d->ibid, type, d->ibase);
bat->ibase = d->ibase;
bat->cnt = d->cnt;
@@ -1511,7 +1526,7 @@ static BUN
clear_idx(sql_trans *tr, sql_idx *i)
{
if (!i->data || !i->base.allocated) {
- int type = (i->type==join_idx)?TYPE_oid:TYPE_wrd;
+ int type = (oid_index(i->type))?TYPE_oid:TYPE_wrd;
sql_idx *oi = tr_find_idx(tr->parent, i);
sql_delta *bat = i->data = ZNEW(sql_delta), *obat =
timestamp_delta(oi->data, tr->stime);
(void)dup_bat(tr, i->t, obat, bat, type, isNew(i), i->base.flag
== TR_NEW);
@@ -1560,7 +1575,7 @@ empty_col(sql_column *c)
static void
empty_idx(sql_idx *i)
{
- int type = (i->type==join_idx)?TYPE_oid:TYPE_wrd;
+ int type = (oid_index(i->type))?TYPE_oid:TYPE_wrd;
sql_delta *bat = i->data;
assert(i->data && i->base.allocated && bat->bid == 0);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list