Changeset: f54b972373b5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f54b972373b5
Modified Files:
sql/backends/monet5/sql_cat.c
sql/server/rel_propagate.c
sql/server/sql_mvc.c
sql/server/sql_partition.c
sql/server/sql_partition.h
sql/storage/sql_storage.h
sql/storage/store.c
sql/test/merge-partitions/Tests/mergepart20.sql
Branch: merge-partitions
Log Message:
Delay the initialization of sql_parts to mvc_init
But there are still many bugs :(
diffs (truncated from 756 to 300 lines):
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
@@ -193,7 +193,6 @@ alter_table_add_range_partition(mvc *sql
ptr pmin = NULL, pmax = NULL;
size_t smin = 0, smax = 0, serr_min = 0, serr_max = 0;
ssize_t (*atomtostr)(str *, size_t *, const void *);
- int free_pmin = 1, free_pmax = 1;
sql_subtype tpe;
if((msg = validate_alter_table_add_table(sql,
"sql.alter_table_add_range_partition", msname, mtname, psname, ptname, &mt,
&pt, update))) {
@@ -265,18 +264,7 @@ alter_table_add_range_partition(mvc *sql
goto finish;
}
- if(!pmin) {
- pmin = (ptr) ATOMnilptr(tp1);
- smin = ATOMsize(tp1);
- free_pmin = 0;
- }
- if(!pmax) {
- pmax = (ptr) ATOMnilptr(tp1);
- smax = ATOMsize(tp1);
- free_pmax = 0;
- }
-
- errcode = sql_trans_add_range_partition(sql->session->tr, mt, pt, tpe,
pmin, smin, pmax, smax, with_nills, update, &err);
+ errcode = sql_trans_add_range_partition(sql->session->tr, mt, pt, tpe,
pmin, pmax, with_nills, update, &err);
switch(errcode) {
case 0:
break;
@@ -322,9 +310,9 @@ finish:
GDKfree(escaped_min);
if(escaped_max)
GDKfree(escaped_max);
- if(pmin && free_pmin)
+ if(pmin)
GDKfree(pmin);
- if(pmax && free_pmax)
+ if(pmax)
GDKfree(pmax);
if(msg != MAL_SUCCEED)
pt->p = NULL;
diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c
--- a/sql/server/rel_propagate.c
+++ b/sql/server/rel_propagate.c
@@ -383,8 +383,6 @@ rel_generate_subdeletes(mvc *sql, sql_re
sql_rel *s1, *dup = NULL;
if(rel->r) {
- /* if (frame_find_var(sql, sub->base.name)) TODO ask
Niels about this
- return sql_error(sql, 01, SQLSTATE(42000) "The
name '%s' is already declared", sub->base.name);*/
dup = rel_copy(sql->sa, rel->r, 1);
dup = rel_change_base_table(sql, dup, t, sub);
}
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -22,6 +22,8 @@
#include "gdk_logger.h"
#include "wlc.h"
+extern str initialize_sql_parts(mvc* sql, sql_table *mt);
+
static int mvc_debug = 0;
static void
@@ -45,6 +47,10 @@ int
mvc_init(int debug, store_type store, int ro, int su, backend_stack stk)
{
int first = 0;
+ sql_schema *s;
+ sql_table *t;
+ sqlid tid = 0, ntid, cid = 0, ncid, pid, rrid, lid, dpid, drid, dlid;
+ mvc *m;
logger_settings log_settings;
/* Set the default WAL directory. "sql_logs" by default */
@@ -82,34 +88,33 @@ mvc_init(int debug, store_type store, in
fprintf(stderr, "!mvc_init: unable to create system tables\n");
return -1;
}
- if (first || catalog_version) {
- sql_schema *s;
- sql_table *t;
- sqlid tid = 0, ntid, cid = 0, ncid, pid, rrid, lid, dpid, drid,
dlid;
- mvc *m = mvc_create(0, stk, 0, NULL, NULL);
- if (!m) {
- fprintf(stderr, "!mvc_init: malloc failure\n");
- return -1;
- }
+
+ m = mvc_create(0, stk, 0, NULL, NULL);
+ if (!m) {
+ fprintf(stderr, "!mvc_init: malloc failure\n");
+ return -1;
+ }
+
+ m->sa = sa_create();
+ if (!m->sa) {
+ mvc_destroy(m);
+ fprintf(stderr, "!mvc_init: malloc failure\n");
+ return -1;
+ }
- m->sa = sa_create();
- if (!m->sa) {
- mvc_destroy(m);
- fprintf(stderr, "!mvc_init: malloc failure\n");
- return -1;
- }
+ /* disable caching */
+ m->caching = 0;
+ /* disable history */
+ m->history = 0;
+ /* disable size header */
+ m->sizeheader = 0;
+ if(mvc_trans(m) < 0) {
+ mvc_destroy(m);
+ fprintf(stderr, "!mvc_init: failed to start transaction\n");
+ return -1;
+ }
- /* disable caching */
- m->caching = 0;
- /* disable history */
- m->history = 0;
- /* disable size header */
- m->sizeheader = 0;
- if(mvc_trans(m) < 0) {
- mvc_destroy(m);
- fprintf(stderr, "!mvc_init: failed to start
transaction\n");
- return -1;
- }
+ if (first || catalog_version) {
s = m->session->schema = mvc_bind_schema(m, "sys");
assert(m->session->schema != NULL);
@@ -261,17 +266,36 @@ mvc_init(int debug, store_type store, in
sql_create_comments(m, s);
sql_create_privileges(m, s);
}
-
- s = m->session->schema = mvc_bind_schema(m, "tmp");
- assert(m->session->schema != NULL);
+ }
- if (mvc_commit(m, 0, NULL) < 0) {
- fprintf(stderr, "!mvc_init: unable to commit system
tables\n");
- return -1;
+ //as the sql_parser is not yet initialized in the storage, we determine
the sql type of the sql_parts here
+ for (node *n = m->session->tr->schemas.set->h; n; n = n->next) {
+ sql_schema *ss = (sql_schema*) n->data;
+ if(ss->tables.set) {
+ for (node *nn = ss->tables.set->h; nn; nn = nn->next) {
+ sql_table *tt = (sql_table*) nn->data;
+ if(isPartitionedByColumnTable(tt) ||
isPartitionedByExpressionTable(tt)) {
+ char *err;
+ if((err = initialize_sql_parts(m, tt))
!= NULL) {
+ fprintf(stderr, "!mvc_init:
unable to start partitioned table: %s.%s: %s\n",
+ ss->base.name,
tt->base.name, err);
+ return -1;
+ }
+ }
+ }
}
+ }
- mvc_destroy(m);
+ s = m->session->schema = mvc_bind_schema(m, "tmp");
+ assert(m->session->schema != NULL);
+
+ if (mvc_commit(m, 0, NULL) < 0) {
+ fprintf(stderr, "!mvc_init: unable to commit system tables\n");
+ return -1;
}
+
+ mvc_destroy(m);
+
return first;
}
diff --git a/sql/server/sql_partition.c b/sql/server/sql_partition.c
--- a/sql/server/sql_partition.c
+++ b/sql/server/sql_partition.c
@@ -190,11 +190,12 @@ str
find_partition_type(mvc* sql, sql_subtype *tpe, sql_table *mt)
{
str res = NULL;
+ sql_subtype *empty = sql_bind_localtype("void");
if(isPartitionedByColumnTable(mt)) {
*tpe = mt->part.pcol->type;
} else if(isPartitionedByExpressionTable(mt)) {
- if(!mt->part.pexp->type.type && (res =
bootstrap_partition_expression(sql, mt)) != NULL)
+ if(!strcmp(mt->part.pexp->type.type->base.name,
empty->type->base.name) && (res = bootstrap_partition_expression(sql, mt)) !=
NULL)
return res;
*tpe = mt->part.pexp->type;
} else {
@@ -202,3 +203,73 @@ find_partition_type(mvc* sql, sql_subtyp
}
return res;
}
+
+str
+initialize_sql_parts(mvc* sql, sql_table *mt)
+{
+ str res = NULL;
+ sql_subtype found;
+ int localtype;
+
+ if((res = find_partition_type(sql, &found, mt)) != NULL)
+ return res;
+ localtype = found.type->localtype;
+ for (node *n = mt->members.set->h; n; n = n->next) {
+ sql_part* next = (sql_part*) n->data;
+ next->tpe = found;
+ if(isListPartitionTable(mt)) {
+ for (node *m = next->part.values->h; m; m = m->next) {
+ sql_part_value* v = (sql_part_value*) m->data;
+ ValRecord vvalue;
+ ptr ok;
+
+ v->tpe = found;
+ memset(&vvalue, 0, sizeof(ValRecord));
+ ok = VALinit(&vvalue, TYPE_str, v->value);
+ if(ok)
+ ok = VALconvert(localtype, &vvalue);
+ if(ok) {
+ v->value = sa_alloc(sql->sa,
vvalue.len);
+ memcpy(v->value, VALget(&vvalue),
vvalue.len);
+ v->length = vvalue.len;
+ }
+ VALclear(&vvalue);
+ if(!ok) {
+ res = createException(SQL,
"sql.partition",
+
SQLSTATE(42000) "Internal error while bootstrapping partitioned tables");
+ goto finish;
+ }
+ }
+ } else if(isRangePartitionTable(mt)) {
+ ValRecord vmin, vmax;
+ ptr ok;
+
+ memset(&vmin, 0, sizeof(ValRecord));
+ memset(&vmax, 0, sizeof(ValRecord));
+ ok = VALinit(&vmin, TYPE_str,
next->part.range.minvalue);
+ if(ok)
+ ok = VALconvert(localtype, &vmin);
+ if(ok)
+ ok = VALinit(&vmax, TYPE_str,
next->part.range.maxvalue);
+ if(ok)
+ ok = VALconvert(localtype, &vmax);
+ if(ok) {
+ next->part.range.minvalue = sa_alloc(sql->sa,
vmin.len);
+ memcpy(next->part.range.minvalue,
VALget(&vmin), vmin.len);
+ next->part.range.minlength = vmin.len;
+ next->part.range.maxvalue = sa_alloc(sql->sa,
vmax.len);
+ memcpy(next->part.range.maxvalue,
VALget(&vmax), vmax.len);
+ next->part.range.maxlength = vmax.len;
+ }
+ VALclear(&vmin);
+ VALclear(&vmax);
+ if(!ok) {
+ res = createException(SQL, "sql.partition",
+
SQLSTATE(42000) "Internal error while bootstrapping partitioned tables");
+ goto finish;
+ }
+ }
+ }
+finish:
+ return res;
+}
diff --git a/sql/server/sql_partition.h b/sql/server/sql_partition.h
--- a/sql/server/sql_partition.h
+++ b/sql/server/sql_partition.h
@@ -13,5 +13,6 @@
#include "sql_catalog.h"
extern str find_partition_type(mvc* sql, sql_subtype *tpe, sql_table *mt);
+extern str initialize_sql_parts(mvc* sql, sql_table *mt);
#endif //_SQL_PARTITION_H
diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h
--- a/sql/storage/sql_storage.h
+++ b/sql/storage/sql_storage.h
@@ -360,7 +360,7 @@ extern int sql_trans_drop_schema(sql_tra
extern sql_table *sql_trans_create_table(sql_trans *tr, sql_schema *s, const
char *name, const char *sql, int tt, bit system, int persistence, int
commit_action, int sz);
extern int sql_trans_set_partition_table(sql_trans *tr, sql_table *t);
extern sql_table *sql_trans_add_table(sql_trans *tr, sql_table *mt, sql_table
*pt);
-extern int sql_trans_add_range_partition(sql_trans *tr, sql_table *mt,
sql_table *pt, sql_subtype tpe, ptr min, size_t smin, ptr max, size_t smax, int
with_nills, int update, sql_part** err);
+extern int sql_trans_add_range_partition(sql_trans *tr, sql_table *mt,
sql_table *pt, sql_subtype tpe, ptr min, ptr max, int with_nills, int update,
sql_part** err);
extern int sql_trans_add_value_partition(sql_trans *tr, sql_table *mt,
sql_table *pt, sql_subtype tpe, list* vals, int with_nills, int update,
sql_part **err);
extern sql_table *sql_trans_del_table(sql_trans *tr, sql_table *mt, sql_table
*pt, int drop_action);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -554,63 +554,63 @@ load_column(sql_trans *tr, sql_table *t,
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list