Changeset: 25f6c008500b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/25f6c008500b
Modified Files:
sql/common/sql_types.c
sql/server/rel_dump.c
sql/server/rel_schema.c
sql/server/rel_select.c
sql/server/sql_parser.y
sql/test/SQLancer/Tests/sqlancer08.test
Branch: Aug2024
Log Message:
Kind of reapply changeset a32c685fa62b, but now do it mostly in the parser.
diffs (214 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
@@ -244,6 +244,8 @@ sql_init_subtype(sql_subtype *res, sql_t
if (t->digits && res->digits > t->digits)
res->digits = t->digits;
res->scale = scale;
+ if (!digits && !scale && t->eclass == EC_DEC)
+ res->scale = res->digits = 0;
}
sql_subtype *
@@ -765,7 +767,7 @@ sql_create_type(allocator *sa, const cha
(void) keywords_insert(t->base.name, KW_TYPE);
list_append(types, t);
- list_append(localtypes, sql_create_subtype(sa, t, 0, 0));
+ list_append(localtypes, sql_create_subtype(sa, t, digits, 0));
return t;
}
@@ -799,10 +801,10 @@ sql_create_func_(allocator *sa, const ch
for (int i = 0; i < nargs; i++) {
sql_type *tpe = va_arg(valist, sql_type*);
- list_append(ops, create_arg(sa, NULL, sql_create_subtype(sa,
tpe, 0, 0), ARG_IN));
+ list_append(ops, create_arg(sa, NULL, sql_create_subtype(sa,
tpe, tpe->digits, 0), ARG_IN));
}
if (res)
- fres = create_arg(sa, NULL, sql_create_subtype(sa, res, 0, 0),
ARG_OUT);
+ fres = create_arg(sa, NULL, sql_create_subtype(sa, res,
res->digits, 0), ARG_OUT);
base_init(sa, &t->base, local_id++, false, name);
t->imp = sa_strdup(sa, imp);
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
@@ -1473,7 +1473,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
if (!sql_find_subtype(&tpe, tname, 0, 0)) {
if (!(t = mvc_bind_type(sql, tname))) /* try an
external type */
return sql_error(sql, ERR_NOTFOUND,
SQLSTATE(42000) "SQL type %s not found\n", tname);
- sql_init_subtype(&tpe, t, 0, 0);
+ sql_init_subtype(&tpe, t, t->digits, 0);
}
if (!(exp = parse_atom(sql, r, pos, &tpe)))
return NULL;
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
@@ -1094,6 +1094,9 @@ create_column(sql_query *query, symbol *
if (l->h->next->next)
opt_list = l->h->next->next->data.lval;
+ if (ctype && ctype->type->eclass == EC_DEC && !ctype->digits &&
!ctype->scale) /* default 18,3 */
+ ctype = sql_bind_subtype(query->sql->sa, "decimal", 18, 3);
+
if (cname && ctype) {
sql_column *cs = NULL;
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -4073,10 +4073,12 @@ rel_cast(sql_query *query, sql_rel **rel
sql_subtype *et = exp_subtype(e);
if (et->type->eclass == EC_NUM) {
unsigned int min_precision = atom_num_digits(e->l);
+ if (!tpe->digits && !tpe->scale)
+ tpe->digits = min_precision;
if (min_precision > tpe->digits)
return sql_error(sql, 02, SQLSTATE(42000)
"Precision (%d) should be at least (%d)", tpe->digits, min_precision);
- tpe = sql_bind_subtype(sql->sa, "decimal",
min_precision, et->scale);
- } else if (EC_VARCHAR(et->type->eclass)) {
+ tpe = sql_bind_subtype(sql->sa, "decimal", tpe->digits,
et->scale);
+ } else if (EC_VARCHAR(et->type->eclass) && !tpe->digits &&
!tpe->scale) {
char *s = E_ATOM_STRING(e);
unsigned int min_precision = 0, min_scale = 0;
bool dot_seen = false;
@@ -4091,6 +4093,12 @@ rel_cast(sql_query *query, sql_rel **rel
}
tpe = sql_bind_subtype(sql->sa, "decimal",
min_precision, min_scale);
}
+ } else if (tpe->type->eclass == EC_DEC && !tpe->digits && !tpe->scale) {
+ sql_subtype *et = exp_subtype(e);
+ if (et->type->eclass == EC_NUM)
+ tpe = sql_bind_subtype(sql->sa, "decimal", et->digits,
0);
+ else /* fallback */
+ tpe = sql_bind_subtype(sql->sa, "decimal", 18, 3);
}
if (e)
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
@@ -2632,11 +2632,17 @@ opt_end_label:
table_function_column_list:
column data_type { $$ = L();
append_string($$, $1);
+ if (strcmp($2.type->base.name, "decimal") ==
0 &&
+ $2.digits == 0 && $2.scale == 0)
+ sql_find_subtype(&$2, "decimal", 18,
3);
append_type($$, &$2);
}
| table_function_column_list ',' column data_type
{
append_string($$, $3);
+ if (strcmp($4.type->base.name, "decimal") ==
0 &&
+ $4.digits == 0 && $4.scale == 0)
+ sql_find_subtype(&$4, "decimal", 18,
3);
append_type($$, &$4);
}
;
@@ -2645,7 +2651,12 @@ func_data_type:
TABLE '(' table_function_column_list ')'
{ $$ = _symbol_create_list(SQL_TABLE, $3); }
| data_type
- { $$ = _symbol_create_list(SQL_TYPE, append_type(L(),&$1)); }
+ {
+ if (strcmp($1.type->base.name, "decimal") == 0 &&
+ $1.digits == 0 && $1.scale == 0)
+ sql_find_subtype(&$1, "decimal", 18, 3);
+ $$ = _symbol_create_list(SQL_TYPE,
append_type(L(),&$1));
+ }
;
opt_paramlist:
@@ -2661,12 +2672,18 @@ paramlist:
paramlist ',' ident data_type
{ dlist *p = L();
append_string(p, $3);
+ if (strcmp($4.type->base.name, "decimal") == 0 &&
+ $4.digits == 0 && $4.scale == 0)
+ sql_find_subtype(&$4, "decimal", 18, 3);
append_type(p, &$4);
$$ = append_list($1, p); }
| ident data_type
{ dlist *l = L();
dlist *p = L();
append_string(p, $1);
+ if (strcmp($2.type->base.name, "decimal") == 0 &&
+ $2.digits == 0 && $2.scale == 0)
+ sql_find_subtype(&$2, "decimal", 18, 3);
append_type(p, &$2);
$$ = append_list(l, p); }
;
@@ -2869,11 +2886,21 @@ opt_typelist:
;
typelist:
- data_type { dlist *l = L();
- append_type(l, &$1 );
- $$= l; }
- | data_type ',' typelist { append_type($3, &$1);
- $$ = $3; }
+ data_type {
+ dlist *l = L();
+ if (strcmp($1.type->base.name, "decimal") == 0 &&
+ $1.digits == 0 && $1.scale == 0)
+ sql_find_subtype(&$1, "decimal", 18, 3);
+ append_type(l, &$1 );
+ $$= l;
+ }
+ | data_type ',' typelist {
+ if (strcmp($1.type->base.name, "decimal") == 0 &&
+ $1.digits == 0 && $1.scale == 0)
+ sql_find_subtype(&$1, "decimal", 18, 1);
+ append_type($3, &$1);
+ $$ = $3;
+ }
;
drop_action:
@@ -5752,7 +5779,7 @@ data_type:
| BIGINT { sql_find_subtype(&$$, "bigint", 0, 0); }
| HUGEINT { sql_find_subtype(&$$, "hugeint", 0, 0); }
- | sqlDECIMAL { sql_find_subtype(&$$, "decimal", 18, 3); }
+ | sqlDECIMAL { sql_find_subtype(&$$, "decimal", 0, 0); }
| sqlDECIMAL '(' nonzero ')'
{
int d = $3;
@@ -7019,7 +7046,7 @@ odbc_data_type:
| SQL_DATE
{ sql_find_subtype(&$$, "date", 0, 0); }
| SQL_DECIMAL
- { sql_find_subtype(&$$, "decimal", 18, 3); }
+ { sql_find_subtype(&$$, "decimal", 0, 0); }
| SQL_DOUBLE
{ sql_find_subtype(&$$, "double", 0, 0); }
| SQL_FLOAT
@@ -7068,7 +7095,7 @@ odbc_data_type:
| SQL_LONGVARCHAR
{ sql_find_subtype(&$$, "varchar", 0, 0); }
| SQL_NUMERIC
- { sql_find_subtype(&$$, "decimal", 18, 3); }
+ { sql_find_subtype(&$$, "decimal", 0, 0); }
| SQL_REAL
{ sql_find_subtype(&$$, "real", 0, 0); }
| SQL_SMALLINT
diff --git a/sql/test/SQLancer/Tests/sqlancer08.test
b/sql/test/SQLancer/Tests/sqlancer08.test
--- a/sql/test/SQLancer/Tests/sqlancer08.test
+++ b/sql/test/SQLancer/Tests/sqlancer08.test
@@ -170,10 +170,10 @@ 0
statement ok
ROLLBACK
-statement error 42000!Decimal (0.2.3) doesn't have format (3.2)
+statement error 42000!Decimal (0.2.3) doesn't have format (10.2)
select cast('0.2.3' as decimal(10,2))
-statement error 42000!Decimal (+0..2) doesn't have format (2.1)
+statement error 42000!Decimal (+0..2) doesn't have format (10.2)
select cast('+0..2' as decimal(10,2))
statement ok
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]