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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list