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

Reply via email to