Changeset: f494b1d3d1a4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f494b1d3d1a4
Added Files:
        sql/test/merge-partitions/Tests/mergepart12.sql
        sql/test/merge-partitions/Tests/mergepart12.stable.err
        sql/test/merge-partitions/Tests/mergepart12.stable.out
        sql/test/merge-partitions/Tests/mergepart13.sql
        sql/test/merge-partitions/Tests/mergepart13.stable.err
        sql/test/merge-partitions/Tests/mergepart13.stable.out
Modified Files:
        monetdb5/modules/atoms/mtime.c
        monetdb5/modules/atoms/mtime.h
        sql/backends/monet5/sql_cat.c
        sql/include/sql_catalog.h
        sql/server/rel_propagate.c
        sql/server/rel_schema.c
        sql/server/sql_atom.c
        sql/storage/sql_catalog.c
        sql/storage/sql_storage.h
        sql/storage/store.c
        sql/test/merge-partitions/Tests/All
        sql/test/merge-partitions/Tests/mergepart05.sql
        sql/test/merge-partitions/Tests/mergepart05.stable.err
Branch: merge-partitions
Log Message:

Support for dates, times, timestamps in partition predicates.

Also blobs.


diffs (truncated from 1158 to 300 lines):

diff --git a/monetdb5/modules/atoms/mtime.c b/monetdb5/modules/atoms/mtime.c
--- a/monetdb5/modules/atoms/mtime.c
+++ b/monetdb5/modules/atoms/mtime.c
@@ -246,7 +246,6 @@ static int CUMLEAPDAYS[13] = {
 
 static date DATE_MAX, DATE_MIN;                /* often used dates; computed 
once */
 
-#define YEAR_MAX               5867411
 #define YEAR_MIN               (-YEAR_MAX)
 #define MONTHDAYS(m,y) ((m) != 2 ? LEAPDAYS[m] : leapyear(y) ? 29 : 28)
 #define YEARDAYS(y)            (leapyear(y) ? 366 : 365)
diff --git a/monetdb5/modules/atoms/mtime.h b/monetdb5/modules/atoms/mtime.h
--- a/monetdb5/modules/atoms/mtime.h
+++ b/monetdb5/modules/atoms/mtime.h
@@ -35,6 +35,8 @@
 #include <sys/time.h>          /* gettimeofday */
 #endif
 
+#define YEAR_MAX               5867411
+
 typedef int date;
 #define date_nil               ((date) int_nil)
 #define date_isnil(X)  ((X) == date_nil)
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
@@ -296,7 +296,7 @@ alter_table_add_range_partition(mvc *sql
                }
        }
 
-       errcode = sql_trans_add_range_partition(sql->session->tr, mt, pt, tp1, 
pmin, smin, pmax, smax, with_nills, &err);
+       errcode = sql_trans_add_range_partition(sql->session->tr, mt, pt, 
col->type, pmin, smin, pmax, smax, with_nills, &err);
        switch(errcode) {
                case -1:
                        msg = 
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
@@ -438,7 +438,7 @@ alter_table_add_value_partition(mvc *sql
                }
 
                nextv = SA_ZNEW(sql->session->tr->sa, sql_part_value); /* 
instantiate the part value */
-               nextv->tpe = tp1;
+               nextv->tpe = col->type;
                nextv->value = sa_alloc(sql->session->tr->sa, len);
                memcpy(nextv->value, pnext, len);
                nextv->length = len;
@@ -478,7 +478,7 @@ alter_table_add_value_partition(mvc *sql
                }
        }
 
-       errcode = sql_trans_add_value_partition(sql->session->tr, mt, pt, tp1, 
values, with_nills, &err);
+       errcode = sql_trans_add_value_partition(sql->session->tr, mt, pt, 
col->type, values, with_nills, &err);
        switch(errcode) {
                case 0:
                        break;
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
@@ -513,7 +513,7 @@ typedef enum table_types {
 #define TABLE_APPENDONLY       2
 
 typedef struct sql_part_value {
-       sht tpe;
+       sql_subtype tpe;
        ptr value;
        size_t length;
 } sql_part_value;
@@ -521,7 +521,7 @@ typedef struct sql_part_value {
 typedef struct sql_part {
        sql_base base;
        struct sql_table *t; /* cached value of the merge table */
-       sht tpe;             /* the column type */
+       sql_subtype tpe;     /* the column type */
        sht part_type;       /* by range, list/values or none */
        int with_nills;
        union {
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
@@ -17,6 +17,7 @@
 #include "rel_schema.h"
 #include "sql_mvc.h"
 #include "mtime.h"
+#include "blob.h"
 
 static sql_rel* rel_change_base_table(mvc* sql, sql_rel* rel, sql_table* oldt, 
sql_table* newt);
 
@@ -152,48 +153,94 @@ rel_truncate_duplicate(sql_allocator *sa
 }
 
 static sql_exp *
-create_table_part_atom_exp(mvc *sql, sht tpe, ptr value)
+create_table_part_atom_exp(mvc *sql, sql_subtype tpe, ptr value)
 {
-       switch (tpe) {
-               case TYPE_bit: {
-                       bit bval = *((bit*) value);
-                       return exp_atom_bool(sql->sa, bval ? 1 : 0);
-               }
-               case TYPE_bte: {
-                       bte bbval = *((bte *) value);
-                       return exp_atom_bte(sql->sa, bbval);
-               }
-               case TYPE_sht: {
-                       sht sval = *((sht*) value);
-                       return exp_atom_sht(sql->sa, sval);
-               }
-               case TYPE_int: {
-                       int ival = *((int*) value);
-                       return exp_atom_int(sql->sa, ival);
+       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 TYPE_lng: {
-                       lng lval = *((lng*) value);
-                       return exp_atom_lng(sql->sa, lval);
-               }
-               case TYPE_flt: {
-                       flt fval = *((flt*) value);
-                       return exp_atom_flt(sql->sa, fval);
+               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 TYPE_dbl: {
-                       dbl dval = *((dbl*) value);
-                       return exp_atom_dbl(sql->sa, dval);
+               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 TYPE_str:
+               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)
+                               return NULL;
+                       res = exp_atom(sql->sa, atom_general(sql->sa, &tpe, 
buf));
+                       break;
+               }
+               case EC_CHAR:
+               case EC_STRING:
                        return exp_atom_clob(sql->sa, sa_strdup(sql->sa, 
value));
-#ifdef HAVE_HGE
-               case TYPE_hge: {
-                       hge hval = *((hge*) value);
-                       return exp_atom_hge(sql->sa, hval);
-               }
-#endif
-               default:
+               default: /* EC_CHAR, EC_STRING, EC_BLOB, ... */
                        assert(0);
        }
+       if(buf)
+               GDKfree(buf);
+       return res;
 }
 
 static sql_rel *
diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -1482,9 +1482,7 @@ sql_alter_table(mvc *sql, dlist *qname, 
                                        }
                                        if(max->token == SQL_MAXVALUE) {
                                                amax = 
atom_absolute_max(sql->sa, &(col->type));
-                                       } else {
-                                               amax = ((AtomNode *) max)->a;
-                                               if(!amin) {
+                                               if(!amax) {
                                                        sql_rel *res = NULL;
                                                        char *err = 
sql_subtype_string(&(col->type));
                                                        if(!err)
@@ -1493,6 +1491,8 @@ sql_alter_table(mvc *sql, dlist *qname, 
                                                        GDKfree(err);
                                                        return res;
                                                }
+                                       } else {
+                                               amax = ((AtomNode *) max)->a;
                                        }
                                        return 
rel_alter_table_add_partition_range(sql->sa, sname, tname, sname, ntname, amin, 
amax, nills);
                                } else if(extra->token == SQL_PARTITION_LIST) {
diff --git a/sql/server/sql_atom.c b/sql/server/sql_atom.c
--- a/sql/server/sql_atom.c
+++ b/sql/server/sql_atom.c
@@ -10,6 +10,7 @@
 #include "sql_atom.h"
 #include "sql_string.h"
 #include "sql_decimal.h"
+#include "mtime.h"
 
 static int atom_debug = 0;
 
@@ -1351,7 +1352,8 @@ atom*
 atom_absolute_min(sql_allocator *sa, sql_subtype* tpe)
 {
        void *ret = NULL;
-       atom *res = atom_create(sa);
+       atom *res = NULL;
+
 #ifdef HAVE_HGE
        hge hval = GDK_hge_min;
 #endif
@@ -1362,9 +1364,9 @@ atom_absolute_min(sql_allocator *sa, sql
        bit bval = GDK_bit_min;
        flt fval = GDK_flt_min;
        dbl dval = GDK_dbl_min;
-
-       if(!res)
-               return NULL;
+       date dt = 0;
+       daytime dyt = 0;
+       timestamp tmp;
 
        switch (tpe->type->eclass) {
                case EC_BIT:
@@ -1421,20 +1423,38 @@ atom_absolute_min(sql_allocator *sa, sql
                                        ret = &dval;
                                        break;
                                }
+                               default:
+                                       break;
                        }
                        break;
-               case EC_DATE:
-               case EC_TIME:
-               case EC_TIMESTAMP:
-               default: /* EC_CHAR, EC_STRING, EC_BLOB, ... */
-                       return NULL;
+               case EC_DATE: {
+                       ret = &dt;
+                       break;
+               }
+               case EC_TIME: {
+                       ret = &dyt;
+                       break;
+               }
+               case EC_TIMESTAMP: {
+                       memset(&tmp, 0, 1);
+                       tmp.msecs = 0;
+                       tmp.days = 0;
+                       ret = &tmp;
+                       break;
+               }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to