Changeset: ef10cc65aeee for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ef10cc65aeee
Added Files:
sql/test/merge-partitions/Tests/mergepart16.sql
Modified Files:
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql_cat.c
sql/include/sql_relation.h
sql/rel.txt
sql/server/rel_distribute.c
sql/server/rel_dump.c
sql/server/rel_exp.c
sql/server/rel_exp.h
sql/server/rel_prop.c
sql/server/rel_prop.h
sql/server/rel_propagate.c
sql/server/rel_rel.c
sql/server/rel_rel.h
sql/server/rel_schema.c
sql/test/merge-partitions/Tests/All
sql/test/merge-partitions/Tests/mergepart04.stable.err
sql/test/merge-partitions/Tests/mergepart04.stable.out
Branch: merge-partitions
Log Message:
Yesterday I realized that the current validation scheme for new partitions
won't work with special tables such as merge and remote tables. So I am moving
the validation from MAL to SQL. This is already done for partitions by values.
(Now going into partitions by range)
I changed the relation distribute to relation exception to be more generic,
also added the PROP_DISTRIBUTE back for update statements with number of rows
affected that need a accumulator.
My commits look huge because I am still learning the SQL compiler :( As I am
getting more knowledge, I am predicting more bugs, so more changes all over the
place :/
diffs (truncated from 860 to 300 lines):
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -4900,13 +4900,13 @@ rel2bin_psm(backend *be, sql_rel *rel)
}
static stmt *
-rel2bin_distribute(backend *be, sql_rel *rel, list *refs)
+rel2bin_exception(backend *be, sql_rel *rel, list *refs)
{
stmt *l = NULL, *r = NULL;
node *n = NULL;
sql_exp *except = NULL;
- if(be->cur_append == 0) /* create affected rows accumulator */
+ if(find_prop(rel->p, PROP_DISTRIBUTE) && be->cur_append == 0) /* create
affected rows accumulator */
create_merge_partitions_accumulator(be);
if (rel->l) /* first construct the sub relation */
@@ -5065,8 +5065,8 @@ rel2bin_ddl(backend *be, sql_rel *rel, l
s = rel2bin_list(be, rel, refs);
} else if (rel->flag == DDL_PSM) {
s = rel2bin_psm(be, rel);
- } else if (rel->flag == DDL_DISTRIBUTE) {
- s = rel2bin_distribute(be, rel, refs);
+ } else if (rel->flag == DDL_EXCEPTION) {
+ s = rel2bin_exception(be, rel, refs);
sql->type = Q_UPDATE;
} else if (rel->flag <= DDL_ALTER_SEQ) {
s = rel2bin_seq(be, rel, refs);
@@ -5427,7 +5427,7 @@ rel_deps(sql_allocator *sa, sql_rel *r,
if (r->flag == DDL_OUTPUT) {
if (r->l)
return rel_deps(sa, r->l, refs, l);
- } else if (r->flag <= DDL_LIST || r->flag == DDL_DISTRIBUTE) {
+ } else if (r->flag <= DDL_LIST || r->flag == DDL_EXCEPTION) {
if (r->l)
return rel_deps(sa, r->l, refs, l);
if (r->r)
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
@@ -394,12 +394,10 @@ alter_table_add_value_partition(mvc *sql
{
sql_table *mt = NULL, *pt = NULL;
str msg = MAL_SUCCEED, escaped = NULL;
- sql_column *col = NULL, *bcol = NULL;
+ sql_column *col = NULL;
sql_part *err = NULL;
int tp1 = 0, errcode = 0, i = 0, ninserts = 0;
- BAT *b = NULL, *cbind = NULL, *diff = NULL;
list *values = list_new(sql->sa, (fdestroy) NULL);
- int accesses[3] = {RDONLY, RD_INS, RD_UPD_VAL};
if((msg = validate_alter_table_add_table(sql,
"sql.alter_table_add_value_partition", msname, mtname, psname, ptname, &mt,
&pt))) {
return msg;
@@ -422,16 +420,6 @@ alter_table_add_value_partition(mvc *sql
msg =
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(42000)
"ALTER TABLE: no values in the list");
goto finish;
}
- b = COLnew(0, tp1, ninserts, TRANSIENT);
- if (!b){
- msg =
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(HY001)
MAL_MALLOC_FAIL);
- goto finish;
- }
-
- if (with_nills && BUNappend(b, ATOMnilptr(tp1), FALSE) != GDK_SUCCEED) {
- msg =
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(HY001)
MAL_MALLOC_FAIL);
- goto finish;
- }
for( i = pci->retc+5; i < pci->argc; i++){
ptr pnext = NULL;
size_t len = 0;
@@ -467,10 +455,6 @@ alter_table_add_value_partition(mvc *sql
msg =
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(42000)
"ALTER
TABLE: list value cannot be null");
goto finish;
- } else if (BUNappend(b, pnext, FALSE) != GDK_SUCCEED) {
- GDKfree(pnext);
- msg =
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(HY001)
MAL_MALLOC_FAIL);
- goto finish;
}
nextv = SA_ZNEW(sql->session->tr->sa, sql_part_value); /*
instantiate the part value */
@@ -488,32 +472,6 @@ alter_table_add_value_partition(mvc *sql
GDKfree(pnext);
}
- bcol = mvc_bind_column(sql, pt, col->base.name); /* check if the values
in the column are proper to the partition */
- for(i = 0 ; i < 3 ; i++) {
- if(cbind) {
- BBPunfix(cbind->batCacheid);
- cbind = NULL;
- }
- if(diff) {
- BBPunfix(diff->batCacheid);
- diff = NULL;
- }
- if((cbind = store_funcs.bind_col(sql->session->tr, bcol,
accesses[i])) == NULL) {
- msg =
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(HY001)
MAL_MALLOC_FAIL);
- goto finish;
- }
- if((diff = BATdiff(cbind, b, NULL, NULL, 0, BUN_NONE)) == NULL)
{
- msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(HY001)
MAL_MALLOC_FAIL);
- goto finish;
- }
- if(BATcount(diff) > 0) {
- msg =
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(42000)
- "ALTER
TABLE: there are values in the column %s not according to the partition values
list",
-
col->base.name);
- goto finish;
- }
- }
-
errcode = sql_trans_add_value_partition(sql->session->tr, mt, pt,
col->type, values, with_nills, &err);
switch(errcode) {
case 0:
@@ -533,12 +491,6 @@ alter_table_add_value_partition(mvc *sql
finish:
if(escaped)
GDKfree(escaped);
- if(b)
- BBPunfix(b->batCacheid);
- if(cbind)
- BBPunfix(cbind->batCacheid);
- if(diff)
- BBPunfix(diff->batCacheid);
if(msg != MAL_SUCCEED)
pt->p = NULL;
return msg;
diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h
--- a/sql/include/sql_relation.h
+++ b/sql/include/sql_relation.h
@@ -91,7 +91,7 @@ typedef struct expression {
#define DDL_OUTPUT 1
#define DDL_LIST 2
#define DDL_PSM 3
-#define DDL_DISTRIBUTE 4
+#define DDL_EXCEPTION 4
#define DDL_CREATE_SEQ 5
#define DDL_ALTER_SEQ 6
diff --git a/sql/rel.txt b/sql/rel.txt
--- a/sql/rel.txt
+++ b/sql/rel.txt
@@ -26,8 +26,8 @@ DDL (card 0!, top of the tree always)
-> exps For 'OUTPUT' is list of output options, for DISTRIBUTE
has a single exception expression
For 'transactions' simple flags
for CREATE etc full sql string.
- -> l used in DDL_OUTPUT as the relation to output and
DDL_DISTRIBUTE as a DDL_LIST
- -> r used in DDL_LIST and DDL_DISTRIBUTE
+ -> l used in DDL_OUTPUT as the relation to output and
DDL_EXCEPTION as a DDL_LIST
+ -> r used in DDL_LIST and DDL_EXCEPTION
SELECT (card MULTI or same ...?)
-> exps selection expressions (ie all e_cmp)
diff --git a/sql/server/rel_distribute.c b/sql/server/rel_distribute.c
--- a/sql/server/rel_distribute.c
+++ b/sql/server/rel_distribute.c
@@ -207,7 +207,7 @@ replica(mvc *sql, sql_rel *rel, char *ur
rel->l = replica(sql, rel->l, uri);
break;
case op_ddl:
- if ((rel->flag == DDL_PSM || rel->flag == DDL_DISTRIBUTE) &&
rel->exps)
+ if ((rel->flag == DDL_PSM || rel->flag == DDL_EXCEPTION) &&
rel->exps)
rel->exps = exps_replica(sql, rel->exps, uri);
rel->l = replica(sql, rel->l, uri);
if (rel->r)
@@ -343,7 +343,7 @@ distribute(mvc *sql, sql_rel *rel)
}
break;
case op_ddl:
- if ((rel->flag == DDL_PSM || rel->flag == DDL_DISTRIBUTE) &&
rel->exps)
+ if ((rel->flag == DDL_PSM || rel->flag == DDL_EXCEPTION) &&
rel->exps)
rel->exps = exps_distribute(sql, rel->exps);
rel->l = distribute(sql, rel->l);
if (rel->r)
@@ -430,7 +430,7 @@ rel_remote_func(mvc *sql, sql_rel *rel)
rel->l = rel_remote_func(sql, rel->l);
break;
case op_ddl:
- if ((rel->flag == DDL_PSM || rel->flag == DDL_DISTRIBUTE) &&
rel->exps)
+ if ((rel->flag == DDL_PSM || rel->flag == DDL_EXCEPTION) &&
rel->exps)
rel->exps = exps_remote_func(sql, rel->exps);
rel->l = rel_remote_func(sql, rel->l);
if (rel->r)
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -382,7 +382,7 @@ rel_print_(mvc *sql, stream *fout, sql_
rel_print_(sql, fout, rel->l, depth+1, refs, decorate);
if (rel->r)
rel_print_(sql, fout, rel->r, depth+1, refs, decorate);
- if (rel->exps && (rel->flag == DDL_PSM || rel->flag ==
DDL_DISTRIBUTE || rel->flag == DDL_LIST))
+ if (rel->exps && (rel->flag == DDL_PSM || rel->flag ==
DDL_EXCEPTION || rel->flag == DDL_LIST))
exps_print(sql, fout, rel->exps, depth, refs, 1, 0);
break;
case op_join:
@@ -540,7 +540,7 @@ rel_print_refs(mvc *sql, stream* fout, s
case op_table:
break;
case op_ddl:
- if(rel->flag == DDL_LIST ||rel->flag == DDL_DISTRIBUTE) {
+ if(rel->flag == DDL_LIST ||rel->flag == DDL_EXCEPTION) {
if(rel->l) {
rel_print_refs(sql, fout, rel->l, depth, refs,
decorate);
if(rel_is_ref(rel->l) && !find_ref(refs,
rel->l)) {
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -15,6 +15,8 @@
#ifdef HAVE_HGE
#include "mal.h" /* for have_hge */
#endif
+#include "mtime.h"
+#include "blob.h"
comp_type
swap_compare( comp_type t )
@@ -2030,3 +2032,94 @@ exp_sum_scales(sql_subfunc *f, sql_exp *
*res = t;
}
}
+
+sql_exp *
+create_table_part_atom_exp(mvc *sql, sql_subtype tpe, ptr value)
+{
+ str buf = NULL;
+ size_t len = 0;
+ sql_exp *res = NULL;
+
+ switch (tpe.type->eclass) {
+ case EC_BIT: {
+ bit bval = *((bit*) value);
+ return exp_atom_bool(sql->sa, bval ? 1 : 0);
+ }
+ case EC_POS:
+ case EC_NUM:
+ case EC_DEC:
+ case EC_SEC:
+ case EC_MONTH:
+ switch (tpe.type->localtype) {
+#ifdef HAVE_HGE
+ case TYPE_hge: {
+ hge hval = *((hge*) value);
+ return exp_atom_hge(sql->sa, hval);
+ }
+#endif
+ case TYPE_lng: {
+ lng lval = *((lng*) value);
+ return exp_atom_lng(sql->sa, lval);
+ }
+ case TYPE_int: {
+ int ival = *((int*) value);
+ return exp_atom_int(sql->sa, ival);
+ }
+ case TYPE_sht: {
+ sht sval = *((sht*) value);
+ return exp_atom_sht(sql->sa, sval);
+ }
+ case TYPE_bte: {
+ bte bbval = *((bte *) value);
+ return exp_atom_bte(sql->sa, bbval);
+ }
+ default:
+ return NULL;
+ }
+ case EC_FLT:
+ switch (tpe.type->localtype) {
+ case TYPE_flt: {
+ flt fval = *((flt*) value);
+ return exp_atom_flt(sql->sa, fval);
+ }
+ case TYPE_dbl: {
+ dbl dval = *((dbl*) value);
+ return exp_atom_dbl(sql->sa, dval);
+ }
+ default:
+ return NULL;
+ }
+ case EC_DATE: {
+ if(date_tostr(&buf, &len, (const date *)value) < 0)
+ return NULL;
+ res = exp_atom(sql->sa, atom_general(sql->sa, &tpe,
buf));
+ break;
+ }
+ case EC_TIME: {
+ if(daytime_tostr(&buf, &len, (const daytime *)value) <
0)
+ return NULL;
+ res = exp_atom(sql->sa, atom_general(sql->sa, &tpe,
buf));
+ break;
+ }
+ case EC_TIMESTAMP: {
+ if(timestamp_tostr(&buf, &len, (const timestamp
*)value) < 0)
+ return NULL;
+ res = exp_atom(sql->sa, atom_general(sql->sa, &tpe,
buf));
+ break;
+ }
+ case EC_BLOB: {
+ if(SQLBLOBtostr(&buf, &len, (const blob *)value) < 0)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list