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