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

Reply via email to