Changeset: b45ce4b9ba25 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b45ce4b9ba25 Added Files: clients/odbc/samples/testStmtAttr.c Modified Files: MonetDB.spec clients/odbc/samples/Makefile.ag clients/odbc/samples/arraytest.c clients/odbc/samples/odbcsample1.c clients/odbc/samples/testgetinfo.c gdk/gdk.h monetdb5/modules/atoms/json.c monetdb5/modules/mal/mkey.c monetdb5/modules/mal/wlc.c sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_statement.c sql/backends/monet5/wlr.c sql/server/rel_planner.c sql/server/rel_semantic.c sql/server/rel_updates.c sql/server/sql_privileges.c sql/test/BugTracker-2018/Tests/sqlitelogictest-cast-null-add.Bug-6630.sql sql/test/BugTracker-2018/Tests/sqlitelogictest-cast-null-add.Bug-6630.stable.out Branch: default Log Message:
Merge with Mar2018 branch. diffs (truncated from 922 to 300 lines): diff --git a/MonetDB.spec b/MonetDB.spec --- a/MonetDB.spec +++ b/MonetDB.spec @@ -434,6 +434,7 @@ developer. %{_bindir}/smack01 %{_bindir}/shutdowntest %{_bindir}/testgetinfo +%{_bindir}/testStmtAttr %{_bindir}/malsample.pl %{_bindir}/sqlsample.php %{_bindir}/sqlsample.pl diff --git a/clients/odbc/samples/Makefile.ag b/clients/odbc/samples/Makefile.ag --- a/clients/odbc/samples/Makefile.ag +++ b/clients/odbc/samples/Makefile.ag @@ -11,6 +11,6 @@ INCLUDES = $(ODBC_INCS) BINS = { CONDINST = HAVE_TESTING DIR = libdir/monetdb/tests - SOURCES = odbcsample1.c testgetinfo.c arraytest.c + SOURCES = odbcsample1.c testgetinfo.c arraytest.c testStmtAttr.c LIBS = $(ODBC_LIBS) } diff --git a/clients/odbc/samples/arraytest.c b/clients/odbc/samples/arraytest.c --- a/clients/odbc/samples/arraytest.c +++ b/clients/odbc/samples/arraytest.c @@ -53,9 +53,6 @@ prerr(SQLSMALLINT tpe, SQLHANDLE hnd, co func, pref); break; case SQL_NO_DATA: - fprintf(stderr, - "%s: %s, no error message from driver\n", - func, pref); break; default: fprintf(stderr, @@ -76,7 +73,7 @@ check(SQLRETURN ret, SQLSMALLINT tpe, SQ break; case SQL_ERROR: prerr(tpe, hnd, func, "Error"); - exit(1); + break; case SQL_INVALID_HANDLE: fprintf(stderr, "%s: Error: invalid handle\n", func); exit(1); @@ -371,16 +368,16 @@ main(int argc, char **argv) } ret = SQLFreeHandle(SQL_HANDLE_STMT, stmt); - check(ret, SQL_HANDLE_STMT, stmt, "SQLFreeHandle 2"); + check(ret, SQL_HANDLE_STMT, stmt, "SQLFreeHandle (STMT)"); ret = SQLDisconnect(dbc); check(ret, SQL_HANDLE_DBC, dbc, "SQLDisconnect"); ret = SQLFreeHandle(SQL_HANDLE_DBC, dbc); - check(ret, SQL_HANDLE_DBC, dbc, "SQLFreeHandle 3"); + check(ret, SQL_HANDLE_DBC, dbc, "SQLFreeHandle (DBC)"); ret = SQLFreeHandle(SQL_HANDLE_ENV, env); - check(ret, SQL_HANDLE_STMT, stmt, "SQLFreeHandle 4"); + check(ret, SQL_HANDLE_ENV, env, "SQLFreeHandle (ENV)"); return 0; } diff --git a/clients/odbc/samples/odbcsample1.c b/clients/odbc/samples/odbcsample1.c --- a/clients/odbc/samples/odbcsample1.c +++ b/clients/odbc/samples/odbcsample1.c @@ -45,7 +45,6 @@ prerr(SQLSMALLINT tpe, SQLHANDLE hnd, co fprintf(stderr, "%s: %s, unexpected error from SQLGetDiagRec\n", func, pref); break; case SQL_NO_DATA: - fprintf(stderr, "%s: %s, no error message from driver\n", func, pref); break; default: fprintf(stderr, "%s: %s, weird return value from SQLGetDiagRec\n", func, pref); @@ -64,7 +63,7 @@ check(SQLRETURN ret, SQLSMALLINT tpe, SQ break; case SQL_ERROR: prerr(tpe, hnd, func, "Error"); - exit(1); + break; case SQL_INVALID_HANDLE: fprintf(stderr, "%s: Error: invalid handle\n", func); exit(1); @@ -111,7 +110,7 @@ main(int argc, char **argv) check(ret, SQL_HANDLE_ENV, env, "SQLSetEnvAttr"); ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc); - check(ret, SQL_HANDLE_ENV, env, "SQLAllocHandle 1"); + check(ret, SQL_HANDLE_ENV, env, "SQLAllocHandle (DBC)"); ret = SQLConnect(dbc, (SQLCHAR *) dsn, SQL_NTS, (SQLCHAR *) user, SQL_NTS, (SQLCHAR *) pass, SQL_NTS); check(ret, SQL_HANDLE_DBC, dbc, "SQLConnect"); @@ -121,8 +120,7 @@ main(int argc, char **argv) /* create a test table to be filled with values */ ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt); - - check(ret, SQL_HANDLE_DBC, dbc, "SQLAllocHandle 2"); + check(ret, SQL_HANDLE_DBC, dbc, "SQLAllocHandle (STMT 1)"); ret = SQLExecDirect(stmt, (SQLCHAR *) "CREATE TABLE odbcsampletest (\n" @@ -259,7 +257,7 @@ main(int argc, char **argv) /* now the handle for the odd entries */ ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt2); - check(ret, SQL_HANDLE_DBC, dbc, "SQLAllocHandle 3"); + check(ret, SQL_HANDLE_DBC, dbc, "SQLAllocHandle (STMT 2)"); ret = SQLPrepare(stmt2, (SQLCHAR *) "SELECT * FROM odbcsampletest WHERE 2*(i/2) <> i", SQL_NTS); check(ret, SQL_HANDLE_STMT, stmt2, "SQLPrepare 3"); @@ -304,23 +302,23 @@ main(int argc, char **argv) /* cleanup and disconnect */ ret = SQLFreeHandle(SQL_HANDLE_STMT, stmt2); - check(ret, SQL_HANDLE_STMT, stmt2, "SQLFreeHandle 1"); + check(ret, SQL_HANDLE_STMT, stmt2, "SQLFreeHandle (STMT 2)"); /* drop the test table */ ret = SQLExecDirect(stmt, (SQLCHAR *) "DROP TABLE odbcsampletest", SQL_NTS); check(ret, SQL_HANDLE_STMT, stmt, "SQLExecDirect 3"); ret = SQLFreeHandle(SQL_HANDLE_STMT, stmt); - check(ret, SQL_HANDLE_STMT, stmt, "SQLFreeHandle 2"); + check(ret, SQL_HANDLE_STMT, stmt, "SQLFreeHandle (STMT 1)"); ret = SQLDisconnect(dbc); check(ret, SQL_HANDLE_DBC, dbc, "SQLDisconnect"); ret = SQLFreeHandle(SQL_HANDLE_DBC, dbc); - check(ret, SQL_HANDLE_DBC, dbc, "SQLFreeHandle 3"); + check(ret, SQL_HANDLE_DBC, dbc, "SQLFreeHandle (DBC)"); ret = SQLFreeHandle(SQL_HANDLE_ENV, env); - check(ret, SQL_HANDLE_STMT, stmt, "SQLFreeHandle 4"); + check(ret, SQL_HANDLE_ENV, env, "SQLFreeHandle (ENV)"); return 0; } diff --git a/clients/odbc/samples/testStmtAttr.c b/clients/odbc/samples/testStmtAttr.c new file mode 100644 --- /dev/null +++ b/clients/odbc/samples/testStmtAttr.c @@ -0,0 +1,171 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 1997 - July 2008 CWI, August 2008 - 2018 MonetDB B.V. + */ + +#ifdef _MSC_VER +#include <WTypes.h> +#endif +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include <sql.h> +#include <sqlext.h> + +#ifdef _MSC_VER +#define snprintf _snprintf +#endif + +static void +prerr(SQLSMALLINT tpe, SQLHANDLE hnd, const char *func, const char *pref) +{ + SQLCHAR state[6]; + SQLINTEGER errnr; + SQLCHAR msg[256]; + SQLSMALLINT msglen; + SQLRETURN ret; + + ret = SQLGetDiagRec(tpe, hnd, 1, state, &errnr, msg, sizeof(msg), &msglen); + switch (ret) { + case SQL_SUCCESS_WITH_INFO: + if (msglen >= (signed int) sizeof(msg)) + fprintf(stderr, "(message truncated)\n"); + /* fall through */ + case SQL_SUCCESS: + fprintf(stderr, "%s: %s: SQLstate %s, Errnr %d, Message %s\n", func, pref, (char*)state, (int)errnr, (char*)msg); + break; + case SQL_INVALID_HANDLE: + fprintf(stderr, "%s: %s, invalid handle passed to error function\n", func, pref); + break; + case SQL_ERROR: + fprintf(stderr, "%s: %s, unexpected error from SQLGetDiagRec\n", func, pref); + break; + case SQL_NO_DATA: + break; + default: + fprintf(stderr, "%s: %s, weird return value from SQLGetDiagRec\n", func, pref); + break; + } +} + +static void +check(SQLRETURN ret, SQLSMALLINT tpe, SQLHANDLE hnd, const char *func) +{ + switch (ret) { + case SQL_SUCCESS: + break; + case SQL_SUCCESS_WITH_INFO: + prerr(tpe, hnd, func, "Info"); + break; + case SQL_ERROR: + prerr(tpe, hnd, func, "Error"); + break; + case SQL_INVALID_HANDLE: + fprintf(stderr, "%s: Error: invalid handle\n", func); + exit(1); + default: + fprintf(stderr, "%s: Unexpected return value\n", func); + break; + } +} + +static void +GetSetReGetStmtAttr(SQLHANDLE stmt, SQLINTEGER attribute, const char * attr_name, SQLULEN value) +{ + SQLRETURN ret; + SQLULEN ul; + SQLINTEGER resultlen; + + // first get the actual value from the server + ret = SQLGetStmtAttr(stmt, attribute, &ul, sizeof(ul), &resultlen); + fprintf(stderr, "Get %s: %lu\n", attr_name, (long unsigned int) ul); + check(ret, SQL_HANDLE_STMT, stmt, "SQLGetStmtAttr"); + + // next change the value on the server + ret = SQLSetStmtAttr(stmt, attribute, &value, 0); + fprintf(stderr, "Set %s: %lu\n", attr_name, (long unsigned int) value); + check(ret, SQL_HANDLE_STMT, stmt, "SQLSetStmtAttr"); + + // next re-get the value from the server, should be the same as the set value + ul = 123456789; + ret = SQLGetStmtAttr(stmt, attribute, &ul, sizeof(ul), &resultlen); + check(ret, SQL_HANDLE_STMT, stmt, "SQLGetStmtAttr"); + fprintf(stderr, "Get changed %s: %lu", attr_name, (long unsigned int) ul); + if (ul != value) + fprintf(stderr, " which is different from %lu !!", (long unsigned int) value); + fprintf(stderr, "\n\n"); +} + +int +main(int argc, char **argv) +{ + SQLRETURN ret; + SQLHANDLE env; + SQLHANDLE dbc; + SQLHANDLE stmt; + char *dsn = "MonetDB"; + char *user = "monetdb"; + char *pass = "monetdb"; + + if (argc > 1) + dsn = argv[1]; + if (argc > 2) + user = argv[2]; + if (argc > 3) + pass = argv[3]; + if (argc > 4 || *dsn == '-') { + fprintf(stderr, "Usage: %s [datasource [user [password]]]\n", argv[0]); + exit(1); + } + + ret = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &env); + if (ret != SQL_SUCCESS) { + fprintf(stderr, "Cannot allocate ODBC environment handle!\n"); + exit(1); + } + + ret = SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) (uintptr_t) SQL_OV_ODBC3, 0); + check(ret, SQL_HANDLE_ENV, env, "SQLSetEnvAttr (SQL_ATTR_ODBC_VERSION ODBC3)"); + + ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc); + check(ret, SQL_HANDLE_ENV, env, "SQLAllocHandle (DBC)"); + + ret = SQLConnect(dbc, (SQLCHAR *) dsn, SQL_NTS, (SQLCHAR *) user, SQL_NTS, (SQLCHAR *) pass, SQL_NTS); + check(ret, SQL_HANDLE_DBC, dbc, "SQLConnect"); + + ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt); + check(ret, SQL_HANDLE_DBC, dbc, "SQLAllocHandle (STMT)"); + + /* run actual tests */ + GetSetReGetStmtAttr(stmt, SQL_ATTR_QUERY_TIMEOUT, "SQL_ATTR_QUERY_TIMEOUT", -1); /* test also what happens with a negative value */ + GetSetReGetStmtAttr(stmt, SQL_ATTR_QUERY_TIMEOUT, "SQL_ATTR_QUERY_TIMEOUT", 0); + GetSetReGetStmtAttr(stmt, SQL_ATTR_QUERY_TIMEOUT, "SQL_ATTR_QUERY_TIMEOUT", 3600); + GetSetReGetStmtAttr(stmt, SQL_ATTR_QUERY_TIMEOUT, "SQL_ATTR_QUERY_TIMEOUT", 2147483647); + + GetSetReGetStmtAttr(stmt, SQL_ATTR_MAX_LENGTH, "SQL_ATTR_MAX_LENGTH", -2); /* test also what happens with a negative value */ + GetSetReGetStmtAttr(stmt, SQL_ATTR_MAX_LENGTH, "SQL_ATTR_MAX_LENGTH", 0); + GetSetReGetStmtAttr(stmt, SQL_ATTR_MAX_LENGTH, "SQL_ATTR_MAX_LENGTH", 65535); + GetSetReGetStmtAttr(stmt, SQL_ATTR_MAX_LENGTH, "SQL_ATTR_MAX_LENGTH", 2147483647); + + GetSetReGetStmtAttr(stmt, SQL_ATTR_MAX_ROWS, "SQL_ATTR_MAX_ROWS", -3); /* test also what happens with a negative value */ + GetSetReGetStmtAttr(stmt, SQL_ATTR_MAX_ROWS, "SQL_ATTR_MAX_ROWS", 0); + GetSetReGetStmtAttr(stmt, SQL_ATTR_MAX_ROWS, "SQL_ATTR_MAX_ROWS", 100000); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list