Changeset: 0c76a0e6a2df for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/0c76a0e6a2df
Modified Files:
        sql/server/sql_parser.y
        sql/test/odbc-escape-sequences/Tests/convert-func-hge.test
        sql/test/odbc-escape-sequences/Tests/convert-functions.test
Branch: Jun2023
Log Message:

Improved and extended tests of {fn convert(expr, SQL_ODBC_type)} functions.
Found issues with conversion to SQL_CHAR and SQL_WCHAR. Corrected them in the 
parser.


diffs (288 lines):

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
@@ -6575,7 +6575,7 @@ odbc_data_type:
     | SQL_BIT
         { sql_find_subtype(&$$, "boolean", 0, 0); }
     | SQL_CHAR
-        { sql_find_subtype(&$$, "char", 1, 0); }
+        { sql_find_subtype(&$$, "char", 0, 0); }
     | SQL_DATE
         { sql_find_subtype(&$$, "date", 0, 0); }
     | SQL_DECIMAL
@@ -6593,7 +6593,7 @@ odbc_data_type:
             }
             sql_init_subtype(&$$, t, 0, 0);
         }
-    | SQL_HUGEINT
+    | SQL_HUGEINT  /* Note: SQL_HUGEINT is not part of or defined in ODBC. It 
is a MonetDB extension. */
         { sql_find_subtype(&$$, "hugeint", 0, 0); }
     | SQL_INTEGER
         { sql_find_subtype(&$$, "int", 0, 0); }
@@ -6642,13 +6642,13 @@ odbc_data_type:
     | SQL_VARBINARY
         { sql_find_subtype(&$$, "blob", 0, 0); }
     | SQL_VARCHAR
-        { sql_find_subtype(&$$, "clob", 0, 0); }
+        { sql_find_subtype(&$$, "varchar", 0, 0); }
     | SQL_WCHAR
-        { sql_find_subtype(&$$, "char", 1, 0); }
+        { sql_find_subtype(&$$, "char", 0, 0); }
     | SQL_WLONGVARCHAR
         { sql_find_subtype(&$$, "clob", 0, 0); }
     | SQL_WVARCHAR
-        { sql_find_subtype(&$$, "clob", 0, 0); }
+        { sql_find_subtype(&$$, "varchar", 0, 0); }
 ;
 
 odbc_tsi_qualifier:
diff --git a/sql/test/odbc-escape-sequences/Tests/convert-func-hge.test 
b/sql/test/odbc-escape-sequences/Tests/convert-func-hge.test
--- a/sql/test/odbc-escape-sequences/Tests/convert-func-hge.test
+++ b/sql/test/odbc-escape-sequences/Tests/convert-func-hge.test
@@ -1,4 +1,6 @@
+# Note: SQL_HUGEINT is not defined in ODBC. This is a MonetDB extension.
+
 query I rowsort
-select { fn convert(1, SQL_HUGEINT) }
+select { fn convert('-2345678901234567890', SQL_HUGEINT) }
 ----
-1
+-2345678901234567890
diff --git a/sql/test/odbc-escape-sequences/Tests/convert-functions.test 
b/sql/test/odbc-escape-sequences/Tests/convert-functions.test
--- a/sql/test/odbc-escape-sequences/Tests/convert-functions.test
+++ b/sql/test/odbc-escape-sequences/Tests/convert-functions.test
@@ -1,11 +1,12 @@
+# ref: 
https://learn.microsoft.com/en-us/sql/odbc/reference/appendixes/explicit-data-type-conversion-function
 
 query I rowsort
-select { fn convert(1, SQL_BIGINT) }
+select { fn CONVERT('-2345678901', SQL_BIGINT) }
 ----
-1
+-2345678901
 
 query T rowsort
-select { fn convert(x'1234', SQL_BINARY) }
+select { fn convert('1234', SQL_BINARY) }
 ----
 1234
 
@@ -17,7 +18,12 @@ 1
 query T rowsort
 select { fn convert('abc', SQL_CHAR) }
 ----
-a
+abc
+
+query T rowsort
+select convert('abc', CHAR(5))
+----
+abc
 
 query T rowsort
 select { fn convert('2022-11-10', SQL_DATE) }
@@ -25,86 +31,109 @@ select { fn convert('2022-11-10', SQL_DA
 2022-11-10
 
 query T rowsort
-select { fn convert(3.33333, SQL_DECIMAL) }
+select { fn convert('3.12345', SQL_DECIMAL) }
 ----
-3.333
+3.123
 
 query T rowsort
-select { fn convert(3.33333, SQL_DOUBLE) }
+select { fn convert('3.12345', SQL_DOUBLE) }
 ----
-3.33333
+3.12345
 
 query T rowsort
-select { fn convert(3.33333, SQL_FLOAT) }
+select { fn convert('3.12345', SQL_FLOAT) }
 ----
-3.33333
+3.12345
 
 query T rowsort
 select { fn convert('a338a15d-0422-4242-a7f0-65316edae19a', SQL_GUID) }
 ----
 a338a15d-0422-4242-a7f0-65316edae19a
 
+query I rowsort
+select { fn convert('+123456789', SQL_INTEGER) }
+----
+123456789
 
 query I rowsort
-select { fn convert(1, SQL_INTEGER) }
-----
-1
-
-query I rowsort
-select { fn convert(interval '1' year, SQL_INTERVAL_YEAR) }
+select { fn convert('1', SQL_INTERVAL_YEAR) }
 ----
 12
 
+query T rowsort
+select { fn convert('1-2', SQL_INTERVAL_YEAR_TO_MONTH) }
+----
+14
+
 query I rowsort
-select { fn convert(interval '1' year, SQL_INTERVAL_YEAR_TO_MONTH) }
+select { fn convert('12', SQL_INTERVAL_MONTH) }
 ----
 12
 
-query I rowsort
-select { fn convert(interval '1' year, SQL_INTERVAL_MONTH) }
+query T rowsort
+select { fn convert('1', SQL_INTERVAL_DAY) }
 ----
-12
+1
 
 query I rowsort
 select { fn convert(date'2022-10-8' - date'2022-10-7', SQL_INTERVAL_DAY) }
 ----
 1
 
-query T rowsort
-select { fn convert(interval '1' day, SQL_INTERVAL_DAY_TO_HOUR) }
+query I rowsort
+select { fn convert({d'2022-10-8'} - {d'2022-10-7'}, SQL_INTERVAL_DAY) }
 ----
-1 day, 0:00:00
+1
 
+query T rowsort
+select { fn convert('1 4', SQL_INTERVAL_DAY_TO_HOUR) }
+----
+1 day, 4:00:00
 
 query T rowsort
-select { fn convert(interval '1' day, SQL_INTERVAL_DAY_TO_MINUTE) }
+select { fn convert('2 0:4', SQL_INTERVAL_DAY_TO_MINUTE) }
 ----
-1 day, 0:00:00
+2 days, 0:04:00
 
 query T rowsort
-select { fn convert(interval '1' day, SQL_INTERVAL_DAY_TO_SECOND) }
+select { fn convert('3 0:0:5', SQL_INTERVAL_DAY_TO_SECOND) }
+----
+3 days, 0:00:05
+
+query T rowsort
+select { fn convert('23', SQL_INTERVAL_HOUR) }
+----
+23:00:00
+
+query T rowsort
+select { fn convert('24', SQL_INTERVAL_HOUR) }
 ----
 1 day, 0:00:00
 
 query T rowsort
-select { fn convert(interval '1' hour, SQL_INTERVAL_HOUR) }
+select { fn convert( {fn convert(2*4*5, SQL_CHAR)}, SQL_INTERVAL_HOUR) }
 ----
-1:00:00
+1 day, 16:00:00
+
+query T rowsort
+select { fn convert('1:02', SQL_INTERVAL_HOUR_TO_MINUTE) }
+----
+1:02:00
 
 query T rowsort
-select { fn convert(interval '1' hour, SQL_INTERVAL_HOUR_TO_MINUTE) }
+select { fn convert('1:03:06', SQL_INTERVAL_HOUR_TO_SECOND) }
 ----
-1:00:00
+1:03:06
 
 query T rowsort
-select { fn convert(interval '1' hour, SQL_INTERVAL_HOUR_TO_SECOND) }
+select { fn convert('1', SQL_INTERVAL_MINUTE) }
 ----
-1:00:00
+0:01:00
 
 query T rowsort
-select { fn convert(interval '1' minute, SQL_INTERVAL_MINUTE) }
+select { fn convert('1:30', SQL_INTERVAL_MINUTE_TO_SECOND) }
 ----
-0:01:00
+0:01:30
 
 query T rowsort
 select { fn convert((interval '1' minute - interval '30' second), 
SQL_INTERVAL_MINUTE_TO_SECOND) }
@@ -112,7 +141,7 @@ select { fn convert((interval '1' minute
 0:00:30
 
 query T rowsort
-select { fn convert(x'1234', SQL_LONGVARBINARY) }
+select { fn convert('1234', SQL_LONGVARBINARY) }
 ----
 1234
 
@@ -122,37 +151,37 @@ select { fn convert('abc', SQL_LONGVARCH
 abc
 
 query T rowsort
-select { fn convert(3.333333, SQL_NUMERIC) }
+select { fn convert('3.12345', SQL_NUMERIC) }
 ----
-3.333
+3.123
 
 query T rowsort
-select { fn convert(3.333333, SQL_REAL) }
+select { fn convert('3.123456', SQL_REAL) }
 ----
-3.333333
+3.123456
 
 query I rowsort
-select { fn convert(3, SQL_SMALLINT) }
+select { fn convert('3', SQL_SMALLINT) }
 ----
 3
 
 query T rowsort
-select { fn convert(time'00:01:45', SQL_TIME) }
+select { fn convert('00:01:45', SQL_TIME) }
 ----
 00:01:45
 
 query T rowsort
-select { fn convert(timestamp'2022-11-10 00:01:45', SQL_TIMESTAMP) }
+select { fn convert('2022-11-10 00:01:45', SQL_TIMESTAMP) }
 ----
 2022-11-10 00:01:45
 
 query I rowsort
-select { fn convert(1, SQL_TINYINT) }
+select { fn convert('1', SQL_TINYINT) }
 ----
 1
 
 query T rowsort
-select { fn convert(x'1234', SQL_VARBINARY) }
+select { fn convert('1234', SQL_VARBINARY) }
 ----
 1234
 
@@ -164,7 +193,7 @@ abc
 query T rowsort
 select { fn convert('abc', SQL_WCHAR) }
 ----
-a
+abc
 
 query T rowsort
 select { fn convert('abc', SQL_WVARCHAR) }
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to