Changeset: e519799dabb9 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e519799dabb9
Modified Files:
        sql/backends/monet5/sql_time.c
        sql/test/BugTracker-2024/Tests/All
        testing/sqllogictest.py
Branch: Aug2024
Log Message:

Merge with Dec2023 branch.


diffs (218 lines):

diff --git a/sql/backends/monet5/sql_time.c b/sql/backends/monet5/sql_time.c
--- a/sql/backends/monet5/sql_time.c
+++ b/sql/backends/monet5/sql_time.c
@@ -951,7 +951,8 @@ month_interval_str_imp(int *ret, const c
        lng upcast;
        if (interval_from_str(next, d, sk, &upcast) < 0)
                return createException(SQL, "batcalc.month_interval_str", 
SQLSTATE(42000) "Wrong format (%s)", next);
-       assert((lng) GDK_int_min <= upcast && upcast <= (lng) GDK_int_max);
+       if (upcast < (lng) GDK_int_min || upcast > (lng) GDK_int_max)
+               throw(SQL, "batcalc.month_interval_str", SQLSTATE(22003) "value 
out of range");
        *ret = (int) upcast;
        return MAL_SUCCEED;
 }
diff --git a/sql/test/BugTracker-2024/Tests/7562-interval-overflow.test 
b/sql/test/BugTracker-2024/Tests/7562-interval-overflow.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2024/Tests/7562-interval-overflow.test
@@ -0,0 +1,9 @@
+statement ok
+CREATE  TABLE  t0(c0 INTERVAL YEAR TO MONTH)
+
+statement ok
+INSERT INTO t0( c0) VALUES ('2-5')
+
+statement error
+SELECT * FROM t0 WHERE (NOT ((t0.c0)>=('--18945599805')))
+
diff --git a/sql/test/BugTracker-2024/Tests/All 
b/sql/test/BugTracker-2024/Tests/All
--- a/sql/test/BugTracker-2024/Tests/All
+++ b/sql/test/BugTracker-2024/Tests/All
@@ -83,3 +83,4 @@ 7555-incorrect-semijoin-rewrite
 7556-missing-ignore-case
 7465-fwf-block-boundary-error
 7566-connections-refused
+7562-interval-overflow
diff --git a/sql/test/BugTracker-2024/Tests/exp_ref-Bug-7479.test 
b/sql/test/BugTracker-2024/Tests/exp_ref-Bug-7479.test
--- a/sql/test/BugTracker-2024/Tests/exp_ref-Bug-7479.test
+++ b/sql/test/BugTracker-2024/Tests/exp_ref-Bug-7479.test
@@ -1,25 +1,32 @@
-query T nosort
+query I nosort
 WITH x AS ( SELECT 1 x UNION SELECT - '199419' ) SELECT 1 FROM x AS
 ----
 1
 1
 
-query T nosort
+query I nosort
 WITH x AS ( SELECT 1 x UNION SELECT - '199419' ) SELECT 1 FROM x AS WHERE x IN 
( SELECT x FROM x AS )
 ----
 1
 1
 
-statment error syntax error, unexpected ')' in: "with x as ( select 1 x union 
select - '199419' ) select 1 from x as where x in ("
+query IRI rowsort
 WITH x AS ( SELECT 1 x UNION SELECT - '199419' ) SELECT 1 FROM x AS WHERE x IN 
( SELECT min ( x ) OVER ( PARTITION BY x ) AS )
 ----
+1
+-199419.000
+1
+1
+1.000
+1
 
-query T nosort
+query I nosort
 WITH x AS ( SELECT 1 x UNION SELECT - '199419' ) SELECT 1 FROM x AS WHERE x IN 
( SELECT x FROM x , ( SELECT min ( x ) OVER ( PARTITION BY x ) ) AS )
 ----
 1
 1
 
-statment error GDK reported error: BATsubcross: more than one match
+statement error GDK reported error: BATsubcross: more than one match
 SELECT ( WITH x AS ( SELECT 1 x UNION SELECT - '199419' ) SELECT 1 FROM x AS 
WHERE x IN ( SELECT x FROM x , ( SELECT min ( x ) OVER ( PARTITION BY x ) ) AS 
) )
 ----
+
diff --git a/testing/sqllogictest.py b/testing/sqllogictest.py
--- a/testing/sqllogictest.py
+++ b/testing/sqllogictest.py
@@ -122,6 +122,9 @@ def prepare_copyfrom_stmt(stmt:[str]=[])
     tail='\n'.join(tail)
     return head + '\n' + tail, head, stmt
 
+def dq(s):
+    return s.replace('"', '""')
+
 class SQLLogic:
     def __init__(self, report=None, out=sys.stdout):
         self.dbh = None
@@ -224,40 +227,40 @@ class SQLLogic:
         self.crs.execute('select s.name, t.name, case when t.type in (select 
table_type_id from sys.table_types where table_type_name like \'%VIEW%\') then 
\'VIEW\' else \'TABLE\' end from sys.tables t, sys.schemas s where not t.system 
and t.schema_id = s.id')
         for row in self.crs.fetchall():
             try:
-                self.crs.execute('drop {} "{}"."{}" cascade'.format(row[2], 
row[0].replace('"', '""'), row[1].replace('"', '""')))
+                self.crs.execute(f'drop {row[2]} "{dq(row[0])}"."{dq(row[1])}" 
cascade')
             except pymonetdb.Error:
                 # perhaps already dropped because of the cascade
                 pass
         self.crs.execute('select s.name, f.name, ft.function_type_keyword from 
functions f, schemas s, function_types ft where not f.system and f.schema_id = 
s.id and f.type = ft.function_type_id')
         for row in self.crs.fetchall():
             try:
-                self.crs.execute('drop all {} "{}"."{}"'.format(row[2], 
row[0].replace('"', '""'), row[1].replace('"', '""')))
+                self.crs.execute(f'drop all {row[2]} 
"{dq(row[0])}"."{dq(row[1])}"')
             except pymonetdb.Error:
                 # perhaps already dropped
                 pass
         self.crs.execute('select s.name, q.name from sys.sequences q, schemas 
s where q.schema_id = s.id')
         for row in self.crs.fetchall():
             try:
-                self.crs.execute('drop sequence 
"{}"."{}"'.format(row[0].replace('"', '""'), row[1].replace('"', '""')))
+                self.crs.execute(f'drop sequence 
"{dq(row[0])}"."{dq(row[1])}"')
             except pymonetdb.Error:
                 # perhaps already dropped
                 pass
         self.crs.execute("select name from sys.users where name not in 
('monetdb', '.snapshot')")
         for row in self.crs.fetchall():
             try:
-                self.crs.execute('alter user "{}" SET SCHEMA 
"sys"'.format(row[0].replace('"', '""')))
+                self.crs.execute(f'alter user "{dq(row[0])}" SET SCHEMA "sys"')
             except pymonetdb.Error:
                 pass
         self.crs.execute('select name from sys.schemas where not system')
         for row in self.crs.fetchall():
             try:
-                self.crs.execute('drop schema "{}" 
cascade'.format(row[0].replace('"', '""')))
+                self.crs.execute(f'drop schema "{dq(row[0])}" cascade')
             except pymonetdb.Error:
                 pass
         self.crs.execute("select name from sys.users where name not in 
('monetdb', '.snapshot')")
         for row in self.crs.fetchall():
             try:
-                self.crs.execute('drop user "{}"'.format(row[0].replace('"', 
'""')))
+                self.crs.execute(f'drop user "{dq(row[0])}"')
             except pymonetdb.Error:
                 pass
 
@@ -322,9 +325,9 @@ class SQLLogic:
             if expectok:
                 if expected_rowcount is not None:
                     result.append('rowcount')
-                    result.append('{}'.format(affected_rowcount))
+                    result.append(f'{affected_rowcount}')
                     if expected_rowcount != affected_rowcount:
-                        self.query_error(err_stmt or statement, "statement was 
expecting to succeed with {} rows but received {} 
rows!".format(expected_rowcount, affected_rowcount))
+                        self.query_error(err_stmt or statement, f"statement 
was expecting to succeed with {expected_rowcount} rows but received 
{affected_rowcount} rows!")
                 return result
             msg = None
         self.query_error(err_stmt or statement, expectok and "statement was 
expected to succeed but didn't" or "statement was expected to fail but didn't", 
msg)
@@ -386,7 +389,7 @@ class SQLLogic:
         return ndata
 
     def raise_error(self, message):
-        print('Syntax error in test file, line {}:'.format(self.qline), 
file=self.out)
+        print(f'Syntax error in test file, line {self.qline}:', file=self.out)
         print(message, file=self.out)
         raise SQLLogicSyntaxError(message)
 
@@ -453,7 +456,7 @@ class SQLLogic:
                     rescols.append('T')
             rescols = ''.join(rescols)
             if len(crs.description) != len(columns):
-                self.query_error(query, 'received {} columns, expected {} 
columns'.format(len(crs.description), len(columns)), data=data)
+                self.query_error(query, f'received {len(crs.description)} 
columns, expected {len(columns)} columns', data=data)
                 columns = rescols
                 err = True
         else:
@@ -462,7 +465,7 @@ class SQLLogic:
             rescols = 'T'
         if sorting != 'python' and crs.rowcount * len(columns) != nresult:
             if not err:
-                self.query_error(query, 'received {} rows, expected {} 
rows'.format(crs.rowcount, nresult // len(columns)), data=data)
+                self.query_error(query, f'received {crs.rowcount} rows, 
expected {nresult // len(columns)} rows', data=data)
                 err = True
         if self.res is not None:
             for row in data:
@@ -556,7 +559,7 @@ class SQLLogic:
             if (len(ndata)):
                 ncols = len(ndata[0])
             if len(ndata)*ncols != nresult:
-                self.query_error(query, 'received {} rows, expected {} 
rows'.format(len(ndata)*ncols, nresult), data=data)
+                self.query_error(query, f'received {len(ndata)*ncols} rows, 
expected {nresult} rows', data=data)
                 err = True
             for row in ndata:
                 for col in row:
@@ -652,7 +655,7 @@ class SQLLogic:
         if hashlabel:
             result1.append(hashlabel)
         if len(result) > self.threshold:
-            result2 = ['{} values hashing to {}'.format(len(result), h if 
resdata is None else resh)]
+            result2 = [f'{len(result)} values hashing to {h if resdata is None 
else resh}']
         else:
             result2 = result
         return result1, result2
@@ -909,12 +912,13 @@ class SQLLogic:
                         self.writeline(line.rstrip())
                     self.writeline('----')
                     if hash:
-                        self.writeline('{} values hashing to {}'.format(
-                            nresult, hash))
+                        self.writeline(f'{nresult} values hashing to {hash}')
                     else:
                         for line in expected:
                             self.writeline(line)
                 self.writeline()
+            else:
+                self.raise_error(f'unrecognized command {words[0]}')
 
 if __name__ == '__main__':
     import argparse
@@ -962,7 +966,7 @@ if __name__ == '__main__':
             if not opts.nodrop:
                 sql.drop()
             if opts.verbose:
-                print('now testing {}'. format(test))
+                print(f'now testing {test}')
             try:
                 sql.parse(test, approve=opts.approve, verbose=opts.verbose,
                           defines=opts.define, run_until=opts.run_until)
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to