Changeset: 7ecafb238d3b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7ecafb238d3b
Modified Files:
        clients/odbc/driver/SQLGetTypeInfo.c
        clients/odbc/tests/ODBCmetadata.c
Branch: default
Log Message:

Enlarge the query buffer size used by SQLGetTypeInfo to prevent crash.
It appears that after calling SQLGetTypeInfo(stmt, SQL_HUGEINT) the inclusion 
of hugeint in the result is activated, and when next SQLGetTypeInfo(stmt, 
SQL_ALL_TYPES) is called it suddenly appears in the result, but the query 
buffer was too small, so resulted in a crash.
Now the query buffer size is enlarged and no more crash occurs. Added this 
scenario to test program ODBCmetadata.c


diffs (76 lines):

diff --git a/clients/odbc/driver/SQLGetTypeInfo.c 
b/clients/odbc/driver/SQLGetTypeInfo.c
--- a/clients/odbc/driver/SQLGetTypeInfo.c
+++ b/clients/odbc/driver/SQLGetTypeInfo.c
@@ -1033,7 +1033,7 @@ MNDBGetTypeInfo(ODBCStmt *stmt,
 {
        const struct types *t;
        int i;
-       char query[4096];
+       char query[4352];
 
        switch (DataType) {
        case SQL_ALL_TYPES:
diff --git a/clients/odbc/tests/ODBCmetadata.c 
b/clients/odbc/tests/ODBCmetadata.c
--- a/clients/odbc/tests/ODBCmetadata.c
+++ b/clients/odbc/tests/ODBCmetadata.c
@@ -1276,6 +1276,60 @@ main(int argc, char **argv)
                "WVARCHAR(128)  SMALLINT        INTEGER WVARCHAR(128)   
WVARCHAR(128)   WVARCHAR(128)   SMALLINT        SMALLINT        SMALLINT        
SMALLINT        SMALLINT        SMALLINT        WVARCHAR(128)   SMALLINT        
SMALLINT        SMALLINT        SMALLINT        INTEGER SMALLINT\n"
                "hugeint        16384   38      NULL    NULL    NULL    1       
0       2       0       0       0       NULL    0       0       16384   -1      
10      -1\n");
 
+       /* strangely when we repeat SQLGetTypeInfo(stmt, SQL_ALL_TYPES) now 
after calling SQLGetTypeInfo(stmt, SQL_HUGEINT), it suddenly does include 
hugeint in the result! */
+       ret = SQLGetTypeInfo(stmt, SQL_ALL_TYPES);
+       compareResult(stmt, ret, "SQLGetTypeInfo(stmt, SQL_ALL_TYPES)",
+               "Resultset with 19 columns\n"
+               "Resultset with 45 rows\n"
+               "TYPE_NAME      DATA_TYPE       COLUMN_SIZE     LITERAL_PREFIX  
LITERAL_SUFFIX  CREATE_PARAMS   NULLABLE        CASE_SENSITIVE  SEARCHABLE      
UNSIGNED_ATTRIBUTE      FIXED_PREC_SCALE        AUTO_UNIQUE_VALUE       
LOCAL_TYPE_NAME MINIMUM_SCALE   MAXIMUM_SCALE   SQL_DATA_TYPE   
SQL_DATETIME_SUB        NUM_PREC_RADIX  INTERVAL_PRECISION\n"
+               "WCHAR(128)     SMALLINT        INTEGER WCHAR(11)       
WCHAR(1)        WCHAR(15)       SMALLINT        SMALLINT        SMALLINT        
SMALLINT        SMALLINT        SMALLINT        WCHAR(16)       SMALLINT        
SMALLINT        SMALLINT        SMALLINT        INTEGER SMALLINT\n"
+               "uuid   -11     36      uuid '  '       NULL    1       0       
2       -1      0       -1      uuid    -1      -1      -11     -1      -1      
-1\n"
+               "character large object -10     1000000 '       '       NULL    
1       1       3       -1      0       0       NULL    -1      -1      -10     
-1      -1      -1\n"
+               "json   -10     1000000 json '  '       NULL    1       1       
3       -1      0       0       json    -1      -1      -10     -1      -1      
-1\n"
+               "url    -10     1000000 url '   '       NULL    1       1       
3       -1      0       0       url     -1      -1      -10     -1      -1      
-1\n"
+               "varchar        -9      1000000 '       '       length  1       
1       3       -1      0       -1      NULL    -1      -1      -9      -1      
-1      -1\n"
+               "character      -8      1000000 '       '       length  1       
1       3       -1      0       0       NULL    -1      -1      -8      -1      
-1      -1\n"
+               "char   -8      1000000 '       '       length  1       1       
3       -1      0       0       NULL    -1      -1      -8      -1      -1      
-1\n"
+               "boolean        -7      1       NULL    NULL    NULL    1       
0       2       1       1       0       boolean -1      -1      -7      -1      
-1      -1\n"
+               "tinyint        -6      3       NULL    NULL    NULL    1       
0       2       0       0       0       NULL    0       0       -6      -1      
10      -1\n"
+               "bigint -5      19      NULL    NULL    NULL    1       0       
2       0       0       0       NULL    0       0       -5      -1      10      
-1\n"
+               "bigserial      -5      19      NULL    NULL    NULL    0       
0       2       0       0       1       bigserial       0       0       -5      
-1      10      -1\n"
+               "binary large object    -4      1000000 x'      '       NULL    
1       1       3       -1      0       0       NULL    -1      -1      -4      
-1      -1      -1\n"
+               "binary large object    -3      1000000 x'      '       length  
1       1       3       -1      0       0       blob(max_length)        -1      
-1      -3      -1      -1      -1\n"
+               "character large object -1      1000000 '       '       NULL    
1       1       3       -1      0       0       NULL    -1      -1      -1      
-1      -1      -1\n"
+               "char   1       1000000 '       '       length  1       1       
3       -1      0       0       NULL    -1      -1      1       -1      -1      
-1\n"
+               "numeric        2       19      NULL    NULL    precision,scale 
1       0       2       0       0       0       NULL    0       18      2       
-1      10      -1\n"
+               "decimal        3       19      NULL    NULL    precision,scale 
1       0       2       0       0       0       NULL    0       18      3       
-1      10      -1\n"
+               "integer        4       10      NULL    NULL    NULL    1       
0       2       0       0       0       NULL    0       0       4       -1      
10      -1\n"
+               "int    4       10      NULL    NULL    NULL    1       0       
2       0       0       0       NULL    0       0       4       -1      10      
-1\n"
+               "mediumint      4       10      NULL    NULL    NULL    1       
0       2       0       0       0       int     0       0       4       -1      
10      -1\n"
+               "serial 4       10      NULL    NULL    NULL    0       0       
2       0       0       1       serial  0       0       4       -1      10      
-1\n"
+               "smallint       5       5       NULL    NULL    NULL    1       
0       2       0       0       0       NULL    0       0       5       -1      
10      -1\n"
+               "float  6       53      NULL    NULL    NULL    1       0       
2       0       0       0       NULL    0       0       6       -1      2       
-1\n"
+               "real   7       24      NULL    NULL    NULL    1       0       
2       0       0       0       NULL    0       0       7       -1      2       
-1\n"
+               "double 8       53      NULL    NULL    NULL    1       0       
2       0       0       0       NULL    0       0       8       -1      2       
-1\n"
+               "varchar        12      1000000 '       '       length  1       
1       3       -1      0       -1      NULL    -1      -1      12      -1      
-1      -1\n"
+               "date   91      10      date '  '       NULL    1       0       
2       -1      0       -1      NULL    -1      -1      9       1       -1      
-1\n"
+               "time   92      8       time '  '       NULL    1       0       
2       -1      0       -1      NULL    0       0       9       2       -1      
-1\n"
+               "time(precision)        92      15      time '  '       
precision       1       0       2       -1      0       -1      NULL    0       
6       9       2       -1      -1\n"
+               "timestamp      93      19      timestamp '     '       NULL    
1       0       2       -1      0       -1      NULL    0       0       9       
3       -1      -1\n"
+               "timestamp(precision)   93      26      timestamp '     '       
precision       1       0       2       -1      0       -1      NULL    0       
6       9       3       -1      -1\n"
+               "interval year  101     9       '       '       NULL    1       
0       2       -1      0       -1      NULL    0       0       10      1       
-1      9\n"
+               "interval month 102     10      '       '       NULL    1       
0       2       -1      0       -1      NULL    0       0       10      2       
-1      10\n"
+               "interval day   103     5       '       '       NULL    1       
0       2       -1      0       -1      NULL    0       0       10      3       
-1      5\n"
+               "interval hour  104     6       '       '       NULL    1       
0       2       -1      0       -1      NULL    0       0       10      4       
-1      6\n"
+               "interval minute        105     8       '       '       NULL    
1       0       2       -1      0       -1      NULL    0       0       10      
5       -1      8\n"
+               "interval second        106     10      '       '       
precision       1       0       2       -1      0       -1      NULL    0       
0       10      6       -1      10\n"
+               "interval year to month 107     12      '       '       NULL    
1       0       2       -1      0       -1      NULL    0       0       10      
7       -1      9\n"
+               "interval day to hour   108     8       '       '       NULL    
1       0       2       -1      0       -1      NULL    0       0       10      
8       -1      5\n"
+               "interval day to minute 109     11      '       '       NULL    
1       0       2       -1      0       -1      NULL    0       0       10      
9       -1      5\n"
+               "interval day to second 110     14      '       '       
precision       1       0       2       -1      0       -1      NULL    0       
0       10      10      -1      5\n"
+               "interval hour to minute        111     9       '       '       
NULL    1       0       2       -1      0       -1      NULL    0       0       
10      11      -1      6\n"
+               "interval hour to second        112     12      '       '       
precision       1       0       2       -1      0       -1      NULL    0       
0       10      12      -1      6\n"
+               "interval minute to second      113     13      '       '       
precision       1       0       2       -1      0       -1      NULL    0       
0       10      13      -1      10\n"
+               "hugeint        16384   38      NULL    NULL    NULL    1       
0       2       0       0       0       NULL    0       0       16384   -1      
10      -1\n");
+
+
        // cleanup
        ret = SQLExecDirect(stmt, (SQLCHAR *)
                "DROP INDEX odbctst.pk_uc_i;\n"
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to