Changeset: 616bb4cd6210 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/616bb4cd6210
Branch: strimps_v3
Log Message:

Merge with default branch


diffs (truncated from 1343 to 300 lines):

diff --git a/ChangeLog.Mar2025 b/ChangeLog.Mar2025
--- a/ChangeLog.Mar2025
+++ b/ChangeLog.Mar2025
@@ -1,3 +1,9 @@
 # ChangeLog file for devel
 # This file is updated with Maddlog
 
+* Thu May  8 2025 Sjoerd Mullender <[email protected]>
+- It is now possible to specify an idle timeout using --set
+  idle_timeout=<seconds> (see mserver5 manual page) which gets triggered
+  if a connection to the server is idle (i.e. does not send any queries
+  to the server) while there is a SQL transaction active.
+
diff --git a/clients/mapilib/mapi_querytype.h b/clients/mapilib/mapi_querytype.h
--- a/clients/mapilib/mapi_querytype.h
+++ b/clients/mapilib/mapi_querytype.h
@@ -13,7 +13,7 @@
 #ifndef _MAPI_QUERYTYPE_H_INCLUDED
 #define _MAPI_QUERYTYPE_H_INCLUDED 1
 
-/* this definition is a straight copy from sql/include/sql_query.h */
+/* this definition is also used by the SQL layer */
 typedef enum {
        Q_PARSE = 0,
        Q_TABLE = 1,
diff --git a/clients/odbc/driver/ODBCConvert.c 
b/clients/odbc/driver/ODBCConvert.c
--- a/clients/odbc/driver/ODBCConvert.c
+++ b/clients/odbc/driver/ODBCConvert.c
@@ -1019,23 +1019,39 @@ ODBCFetch(ODBCStmt *stmt,
        if (type == SQL_C_DEFAULT)
                type = ODBCDefaultType(irdrec);
 
-       if (precision == UNAFFECTED ||
-           scale == UNAFFECTED ||
-           datetime_interval_precision == UNAFFECTED) {
+       if (precision == UNAFFECTED) {
+               precision = (ardrec) ? ardrec->sql_desc_precision : (type == 
SQL_C_NUMERIC) ? 10 : 6;
+       }
+       if (scale == UNAFFECTED) {
+               scale = (ardrec) ? ardrec->sql_desc_scale : 0;
+       }
+       if (datetime_interval_precision == UNAFFECTED) {
                if (ardrec) {
-                       if (precision == UNAFFECTED)
-                               precision = ardrec->sql_desc_precision;
-                       if (scale == UNAFFECTED)
-                               scale = ardrec->sql_desc_scale;
-                       if (datetime_interval_precision == UNAFFECTED)
-                               datetime_interval_precision = 
ardrec->sql_desc_datetime_interval_precision;
+                       datetime_interval_precision = 
ardrec->sql_desc_datetime_interval_precision;
                } else {
-                       if (precision == UNAFFECTED)
-                               precision = type == SQL_C_NUMERIC ? 10 : 6;
-                       if (scale == UNAFFECTED)
-                               scale = 0;
-                       if (datetime_interval_precision == UNAFFECTED)
+                       switch (type) {
+                       case SQL_C_INTERVAL_YEAR:
+                               datetime_interval_precision = 4;
+                               break;
+                       case SQL_C_INTERVAL_YEAR_TO_MONTH:
+                       case SQL_C_INTERVAL_MONTH:
+                               datetime_interval_precision = 6;
+                               break;
+                       case SQL_C_INTERVAL_DAY:
+                       case SQL_C_INTERVAL_DAY_TO_HOUR:
+                       case SQL_C_INTERVAL_DAY_TO_MINUTE:
+                       case SQL_C_INTERVAL_DAY_TO_SECOND:
+                       case SQL_C_INTERVAL_HOUR:
+                       case SQL_C_INTERVAL_HOUR_TO_MINUTE:
+                       case SQL_C_INTERVAL_HOUR_TO_SECOND:
+                       case SQL_C_INTERVAL_MINUTE:
+                       case SQL_C_INTERVAL_MINUTE_TO_SECOND:
+                       case SQL_C_INTERVAL_SECOND:
+                               datetime_interval_precision = 9;
+                               break;
+                       default:
                                datetime_interval_precision = 2;
+                       }
                }
        }
        i = datetime_interval_precision;
diff --git a/clients/odbc/tests/ODBCtester.c b/clients/odbc/tests/ODBCtester.c
--- a/clients/odbc/tests/ODBCtester.c
+++ b/clients/odbc/tests/ODBCtester.c
@@ -269,7 +269,7 @@ testGetDataGUID(SQLHANDLE stmt)
                        pos += snprintf(outp + pos, outp_len - pos, "NULL\n");
                else
                        pos += snprintf(outp + pos, outp_len - pos, 
"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
-                                       (unsigned int) guid_val.Data1, 
guid_val.Data2, guid_val.Data3,
+                               guid_val.Data1, guid_val.Data2, guid_val.Data3,
                                guid_val.Data4[0], guid_val.Data4[1], 
guid_val.Data4[2], guid_val.Data4[3], guid_val.Data4[4], guid_val.Data4[5], 
guid_val.Data4[6], guid_val.Data4[7]);
                check(ret, SQL_HANDLE_STMT, stmt, "SQLGetData(col)");
        }
@@ -297,6 +297,118 @@ testGetDataGUID(SQLHANDLE stmt)
        return ret;
 }
 
+static SQLRETURN
+testGetDataIntervalDay(SQLHANDLE stmt, int sqlquery)
+{
+       SQLRETURN ret;
+       SQLLEN RowCount = 0;
+       SWORD NumResultCols = 0;
+
+       size_t outp_len = 1800;
+       char * outp = malloc(outp_len);
+       size_t pos = 0;
+
+       char * sql1 = "select cast(NULL as interval day) as valnil, cast('99' 
as interval day) as val1, cast('-99' as interval day) as val2;";
+       char * sql2 = "select cast(NULL as interval day) as valnil, cast('101' 
as interval day) as val1, cast('-102' as interval day) as val2;";        /* 
Interval field overflow */
+       ret = SQLExecDirect(stmt, (sqlquery == 1) ? (SQLCHAR *) sql1 : (SQLCHAR 
*) sql2, SQL_NTS);
+       pos += snprintf(outp + pos, outp_len - pos, "SQLExecDirect query %d\n", 
sqlquery);
+       check(ret, SQL_HANDLE_STMT, stmt, "SQLExecDirect");
+
+       ret = SQLRowCount(stmt, &RowCount);
+       pos += snprintf(outp + pos, outp_len - pos, "SQLRowCount is " LLFMT 
"\n", (int64_t) RowCount);
+       check(ret, SQL_HANDLE_STMT, stmt, "SQLRowCount");
+
+       ret = SQLNumResultCols(stmt, &NumResultCols);
+       pos += snprintf(outp + pos, outp_len - pos, "SQLNumResultCols is %d\n", 
NumResultCols);
+       check(ret, SQL_HANDLE_STMT, stmt, "SQLNumResultCols");
+
+       ret = SQLFetch(stmt);
+       pos += snprintf(outp + pos, outp_len - pos, "SQLFetch\n");
+       check(ret, SQL_HANDLE_STMT, stmt, "SQLFetch");
+
+       for (SWORD col = 1; col <= NumResultCols; col++) {
+               char buf[99];
+               char str_val[42];
+               int int_val;
+               SQL_INTERVAL_STRUCT itv_val;
+               SQLLEN vallen = 0;
+               SQLLEN NumAttr = 0;
+
+               /* retrieve query result column metadata */
+               ret = SQLColAttribute(stmt, (UWORD)col, SQL_DESC_CONCISE_TYPE, 
(PTR)&buf, (SQLLEN)20, NULL, &NumAttr);
+               pos += snprintf(outp + pos, outp_len - pos, 
"SQLColAttribute(%d, SQL_DESC_CONCISE_TYPE) returns %d, NumAttr " LLFMT "\n", 
col, ret, (int64_t) NumAttr);
+               ret = SQLColAttribute(stmt, (UWORD)col, SQL_DESC_DISPLAY_SIZE, 
(PTR)&buf, (SQLLEN)20, NULL, &NumAttr);
+               pos += snprintf(outp + pos, outp_len - pos, 
"SQLColAttribute(%d, SQL_DESC_DISPLAY_SIZE) returns %d, NumAttr " LLFMT "\n", 
col, ret, (int64_t) NumAttr);
+
+               /* test SQLGetData(SQL_C_CHAR) */
+               ret = SQLGetData(stmt, (UWORD)col, (SWORD)SQL_C_CHAR, 
(PTR)&str_val, (SQLLEN)41, &vallen);
+               pos += snprintf(outp + pos, outp_len - pos, "SQLGetData(%d, 
SQL_C_CHAR, 41) returns %d, vallen " LLFMT ", str_val: '%s'\n",
+                       col, ret, (int64_t) vallen, (vallen == SQL_NULL_DATA) ? 
"NULL" : str_val);
+               check(ret, SQL_HANDLE_STMT, stmt, "SQLGetData(col) as str");
+
+               /* test SQLGetData(SQL_C_SLONG) */
+               ret = SQLGetData(stmt, (UWORD)col, (SWORD)SQL_C_SLONG, 
(PTR)&int_val, (SQLLEN)4, &vallen);
+               pos += snprintf(outp + pos, outp_len - pos, "SQLGetData(%d, 
SQL_C_SLONG) returns %d, vallen " LLFMT ", int_val: ", col, ret, (int64_t) 
vallen);
+               if (vallen == SQL_NULL_DATA)
+                       pos += snprintf(outp + pos, outp_len - pos, "NULL\n");
+               else
+                       pos += snprintf(outp + pos, outp_len - pos, "%d\n", 
int_val);
+               check(ret, SQL_HANDLE_STMT, stmt, "SQLGetData(col) as int");    
/* SQLstate 07006 Restricted data type attribute violation */
+
+               /* test SQLGetData(SQL_C_INTERVAL_DAY) */
+               ret = SQLGetData(stmt, (UWORD)col, (SWORD)SQL_C_INTERVAL_DAY, 
(PTR)&itv_val, (SQLLEN)sizeof(SQL_INTERVAL_STRUCT), &vallen);
+               pos += snprintf(outp + pos, outp_len - pos, "SQLGetData(%d, 
SQL_C_INTERVAL_DAY) returns %d, vallen " LLFMT ", itv_day_val: ", col, ret, 
(int64_t) vallen);
+               if (vallen == SQL_NULL_DATA)
+                       pos += snprintf(outp + pos, outp_len - pos, "NULL\n");
+               else
+                       pos += snprintf(outp + pos, outp_len - pos, "%d (type 
%d, sign %d)\n", itv_val.intval.day_second.day, itv_val.interval_type, 
itv_val.interval_sign);
+               check(ret, SQL_HANDLE_STMT, stmt, "SQLGetData(col) as int");
+       }
+
+       compareResult("testGetDataIntervalDay()", outp,
+               (sqlquery == 1)
+               ?       "SQLExecDirect query 1\nSQLRowCount is 
1\nSQLNumResultCols is 3\nSQLFetch\n"
+                       "SQLColAttribute(1, SQL_DESC_CONCISE_TYPE) returns 0, 
NumAttr 103\n"
+                       "SQLColAttribute(1, SQL_DESC_DISPLAY_SIZE) returns 0, 
NumAttr 21\n"
+                       "SQLGetData(1, SQL_C_CHAR, 41) returns 0, vallen -1, 
str_val: 'NULL'\n"
+                       "SQLGetData(1, SQL_C_SLONG) returns 0, vallen -1, 
int_val: NULL\n"
+                       "SQLGetData(1, SQL_C_INTERVAL_DAY) returns 0, vallen 
-1, itv_day_val: NULL\n"
+                       "SQLColAttribute(2, SQL_DESC_CONCISE_TYPE) returns 0, 
NumAttr 103\n"
+                       "SQLColAttribute(2, SQL_DESC_DISPLAY_SIZE) returns 0, 
NumAttr 21\n"
+                       "SQLGetData(2, SQL_C_CHAR, 41) returns 0, vallen 17, 
str_val: 'INTERVAL '99' DAY'\n"
+                       "SQLGetData(2, SQL_C_SLONG) returns 0, vallen 4, 
int_val: 99\n" /* SQLstate 07006 Restricted data type attribute violation */
+                       "SQLGetData(2, SQL_C_INTERVAL_DAY) returns 0, vallen 
28, itv_day_val: 99 (type 3, sign 0)\n"
+                       "SQLColAttribute(3, SQL_DESC_CONCISE_TYPE) returns 0, 
NumAttr 103\n"
+                       "SQLColAttribute(3, SQL_DESC_DISPLAY_SIZE) returns 0, 
NumAttr 21\n"
+                       "SQLGetData(3, SQL_C_CHAR, 41) returns 0, vallen 18, 
str_val: 'INTERVAL -'99' DAY'\n"
+                       "SQLGetData(3, SQL_C_SLONG) returns 0, vallen 4, 
int_val: -99\n"        /* SQLstate 07006 Restricted data type attribute 
violation */
+                       "SQLGetData(3, SQL_C_INTERVAL_DAY) returns 0, vallen 
28, itv_day_val: 99 (type 3, sign 1)\n"
+               :       "SQLExecDirect query 2\nSQLRowCount is 
1\nSQLNumResultCols is 3\nSQLFetch\n"
+                       "SQLColAttribute(1, SQL_DESC_CONCISE_TYPE) returns 0, 
NumAttr 103\n"
+                       "SQLColAttribute(1, SQL_DESC_DISPLAY_SIZE) returns 0, 
NumAttr 21\n"
+                       "SQLGetData(1, SQL_C_CHAR, 41) returns 0, vallen -1, 
str_val: 'NULL'\n"
+                       "SQLGetData(1, SQL_C_SLONG) returns 0, vallen -1, 
int_val: NULL\n"
+                       "SQLGetData(1, SQL_C_INTERVAL_DAY) returns 0, vallen 
-1, itv_day_val: NULL\n"
+                       "SQLColAttribute(2, SQL_DESC_CONCISE_TYPE) returns 0, 
NumAttr 103\n"
+                       "SQLColAttribute(2, SQL_DESC_DISPLAY_SIZE) returns 0, 
NumAttr 21\n"
+                       "SQLGetData(2, SQL_C_CHAR, 41) returns 0, vallen 18, 
str_val: 'INTERVAL '101' DAY'\n"
+                       "SQLGetData(2, SQL_C_SLONG) returns 0, vallen 4, 
int_val: 101\n"        /* SQLstate 07006 Restricted data type attribute 
violation */
+                       "SQLGetData(2, SQL_C_INTERVAL_DAY) returns 0, vallen 
28, itv_day_val: 101 (type 3, sign 0)\n"   /* SQLstate 22015 Interval field 
overflow */
+                       "SQLColAttribute(3, SQL_DESC_CONCISE_TYPE) returns 0, 
NumAttr 103\n"
+                       "SQLColAttribute(3, SQL_DESC_DISPLAY_SIZE) returns 0, 
NumAttr 21\n"
+                       "SQLGetData(3, SQL_C_CHAR, 41) returns 0, vallen 19, 
str_val: 'INTERVAL -'102' DAY'\n"
+                       "SQLGetData(3, SQL_C_SLONG) returns 0, vallen 4, 
int_val: -102\n"       /* SQLstate 07006 Restricted data type attribute 
violation */
+                       "SQLGetData(3, SQL_C_INTERVAL_DAY) returns 0, vallen 
28, itv_day_val: 102 (type 3, sign 1)\n"   /* SQLstate 22015 Interval field 
overflow */
+               );
+
+       ret = SQLCloseCursor(stmt);
+       check(ret, SQL_HANDLE_STMT, stmt, "SQLCloseCursor");
+
+       /* cleanup */
+       free(outp);
+       return ret;
+}
+
 int
 main(int argc, char **argv)
 {
@@ -351,6 +463,12 @@ main(int argc, char **argv)
        ret = testGetDataGUID(stmt);
        check(ret, SQL_HANDLE_STMT, stmt, "testGetDataGUID(STMT)");
 
+       ret = testGetDataIntervalDay(stmt, 1);
+       check(ret, SQL_HANDLE_STMT, stmt, "testGetDataIntervalDay(STMT, 99, 
-99)");
+
+       ret = testGetDataIntervalDay(stmt, 2);
+       check(ret, SQL_HANDLE_STMT, stmt, "testGetDataIntervalDay(STMT, 101, 
-102)");
+
        /* cleanup */
        ret = SQLFreeHandle(SQL_HANDLE_STMT, stmt);
        check(ret, SQL_HANDLE_STMT, stmt, "SQLFreeHandle (STMT)");
diff --git a/common/utils/msabaoth.c b/common/utils/msabaoth.c
--- a/common/utils/msabaoth.c
+++ b/common/utils/msabaoth.c
@@ -292,7 +292,7 @@ msab_marchScenario(const char *lang)
        if ((tmp = getDBPath(pathbuf, sizeof(pathbuf), SCENARIOFILE)) != NULL)
                return(tmp);
 
-       if ((f = MT_fopen(pathbuf, "a+")) != NULL) {
+       if ((f = MT_fopen(pathbuf, "r")) != NULL) {
                if ((len = fread(buf, 1, 255, f)) > 0) {
                        char *p;
 
@@ -308,6 +308,9 @@ msab_marchScenario(const char *lang)
                                tmp = p;
                        }
                }
+               fclose(f);
+       }
+       if ((f = MT_fopen(pathbuf, "a")) != NULL) {
                /* append to the file */
                fprintf(f, "%s\n", lang);
                (void)fflush(f);
@@ -336,10 +339,10 @@ msab_retreatScenario(const char *lang)
        if ((tmp = getDBPath(pathbuf, sizeof(pathbuf), SCENARIOFILE)) != NULL)
                return(tmp);
 
-       if ((f = MT_fopen(pathbuf, "a+")) != NULL) {
+       if ((f = MT_fopen(pathbuf, "r")) != NULL) {
                if ((len = fread(buf, 1, 255, f)) > 0) {
                        char *p;
-                       char written = 0;
+                       bool written = false;
 
                        buf[len] = '\0';
                        tmp = buf;
@@ -348,14 +351,14 @@ msab_retreatScenario(const char *lang)
                                *p = '\0';
                                if (strcmp(tmp, lang) == 0) {
                                        memmove(tmp, p + 1, strlen(p + 1) + 1);
-                                       written = 1;
+                                       written = true;
                                } else {
                                        *p = '\n';
                                        tmp = p+1;
                                }
                        }
-                       if (written != 0) {
-                               rewind(f);
+                       fclose(f);
+                       if (written && (f = fopen(pathbuf, "w")) != NULL) {
                                len = strlen(buf) + 1;
                                if (fwrite(buf, 1, len, f) < len) {
                                        snprintf(buf, sizeof(buf), "failed to 
write: %s (%s)",
@@ -366,8 +369,11 @@ msab_retreatScenario(const char *lang)
                                fflush(f);
                                fclose(f);
                                return(NULL);
+                       } else if (written) {
+                               snprintf(buf, sizeof(buf), "failed to open 
file: %s (%s)",
+                                                strerror(errno), pathbuf);
+                               return strdup(buf);
                        }
-                       (void)fclose(f);
                        (void) MT_remove(pathbuf);
                        return(NULL);
                } else {
@@ -383,9 +389,7 @@ msab_retreatScenario(const char *lang)
                        return(NULL);
                }
        }
-       snprintf(buf, sizeof(buf), "failed to open file: %s (%s)",
-                        strerror(errno), pathbuf);
-       return(strdup(buf));
+       return(NULL);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to