Changeset: 2dc8b3705b13 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2dc8b3705b13
Modified Files:
        clients/odbc/driver/SQLGetStmtAttr.c
        clients/odbc/driver/SQLPrepare.c
        clients/odbc/driver/SQLSetStmtAttr.c
        clients/odbc/samples/testgetinfo.c
        common/stream/stream.c
        sql/odbc/samples/Tests/testgetinfo.stable.err
        sql/odbc/samples/Tests/testgetinfo.stable.out
        sql/test/mapi/Tests/utf8test.stable.out
Branch: default
Log Message:

Merge with Apr2019 branch.


diffs (truncated from 328 to 300 lines):

diff --git a/clients/odbc/driver/SQLGetStmtAttr.c 
b/clients/odbc/driver/SQLGetStmtAttr.c
--- a/clients/odbc/driver/SQLGetStmtAttr.c
+++ b/clients/odbc/driver/SQLGetStmtAttr.c
@@ -164,7 +164,7 @@ MNDBGetStmtAttr(ODBCStmt *stmt,
 
                /* TODO: implement requested behavior */
 #ifdef SQL_ATTR_ASYNC_STMT_EVENT
-       case SQL_ATTR_ASYNC_EVENT:              /* SQLPOINTER */
+       case SQL_ATTR_ASYNC_STMT_EVENT:         /* SQLPOINTER */
 #endif
 #ifdef SQL_ATTR_ASYNC_STMT_PCALLBACK
        case SQL_ATTR_ASYNC_PCALLBACK:          /* SQLPOINTER */
diff --git a/clients/odbc/driver/SQLPrepare.c b/clients/odbc/driver/SQLPrepare.c
--- a/clients/odbc/driver/SQLPrepare.c
+++ b/clients/odbc/driver/SQLPrepare.c
@@ -285,7 +285,6 @@ MNDBPrepare(ODBCStmt *stmt,
                rec->sql_desc_literal_suffix = NULL;
                rec->sql_desc_octet_length_ptr = NULL;
                rec->sql_desc_schema_name = NULL;
-               rec->sql_desc_table_name = NULL;
                rec->sql_desc_updatable = SQL_ATTR_READONLY;
 
                /* this must come after other fields have been
diff --git a/clients/odbc/driver/SQLSetStmtAttr.c 
b/clients/odbc/driver/SQLSetStmtAttr.c
--- a/clients/odbc/driver/SQLSetStmtAttr.c
+++ b/clients/odbc/driver/SQLSetStmtAttr.c
@@ -277,7 +277,7 @@ MNDBSetStmtAttr(ODBCStmt *stmt,
                /* TODO: implement requested behavior */
        case SQL_ATTR_ASYNC_ENABLE:             /* SQLULEN */
 #ifdef SQL_ATTR_ASYNC_STMT_EVENT
-       case SQL_ATTR_ASYNC_EVENT:              /* SQLPOINTER */
+       case SQL_ATTR_ASYNC_STMT_EVENT:         /* SQLPOINTER */
 #endif
 #ifdef SQL_ATTR_ASYNC_STMT_PCALLBACK
        case SQL_ATTR_ASYNC_PCALLBACK:          /* SQLPOINTER */
diff --git a/clients/odbc/samples/testgetinfo.c 
b/clients/odbc/samples/testgetinfo.c
--- a/clients/odbc/samples/testgetinfo.c
+++ b/clients/odbc/samples/testgetinfo.c
@@ -13,6 +13,11 @@
 #include <stdlib.h>
 #include <stdint.h>
 #include <stdbool.h>
+
+/**** Define the ODBC Version this ODBC driver complies with ****/
+/* also see ODBCGlobal.h */
+#define ODBCVER 0x0352         /* Important: this must be defined before 
include of sqlext.h */
+
 #include <sql.h>
 #include <sqlext.h>
 
@@ -2255,7 +2260,7 @@ main(int argc, char **argv)
 
        ret = SQLGetInfo(dbc, SQL_MAX_CATALOG_NAME_LEN, &s, sizeof(s), 
&resultlen);
        if (check(ret, SQL_HANDLE_DBC, dbc, "SQLGetInfo 
SQL_MAX_CATALOG_NAME_LEN")) {
-               printf("SQL_MAX_CATALOG_NAME_LEN: %u\n", s);
+               printf("SQL_MAX_CATALOG_NAME_LEN: %u\n", (unsigned int) s);
        }
 
        ret = SQLGetInfo(dbc, SQL_MAX_CHAR_LITERAL_LEN, &i, sizeof(i), 
&resultlen);
@@ -2265,47 +2270,47 @@ main(int argc, char **argv)
 
        ret = SQLGetInfo(dbc, SQL_MAX_COLUMN_NAME_LEN, &s, sizeof(s), 
&resultlen);
        if (check(ret, SQL_HANDLE_DBC, dbc, "SQLGetInfo 
SQL_MAX_COLUMN_NAME_LEN")) {
-               printf("SQL_MAX_COLUMN_NAME_LEN: %u\n", s);
+               printf("SQL_MAX_COLUMN_NAME_LEN: %u\n", (unsigned int) s);
        }
 
        ret = SQLGetInfo(dbc, SQL_MAX_COLUMNS_IN_GROUP_BY, &s, sizeof(s), 
&resultlen);
        if (check(ret, SQL_HANDLE_DBC, dbc, "SQLGetInfo 
SQL_MAX_COLUMNS_IN_GROUP_BY")) {
-               printf("SQL_MAX_COLUMNS_IN_GROUP_BY: %u\n", s);
+               printf("SQL_MAX_COLUMNS_IN_GROUP_BY: %u\n", (unsigned int) s);
        }
 
        ret = SQLGetInfo(dbc, SQL_MAX_COLUMNS_IN_INDEX, &s, sizeof(s), 
&resultlen);
        if (check(ret, SQL_HANDLE_DBC, dbc, "SQLGetInfo 
SQL_MAX_COLUMNS_IN_INDEX")) {
-               printf("SQL_MAX_COLUMNS_IN_INDEX: %u\n", s);
+               printf("SQL_MAX_COLUMNS_IN_INDEX: %u\n", (unsigned int) s);
        }
 
        ret = SQLGetInfo(dbc, SQL_MAX_COLUMNS_IN_ORDER_BY, &s, sizeof(s), 
&resultlen);
        if (check(ret, SQL_HANDLE_DBC, dbc, "SQLGetInfo 
SQL_MAX_COLUMNS_IN_ORDER_BY")) {
-               printf("SQL_MAX_COLUMNS_IN_ORDER_BY: %u\n", s);
+               printf("SQL_MAX_COLUMNS_IN_ORDER_BY: %u\n", (unsigned int) s);
        }
 
        ret = SQLGetInfo(dbc, SQL_MAX_COLUMNS_IN_SELECT, &s, sizeof(s), 
&resultlen);
        if (check(ret, SQL_HANDLE_DBC, dbc, "SQLGetInfo 
SQL_MAX_COLUMNS_IN_SELECT")) {
-               printf("SQL_MAX_COLUMNS_IN_SELECT: %u\n", s);
+               printf("SQL_MAX_COLUMNS_IN_SELECT: %u\n", (unsigned int) s);
        }
 
        ret = SQLGetInfo(dbc, SQL_MAX_COLUMNS_IN_TABLE, &s, sizeof(s), 
&resultlen);
        if (check(ret, SQL_HANDLE_DBC, dbc, "SQLGetInfo 
SQL_MAX_COLUMNS_IN_TABLE")) {
-               printf("SQL_MAX_COLUMNS_IN_TABLE: %u\n", s);
+               printf("SQL_MAX_COLUMNS_IN_TABLE: %u\n", (unsigned int) s);
        }
 
        ret = SQLGetInfo(dbc, SQL_MAX_CURSOR_NAME_LEN, &s, sizeof(s), 
&resultlen);
        if (check(ret, SQL_HANDLE_DBC, dbc, "SQLGetInfo 
SQL_MAX_CURSOR_NAME_LEN")) {
-               printf("SQL_MAX_CURSOR_NAME_LEN: %u\n", s);
+               printf("SQL_MAX_CURSOR_NAME_LEN: %u\n", (unsigned int) s);
        }
 
        ret = SQLGetInfo(dbc, SQL_MAX_DRIVER_CONNECTIONS, &s, sizeof(s), 
&resultlen);
        if (check(ret, SQL_HANDLE_DBC, dbc, "SQLGetInfo 
SQL_MAX_DRIVER_CONNECTIONS")) {
-               printf("SQL_MAX_DRIVER_CONNECTIONS: %u\n", s);
+               printf("SQL_MAX_DRIVER_CONNECTIONS: %u\n", (unsigned int) s);
        }
 
        ret = SQLGetInfo(dbc, SQL_MAX_IDENTIFIER_LEN, &s, sizeof(s), 
&resultlen);
        if (check(ret, SQL_HANDLE_DBC, dbc, "SQLGetInfo 
SQL_MAX_IDENTIFIER_LEN")) {
-               printf("SQL_MAX_IDENTIFIER_LEN: %u\n", s);
+               printf("SQL_MAX_IDENTIFIER_LEN: %u\n", (unsigned int) s);
        }
 
        ret = SQLGetInfo(dbc, SQL_MAX_INDEX_SIZE, &i, sizeof(i), &resultlen);
@@ -2315,7 +2320,7 @@ main(int argc, char **argv)
 
        ret = SQLGetInfo(dbc, SQL_MAX_PROCEDURE_NAME_LEN, &s, sizeof(s), 
&resultlen);
        if (check(ret, SQL_HANDLE_DBC, dbc, "SQLGetInfo 
SQL_MAX_PROCEDURE_NAME_LEN")) {
-               printf("SQL_MAX_PROCEDURE_NAME_LEN: %u\n", s);
+               printf("SQL_MAX_PROCEDURE_NAME_LEN: %u\n", (unsigned int) s);
        }
 
        ret = SQLGetInfo(dbc, SQL_MAX_ROW_SIZE, &i, sizeof(i), &resultlen);
@@ -2330,7 +2335,7 @@ main(int argc, char **argv)
 
        ret = SQLGetInfo(dbc, SQL_MAX_SCHEMA_NAME_LEN, &s, sizeof(s), 
&resultlen);
        if (check(ret, SQL_HANDLE_DBC, dbc, "SQLGetInfo 
SQL_MAX_SCHEMA_NAME_LEN")) {
-               printf("SQL_MAX_SCHEMA_NAME_LEN: %u\n", s);
+               printf("SQL_MAX_SCHEMA_NAME_LEN: %u\n", (unsigned int) s);
        }
 
        ret = SQLGetInfo(dbc, SQL_MAX_STATEMENT_LEN, &i, sizeof(i), &resultlen);
@@ -2340,17 +2345,17 @@ main(int argc, char **argv)
 
        ret = SQLGetInfo(dbc, SQL_MAX_TABLE_NAME_LEN, &s, sizeof(s), 
&resultlen);
        if (check(ret, SQL_HANDLE_DBC, dbc, "SQLGetInfo 
SQL_MAX_TABLE_NAME_LEN")) {
-               printf("SQL_MAX_TABLE_NAME_LEN: %u\n", s);
+               printf("SQL_MAX_TABLE_NAME_LEN: %u\n", (unsigned int) s);
        }
 
        ret = SQLGetInfo(dbc, SQL_MAX_TABLES_IN_SELECT, &s, sizeof(s), 
&resultlen);
        if (check(ret, SQL_HANDLE_DBC, dbc, "SQLGetInfo 
SQL_MAX_TABLES_IN_SELECT")) {
-               printf("SQL_MAX_TABLES_IN_SELECT: %u\n", s);
+               printf("SQL_MAX_TABLES_IN_SELECT: %u\n", (unsigned int) s);
        }
 
        ret = SQLGetInfo(dbc, SQL_MAX_USER_NAME_LEN, &s, sizeof(s), &resultlen);
        if (check(ret, SQL_HANDLE_DBC, dbc, "SQLGetInfo 
SQL_MAX_USER_NAME_LEN")) {
-               printf("SQL_MAX_USER_NAME_LEN: %u\n", s);
+               printf("SQL_MAX_USER_NAME_LEN: %u\n", (unsigned int) s);
        }
 
        ret = SQLGetInfo(dbc, SQL_MULTIPLE_ACTIVE_TXN, str, sizeof(str), 
&resultlen);
diff --git a/common/stream/stream.c b/common/stream/stream.c
--- a/common/stream/stream.c
+++ b/common/stream/stream.c
@@ -2754,6 +2754,7 @@ struct console {
        DWORD len;
        DWORD rd;
        unsigned char i;
+       uint32_t ch;
        WCHAR wbuf[8192];
 };
 
@@ -2868,6 +2869,8 @@ console_write(stream *restrict s, const 
        struct console *c = s->stream_data.p;
        size_t n = elmsize * cnt;
        const unsigned char *p = buf;
+       uint32_t ch;
+       int x;
 
        if (c == NULL) {
                s->errnr = MNSTR_WRITE_ERROR;
@@ -2877,6 +2880,30 @@ console_write(stream *restrict s, const 
                return 0;
 
        c->len = 0;
+       if (c->i > 0) {
+               while (c->i > 0 && n > 0) {
+                       if ((*p & 0xC0) != 0x80) {
+                               s->errnr = MNSTR_WRITE_ERROR;
+                               return -1;
+                       }
+                       c->ch <<= 6;
+                       c->ch |= *p & 0x3F;
+                       p++;
+                       n--;
+                       c->i--;
+               }
+               if (c->i > 0) {
+                       ;
+               } else if (c->ch > 0x10FFFF || (c->ch & 0xFFFFF800) == 0xD800) {
+                       s->errnr = MNSTR_WRITE_ERROR;
+                       return -1;
+               } else if (c->ch > 0xFFFF) {
+                       c->wbuf[c->len++] = 0xD800 | ((c->ch >> 10) - (1 << 6));
+                       c->wbuf[c->len++] = 0xDC00 | (c->ch & 0x03FF);
+               } else {
+                       c->wbuf[c->len++] = c->ch;
+               }
+       }
        while (n > 0) {
                if (c->len >= 8191) {
                        if (!WriteConsoleW(c->h, c->wbuf, c->len, &c->rd, 
NULL)) {
@@ -2890,32 +2917,46 @@ console_write(stream *restrict s, const 
                                c->wbuf[c->len++] = L'\r';
                        c->wbuf[c->len++] = *p++;
                        n--;
-               } else if ((*p & 0xE0) == 0xC0 &&
-                          n >= 2 &&
-                          (p[1] & 0xC0) == 0x80) {
-                       c->wbuf[c->len++] = ((p[0] & 0x1F) << 6) | (p[1] & 
0x3F);
-                       p += 2;
-                       n -= 2;
-               } else if ((*p & 0xF0) == 0xE0 &&
-                          n >= 3 &&
-                          (p[1] & 0xC0) == 0x80 &&
-                          (p[2] & 0xC0) == 0x80) {
-                       c->wbuf[c->len++] = ((p[0] & 0x0F) << 12) | ((p[1] & 
0x3F) << 6) | (p[2] & 0x3F);
-                       p += 3;
-                       n -= 3;
-               } else if ((*p & 0xF8) == 0xF0 &&
-                          n >= 4 &&
-                          (p[1] & 0xC0) == 0x80 &&
-                          (p[2] & 0xC0) == 0x80 &&
-                          (p[3] & 0xC0) == 0x80) {
-                       c->wbuf[c->len++] = 0xD800 | ((((p[0] & 0x07) << 8) | 
((p[1] & 0x3F) << 2)) - 0x0040) | ((p[2] & 0x30) >> 4);
-                       c->wbuf[c->len++] = 0xDC00 | ((p[2] & 0x0F) << 6) | 
(p[3] & 0x3F);
-                       p += 4;
-                       n -= 4;
+                       x = 0;
+                       continue;
+               } else if ((*p & 0xE0) == 0xC0) {
+                       x = 1;
+                       ch = *p & 0x1F;
+               } else if ((*p & 0xF0) == 0xE0) {
+                       x = 2;
+                       ch = *p & 0x0F;
+               } else if ((*p & 0xF8) == 0xF0) {
+                       x = 3;
+                       ch = *p & 0x07;
                } else {
                        s->errnr = MNSTR_WRITE_ERROR;
                        return -1;
                }
+               p++;
+               n--;
+               while (x > 0 && n > 0) {
+                       if ((*p & 0xC0) != 0x80) {
+                               s->errnr = MNSTR_WRITE_ERROR;
+                               return -1;
+                       }
+                       ch <<= 6;
+                       ch |= *p & 0x3F;
+                       p++;
+                       n--;
+                       x--;
+               }
+               if (x > 0) {
+                       c->ch = ch;
+                       c->i = x;
+               } else if (ch > 0x10FFFF || (ch & 0xFFFFF800) == 0xD800) {
+                       s->errnr = MNSTR_WRITE_ERROR;
+                       return -1;
+               } else if (ch > 0xFFFF) {
+                       c->wbuf[c->len++] = 0xD800 | ((ch >> 10) - (1 << 6));
+                       c->wbuf[c->len++] = 0xDC00 | (ch & 0x03FF);
+               } else {
+                       c->wbuf[c->len++] = ch;
+               }
        }
        if (c->len > 0) {
                if (!WriteConsoleW(c->h, c->wbuf, c->len, &c->rd, NULL)) {
@@ -3219,7 +3260,7 @@ static ssize_t
 ic_write(stream *restrict s, const void *restrict buf, size_t elmsize, size_t 
cnt)
 {
        struct icstream *ic = (struct icstream *) s->stream_data.p;
-       ICONV_CONST char *inbuf = (ICONV_CONST char *) buf;
+       ICONV_CONST char *inbuf;
        size_t inbytesleft = elmsize * cnt;
        char *bf = NULL;
 
@@ -3240,6 +3281,7 @@ ic_write(stream *restrict s, const void 
                inbytesleft += ic->buflen;
                ic->buflen = 0;
        }
+       inbuf = (ICONV_CONST char *) buf;
        while (inbytesleft > 0) {
                char *outbuf = ic->buffer;
                size_t outbytesleft = sizeof(ic->buffer);
diff --git a/sql/odbc/samples/Tests/testgetinfo.stable.err 
b/sql/odbc/samples/Tests/testgetinfo.stable.err
--- a/sql/odbc/samples/Tests/testgetinfo.stable.err
+++ b/sql/odbc/samples/Tests/testgetinfo.stable.err
@@ -31,8 +31,6 @@ stderr of test 'testgetinfo` in director
 # 00:56:17 >  testgetinfo MonetDB-Test
 # 00:56:17 >  
 
-SQLGetInfo SQL_ASYNC_DBC_FUNCTIONS: Error: SQLstate HY096, Errnr 0, Message 
[MonetDB][ODBC Driver 11.33.0]Information type out of range
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to