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