Changeset: e0b887a3dc3b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e0b887a3dc3b
Modified Files:
        sql/common/sql_types.c
        sql/common/sql_types.h
        sql/server/rel_optimizer.c
        sql/server/rel_unnest.c
        sql/server/sql_atom.c
        sql/server/sql_decimal.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        sql/server/sql_parser.y
        sql/server/sql_semantic.c
        sql/storage/sql_storage.h
        sql/storage/store.c
        sql/test/SQLancer/Tests/sqlancer09.stable.err
        sql/test/SQLancer/Tests/sqlancer09.stable.out
Branch: Oct2020
Log Message:

Strings don't have scale, also use the right type: signed vs unsigned


diffs (truncated from 382 to 300 lines):

diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -29,7 +29,7 @@ list *funcs = NULL;
 static sql_type *BIT = NULL;
 static list *localtypes = NULL;
 
-int digits2bits(int digits)
+unsigned int digits2bits(unsigned int digits)
 {
        if (digits < 3)
                return 8;
@@ -56,7 +56,7 @@ int digits2bits(int digits)
 #endif
 }
 
-int bits2digits(int bits)
+unsigned int bits2digits(unsigned int bits)
 {
        if (bits < 4)
                return 1;
diff --git a/sql/common/sql_types.h b/sql/common/sql_types.h
--- a/sql/common/sql_types.h
+++ b/sql/common/sql_types.h
@@ -21,8 +21,8 @@ extern list *aliases;
 extern list *types;
 extern list *funcs;
 
-extern int bits2digits(int b);
-extern int digits2bits(int d);
+extern unsigned int bits2digits(unsigned int b);
+extern unsigned int digits2bits(unsigned int d);
 
 extern int sql_type_convert(int form, int to); /* return 1, convert possible 
but it's a down cast, 2 convert possible can be done savely */
 extern bool is_commutative(const char *fnm);   /* return true if commutative */
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -8361,7 +8361,7 @@ rel_reduce_casts(visitor *v, sql_rel *re
                                                                lng val = 1;
 #endif
                                                                /* multiply 
with smallest value, then scale and (round) */
-                                                               int scale = 
tt->scale - ft->scale;
+                                                               int scale = 
(int) tt->scale - (int) ft->scale;
                                                                int rs = 
reduce_scale(a);
 
                                                                scale -= rs;
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -1799,7 +1799,7 @@ exp_physical_types(visitor *v, sql_rel *
                                sql_subtype *rt = exp_subtype(re);
 
                                if (rt->type->eclass == EC_DEC && rt->scale) {
-                                       int scale = rt->scale; /* shift with 
scale */
+                                       int scale = (int) rt->scale; /* shift 
with scale */
                                        sql_subtype *it = 
sql_bind_localtype(lt->type->base.name);
                                        sql_subfunc *c = 
sql_bind_func(v->sql->sa, v->sql->session->schema, "scale_down", lt, it, 
F_FUNC);
 
@@ -1825,7 +1825,7 @@ exp_physical_types(visitor *v, sql_rel *
                                sql_subtype *rt = exp_subtype(re);
 
                                if (rt->type->eclass == EC_DEC && rt->scale) {
-                                       int scale = rt->scale; /* shift with 
scale */
+                                       int scale = (int) rt->scale; /* shift 
with scale */
 #ifdef HAVE_HGE
                                        hge val = scale2value(scale);
 #else
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
@@ -608,13 +608,13 @@ atom2sql(sql_allocator *sa, atom *a, int
                case EC_TIME:
                case EC_TIME_TZ: {
                        daytime dt = a->data.val.lval;
-                       int digits = a->tpe.digits ? a->tpe.digits - 1 : 0;
+                       unsigned int digits = a->tpe.digits ? a->tpe.digits - 1 
: 0;
                        char *s = val2;
                        ssize_t lens;
 
                        if (ec == EC_TIME_TZ)
                                dt = daytime_add_usec_modulo(dt, timezone * 
1000);
-                       if ((lens = daytime_precision_tostr(&s, &len, dt, 
digits, true)) < 0)
+                       if ((lens = daytime_precision_tostr(&s, &len, dt, (int) 
digits, true)) < 0)
                                assert(0);
 
                        if (ec == EC_TIME_TZ) {
@@ -633,7 +633,7 @@ atom2sql(sql_allocator *sa, atom *a, int
                case EC_TIMESTAMP:
                case EC_TIMESTAMP_TZ: {
                        timestamp ts = a->data.val.lval;
-                       int digits = a->tpe.digits ? a->tpe.digits - 1 : 0;
+                       unsigned int digits = a->tpe.digits ? a->tpe.digits - 1 
: 0;
                        char *s = val2;
                        size_t nlen;
                        ssize_t lens;
@@ -652,7 +652,7 @@ atom2sql(sql_allocator *sa, atom *a, int
                        assert(nlen < len);
 
                        usecs = timestamp_daytime(ts);
-                       if ((lens = daytime_precision_tostr(&s, &nlen, usecs, 
digits, true)) < 0)
+                       if ((lens = daytime_precision_tostr(&s, &nlen, usecs, 
(int) digits, true)) < 0)
                                assert(0);
 
                        if (ec == EC_TIMESTAMP_TZ) {
diff --git a/sql/server/sql_decimal.c b/sql/server/sql_decimal.c
--- a/sql/server/sql_decimal.c
+++ b/sql/server/sql_decimal.c
@@ -121,7 +121,8 @@ decimal_to_str(sql_allocator *sa, lng v,
 #endif
 {
        char buf[64];
-       int scale = t->scale, cur = 63, neg = (v<0), i, done = 0;
+       unsigned int scale = t->scale, i;
+       int cur = 63, neg = (v<0), done = 0;
 
        if (v<0) v = -v;
 
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -93,7 +93,7 @@ mvc_init_create_view(mvc *m, sql_schema 
 struct view_t {
        const char *name;
        const char *type;
-       int digits;
+       unsigned int digits;
        sqlid oldid;
        sqlid newid;
 };
@@ -1046,7 +1046,7 @@ mvc_bind_trigger(mvc *m, sql_schema *s, 
 }
 
 sql_type *
-mvc_create_type(mvc *sql, sql_schema *s, const char *name, int digits, int 
scale, int radix, const char *impl)
+mvc_create_type(mvc *sql, sql_schema *s, const char *name, unsigned int 
digits, unsigned int scale, int radix, const char *impl)
 {
        sql_type *t = NULL;
 
@@ -1322,7 +1322,7 @@ mvc_clear_table(mvc *m, sql_table *t)
 }
 
 sql_column *
-mvc_create_column_(mvc *m, sql_table *t, const char *name, const char *type, 
int digits)
+mvc_create_column_(mvc *m, sql_table *t, const char *name, const char *type, 
unsigned int digits)
 {
        sql_subtype tpe;
 
diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h
--- a/sql/server/sql_mvc.h
+++ b/sql/server/sql_mvc.h
@@ -189,7 +189,7 @@ extern sql_key *mvc_bind_key(mvc *c, sql
 extern sql_key *mvc_bind_ukey(sql_table *t, list *cols);
 extern sql_trigger *mvc_bind_trigger(mvc *c, sql_schema *s, const char *tname);
 
-extern sql_type *mvc_create_type(mvc *sql, sql_schema *s, const char *sqlname, 
int digits, int scale, int radix, const char *impl);
+extern sql_type *mvc_create_type(mvc *sql, sql_schema *s, const char *sqlname, 
unsigned int digits, unsigned int scale, int radix, const char *impl);
 extern int mvc_drop_type(mvc *sql, sql_schema *s, sql_type *t, int 
drop_action);
 
 extern sql_func *mvc_create_func(mvc *sql, sql_allocator *sa, sql_schema *s, 
const char *name, list *args, list *res, sql_ftype type, sql_flang lang, const 
char *mod, const char *impl, const char *query, bit varres, bit vararg, bit 
system);
@@ -206,7 +206,7 @@ extern sql_table *mvc_create_remote(mvc 
 
 extern int mvc_drop_column(mvc *c, sql_table *t, sql_column *col, int 
drop_action);
 extern sql_column *mvc_create_column(mvc *c, sql_table *t, const char *name, 
sql_subtype *type);
-extern sql_column *mvc_create_column_(mvc *c, sql_table *t, const char *name, 
const char *type, int digits);
+extern sql_column *mvc_create_column_(mvc *c, sql_table *t, const char *name, 
const char *type, unsigned int digits);
 extern sql_column *mvc_null(mvc *c, sql_column *col, int flag);
 extern sql_column *mvc_default(mvc *c, sql_column *col, char *val);
 extern sql_column *mvc_drop_default(mvc *c, sql_column *col);
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -4672,7 +4672,7 @@ literal:
 
                  /* find the most suitable data type for the given number */
                  if (!err) {
-                   int bits = digits2bits(digits), obits = bits;
+                   int bits = (int) digits2bits(digits), obits = bits;
 
                    while (bits > 0 &&
                           (bits == sizeof(value) * 8 ||
diff --git a/sql/server/sql_semantic.c b/sql/server/sql_semantic.c
--- a/sql/server/sql_semantic.c
+++ b/sql/server/sql_semantic.c
@@ -183,7 +183,7 @@ result_datatype(sql_subtype *super, sql_
        /* case a strings */
        if (EC_VARCHAR(lclass) || EC_VARCHAR(rclass)) {
                char *tpe = "varchar";
-               int digits = 0;
+               unsigned int digits = 0;
                if (!EC_VARCHAR(lclass)) {
                                tpe = r->type->sqlname;
                                digits = (!l->digits)?0:r->digits;
@@ -205,7 +205,7 @@ result_datatype(sql_subtype *super, sql_
        } else if (EC_EXACTNUM(lclass) && EC_EXACTNUM(rclass)) {
                char *tpe = (l->type->base.id > 
r->type->base.id)?l->type->sqlname:r->type->sqlname;
                unsigned int digits = sql_max(l->digits, r->digits);
-               int scale = sql_max(l->scale, r->scale);
+               unsigned int scale = sql_max(l->scale, r->scale);
                if (l->type->radix == 10 || r->type->radix == 10) {
                        digits = 0;
                        /* change to radix 10 */
@@ -228,7 +228,7 @@ result_datatype(sql_subtype *super, sql_
                                *super = *l;
                } else { /* both */
                                char *tpe = (l->type->base.id > 
r->type->base.id)?l->type->sqlname:r->type->sqlname;
-                               int digits = sql_max(l->digits, r->digits); /* 
bits precision */
+                               unsigned int digits = sql_max(l->digits, 
r->digits); /* bits precision */
                                sql_find_subtype(super, tpe, digits, 0);
                }
        /* now its getting serious, ie e any 'case e' datetime data type */
@@ -246,10 +246,11 @@ supertype(sql_subtype *super, sql_subtyp
 {
        /* first find super type */
        char *tpe = r->type->sqlname;
-       int radix = r->type->radix;
-       int digits = 0;
-       int idigits = i->digits;
-       int rdigits = r->digits;
+       sql_class eclass = r->type->eclass;
+       unsigned int radix = (unsigned int) r->type->radix;
+       unsigned int digits = 0;
+       unsigned int idigits = i->digits;
+       unsigned int rdigits = r->digits;
        unsigned int scale = sql_max(i->scale, r->scale);
        sql_subtype lsuper;
 
@@ -259,9 +260,14 @@ supertype(sql_subtype *super, sql_subtyp
                lsuper = *i;
                radix = i->type->radix;
                tpe = i->type->sqlname;
+               eclass = i->type->eclass;
        }
-       if (!lsuper.type->localtype)
+       if (EC_VARCHAR(lsuper.type->eclass))
+               scale = 0; /* strings don't have scale */
+       if (!lsuper.type->localtype) {
                tpe = "smallint";
+               eclass = EC_NUM;
+       }
        /*
         * In case of different radix we should change one.
         */
@@ -280,12 +286,16 @@ supertype(sql_subtype *super, sql_subtyp
                }
        }
        /* handle OID horror */
-       if (i->type->radix == r->type->radix && i->type->base.id < 
r->type->base.id && strcmp(i->type->sqlname, "oid") == 0)
+       if (i->type->radix == r->type->radix && i->type->base.id < 
r->type->base.id && strcmp(i->type->sqlname, "oid") == 0) {
                tpe = i->type->sqlname;
-       if (scale == 0 && (idigits == 0 || rdigits == 0)) {
+               eclass = i->type->eclass;
+       }
+       if (scale == 0 && (idigits == 0 || rdigits == 0)) { /* clob falls here 
*/
                sql_find_subtype(&lsuper, tpe, 0, 0);
        } else {
-               digits = sql_max(idigits - i->scale, rdigits - r->scale);
+               /* for strings use the max of both */
+               digits = EC_VARCHAR(eclass) ? sql_max(idigits, rdigits) :
+                                sql_max(idigits - i->scale, rdigits - 
r->scale);
                sql_find_subtype(&lsuper, tpe, digits+scale, scale);
        }
        *super = lsuper;
diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h
--- a/sql/storage/sql_storage.h
+++ b/sql/storage/sql_storage.h
@@ -405,7 +405,7 @@ extern bool sql_trans_validate(sql_trans
 extern int sql_trans_commit(sql_trans *tr);
 extern int sql_save_snapshots(sql_trans *tr);
 
-extern sql_type *sql_trans_create_type(sql_trans *tr, sql_schema *s, const 
char *sqlname, int digits, int scale, int radix, const char *impl);
+extern sql_type *sql_trans_create_type(sql_trans *tr, sql_schema *s, const 
char *sqlname, unsigned int digits, unsigned int scale, int radix, const char 
*impl);
 extern int sql_trans_drop_type(sql_trans *tr, sql_schema * s, sqlid id, int 
drop_action);
 
 extern sql_func *sql_trans_create_func(sql_trans *tr, sql_schema *s, const 
char *func, list *args, list *res, sql_ftype type, sql_flang lang, const char 
*mod, const char *impl, const char *query, bit varres, bit vararg, bit system);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -1052,7 +1052,7 @@ load_arg(sql_trans *tr, sql_func * f, oi
        void *v;
        sql_arg *a = SA_ZNEW(tr->sa, sql_arg);
        char *tpe;
-       int digits, scale;
+       unsigned int digits, scale;
        sql_schema *syss = find_sql_schema(tr, "sys");
        sql_table *args = find_sql_table(syss, "args");
 
@@ -1626,7 +1626,7 @@ table_next_column_nr(sql_table *t)
 }
 
 static sql_column *
-bootstrap_create_column(sql_trans *tr, sql_table *t, char *name, char 
*sqltype, int digits)
+bootstrap_create_column(sql_trans *tr, sql_table *t, char *name, char 
*sqltype, unsigned int digits)
 {
        sql_column *col = SA_ZNEW(tr->sa, sql_column);
 
@@ -5783,7 +5783,7 @@ sys_drop_sequences(sql_trans *tr, sql_sc
 }
 
 sql_type *
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to