Changeset: 2b79861f14e5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2b79861f14e5
Added Files:
sql/test/merge-partitions/Tests/mergepart06.sql
Modified Files:
sql/backends/monet5/sql_cat.c
sql/backends/monet5/sql_statement.c
sql/include/sql_catalog.h
sql/server/rel_dump.c
sql/server/rel_schema.c
sql/server/sql_atom.c
sql/server/sql_atom.h
sql/storage/store.c
sql/test/merge-partitions/Tests/All
Branch: merge-partitions
Log Message:
Quote strings in the MAL layer instead
diffs (truncated from 388 to 300 lines):
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
@@ -143,11 +143,44 @@ alter_table_add_table(mvc *sql, char *ms
}
static char *
+add_quotes(char *atom_str) /* always produce a string between quotes, placing
them if they do not exist */
+{
+ size_t len;
+ int plus = 0, off = 0;
+ char *res;
+
+ if(!atom_str)
+ return atom_str;
+
+ len = strlen(atom_str);
+
+ if(atom_str[0] != '"')
+ plus++;
+ if(len == 0 || atom_str[len - 1] != '"')
+ plus++;
+ res = GDKmalloc(len + plus + 1);
+ if(res) {
+ if(atom_str[0] != '"') {
+ res[off] = '"';
+ off++;
+ }
+ strcpy(res + off, atom_str);
+ off += len;
+ if(len == 0 || atom_str[len - 1] != '"') {
+ res[off] = '"';
+ off++;
+ }
+ res[off] = '\0';
+ }
+ return res;
+}
+
+static char *
alter_table_add_range_partition(mvc *sql, char *msname, char *mtname, char
*psname, char *ptname, char *min, char *max)
{
sql_table *mt = NULL, *pt = NULL;
sql_part *err = NULL;
- str msg = MAL_SUCCEED, err_min = NULL, err_max = NULL;
+ str msg = MAL_SUCCEED, err_min = NULL, err_max = NULL, escaped_min =
NULL, escaped_max = NULL;
sql_column *col = NULL, *bcol = NULL;
BAT *diff1 = NULL, *diff2 = NULL, *cbind = NULL;
int tp1 = 0, errcode = 0, i = 0;
@@ -167,13 +200,32 @@ alter_table_add_range_partition(mvc *sql
col = mt->pcol;
tp1 = col->type.type->localtype;
- if(ATOMfromstr(tp1, &pmin, &smin, min) < 0) {
- msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(42000)
"ALTER TABLE: error while parsing minimum value");
- goto finish;
- }
- if(ATOMfromstr(tp1, &pmax, &smax, max) < 0) {
- msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(42000)
"ALTER TABLE: error while parsing maximum value");
- goto finish;
+ if(tp1 == TYPE_str) {
+ if((escaped_min = add_quotes(min)) == NULL) {
+ msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(HY001)
MAL_MALLOC_FAIL);
+ goto finish;
+ }
+ if((escaped_max = add_quotes(max)) == NULL) {
+ msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(HY001)
MAL_MALLOC_FAIL);
+ goto finish;
+ }
+ if(ATOMfromstr(tp1, &pmin, &smin, escaped_min) < 0) {
+ msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(42000)
"ALTER TABLE: error while parsing minimum value");
+ goto finish;
+ }
+ if(ATOMfromstr(tp1, &pmax, &smax, escaped_max) < 0) {
+ msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(42000)
"ALTER TABLE: error while parsing maximum value");
+ goto finish;
+ }
+ } else {
+ if(ATOMfromstr(tp1, &pmin, &smin, min) < 0) {
+ msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(42000)
"ALTER TABLE: error while parsing minimum value");
+ goto finish;
+ }
+ if(ATOMfromstr(tp1, &pmax, &smax, max) < 0) {
+ msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(42000)
"ALTER TABLE: error while parsing maximum value");
+ goto finish;
+ }
}
if(ATOMcmp(tp1, pmin, pmax) > 0) {
msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(42000)
"ALTER TABLE: minimum value is higher than maximum value");
@@ -251,6 +303,10 @@ alter_table_add_range_partition(mvc *sql
}
finish:
+ if(escaped_min)
+ GDKfree(escaped_min);
+ if(escaped_max)
+ GDKfree(escaped_max);
if(cbind)
BBPunfix(cbind->batCacheid);
if(diff1)
@@ -270,7 +326,7 @@ static char *
alter_table_add_value_partition(mvc *sql, MalStkPtr stk, InstrPtr pci, char
*msname, char *mtname, char *psname, char *ptname)
{
sql_table *mt = NULL, *pt = NULL;
- str msg = MAL_SUCCEED;
+ str msg = MAL_SUCCEED, escaped = NULL;
sql_column *col = NULL, *bcol = NULL;
sql_part *err = NULL;
int tp1 = 0, errcode = 0, i = 0, ninserts = 0;
@@ -304,11 +360,27 @@ alter_table_add_value_partition(mvc *sql
ptr pnext = NULL;
size_t len = 0;
str next = *getArgReference_str(stk, pci, i);
+ if(escaped) {
+ GDKfree(escaped);
+ escaped = NULL;
+ }
- if(ATOMfromstr(tp1, &pnext, &len, next) < 0) {
- msg =
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(42000)
- "ALTER
TABLE: error while parsing value %s", next);
- goto finish;
+ if(tp1 == TYPE_str) {
+ if ((escaped = add_quotes(next)) == NULL) {
+ msg = createException(SQL,
"sql.alter_table_add_value_partition", SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ goto finish;
+ }
+ if(ATOMfromstr(tp1, &pnext, &len, escaped) < 0) {
+ msg =
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(42000)
+
"ALTER TABLE: error while parsing value %s", next);
+ goto finish;
+ }
+ } else {
+ if(ATOMfromstr(tp1, &pnext, &len, next) < 0) {
+ msg =
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(42000)
+
"ALTER TABLE: error while parsing value %s", next);
+ goto finish;
+ }
}
ret = BUNappend(b, pnext, FALSE);
GDKfree(pnext);
@@ -365,6 +437,8 @@ alter_table_add_value_partition(mvc *sql
}
finish:
+ if(escaped)
+ GDKfree(escaped);
if(b)
BBPunfix(b->batCacheid);
if(cbind)
diff --git a/sql/backends/monet5/sql_statement.c
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -3315,7 +3315,7 @@ const char *
return st->op4.cval->base.name;
case st_atom:
if (st->op4.aval->data.vtype == TYPE_str)
- return atom2string(sa, st->op4.aval, 0);
+ return atom2string(sa, st->op4.aval);
/* fall through */
case st_var:
case st_temp:
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
@@ -514,8 +514,8 @@ typedef enum table_types {
typedef struct sql_part {
sql_base base;
struct sql_table *t; /* cached value */
- int tpe; /* the column type */
- int part_type; /* by range, list/values or none */
+ sht tpe; /* the column type */
+ sht part_type; /* by range, list/values or none */
union {
bat values; /* partition by values/list */
struct sql_range { /* partition by range */
@@ -548,9 +548,11 @@ typedef struct sql_table {
int cleared; /* cleared in the current transaction */
void *data;
struct sql_schema *s;
- struct sql_table *p; /* The table is part of this merge table */
struct sql_table *po; /* the outer transactions table */
- struct sql_column *pcol; /* if it is partitioned on a column */
+
+ struct sql_table *p; /* The table is part of this merge table */
+ struct sql_column *pcol; /* If it is partitioned on a column */
+ struct sql_part *pt; /* This table belongs to this part */
} sql_table;
typedef struct res_col {
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
@@ -118,7 +118,7 @@ exp_print(mvc *sql, stream *fout, sql_ex
t->base.name);
} else {
char *t = sql_subtype_string(atom_type(a));
- char *s = atom2string(sql->sa, a, 0);
+ char *s = atom2string(sql->sa, a);
mnstr_printf(fout, "%s \"%s\"", t, s);
_DELETE(t);
}
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
@@ -89,7 +89,7 @@ rel_alter_table_add_partition_range(sql_
{
sql_rel *rel = rel_create(sa);
list *exps = new_exp_list(sa);
- char *pmin = atom2string(sa, min, 1), *pmax = atom2string(sa, max, 1);
+ char *pmin = atom2string(sa, min), *pmax = atom2string(sa, max);
if(!rel || !exps || !pmin || !pmax)
return NULL;
@@ -130,7 +130,7 @@ rel_alter_table_add_partition_list(sql_a
}
for (n = ll->h; n ; n = n->next) {
symbol* next = n->data.sym;
- char *nvalue = atom2string(sa, ((AtomNode *) next)->a, 1);
+ char *nvalue = atom2string(sa, ((AtomNode *) next)->a);
append(exps, exp_atom_clob(sa, nvalue));
}
rel->l = NULL;
@@ -523,7 +523,7 @@ column_option(
if (a->data.vtype == TYPE_str) {
mvc_default(sql, cs, a->data.val.sval);
} else {
- char *r = atom2string(sql->sa, a, 0);
+ char *r = atom2string(sql->sa, a);
mvc_default(sql, cs, r);
}
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
@@ -303,7 +303,7 @@ atom_ptr( sql_allocator *sa, sql_subtype
}
char *
-atom2string(sql_allocator *sa, atom *a, int quote)
+atom2string(sql_allocator *sa, atom *a)
{
char buf[BUFSIZ], *p = NULL;
void *v;
@@ -345,33 +345,9 @@ atom2string(sql_allocator *sa, atom *a,
sprintf(buf, "%f", a->data.val.dval);
break;
case TYPE_str:
- if (a->data.val.sval) {
- if(!quote)
- return sa_strdup(sa, a->data.val.sval);
- else { /* always produce a string between quotes,
placing them if they do not exist */
- int plus = 0, off = 0;
- char *res;
- if(a->data.val.sval[0] != '"')
- plus++;
- if(a->data.len == 0 ||
a->data.val.sval[a->data.len - 1] != '"')
- plus++;
- res = sa_alloc(sa, a->data.len + plus + 1);
- if(res) {
- if(a->data.val.sval[0] != '"') {
- res[off] = '"';
- off++;
- }
- strcpy(res + off, a->data.val.sval);
- off += a->data.len;
- if(a->data.len == 0 ||
a->data.val.sval[a->data.len - 1] != '"') {
- res[off] = '"';
- off++;
- }
- res[off] = '\0';
- }
- return res;
- }
- } else
+ if (a->data.val.sval)
+ return sa_strdup(sa, a->data.val.sval);
+ else
sprintf(buf, "NULL");
break;
default:
diff --git a/sql/server/sql_atom.h b/sql/server/sql_atom.h
--- a/sql/server/sql_atom.h
+++ b/sql/server/sql_atom.h
@@ -48,7 +48,7 @@ extern atom *atom_dup( sql_allocator *sa
/* cast atom a to type tp (success == 1, fail == 0) */
extern int atom_cast(sql_allocator *sa, atom *a, sql_subtype *tp);
-extern char *atom2string(sql_allocator *sa, atom *a, int quote);
+extern char *atom2string(sql_allocator *sa, atom *a);
extern char *atom2sql(atom *a);
extern sql_subtype *atom_type(atom *a);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -1009,6 +1009,7 @@ set_members(changeset *ts)
sql_table *pt = find_sql_table(t->s,
p->base.name);
pt->p = t;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list