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