Changeset: 8a98fb9e69bb for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8a98fb9e69bb
Modified Files:
monetdb5/mal/mal_function.c
monetdb5/optimizer/opt_partition.mx
Branch: default
Log Message:
Merge with default
diffs (truncated from 345 to 300 lines):
diff --git a/clients/odbc/driver/ODBCDesc.c b/clients/odbc/driver/ODBCDesc.c
--- a/clients/odbc/driver/ODBCDesc.c
+++ b/clients/odbc/driver/ODBCDesc.c
@@ -233,12 +233,16 @@ addODBCDescRec(ODBCDesc *desc, SQLSMALLI
/* Return either the column size or display size for a column or parameter. */
SQLULEN
-ODBCLength(ODBCDescRec *rec, int display)
+ODBCLength(ODBCDescRec *rec, int lengthtype)
{
switch (rec->sql_desc_concise_type) {
case SQL_CHAR:
case SQL_VARCHAR:
case SQL_LONGVARCHAR:
+ if (lengthtype == SQL_DESC_OCTET_LENGTH)
+ return rec->sql_desc_length * 6;
+ else
+ return rec->sql_desc_length;
case SQL_WCHAR:
case SQL_WVARCHAR:
case SQL_WLONGVARCHAR:
@@ -248,34 +252,96 @@ ODBCLength(ODBCDescRec *rec, int display
return rec->sql_desc_length;
case SQL_DECIMAL:
case SQL_NUMERIC:
- return rec->sql_desc_length + (display ? 2 : 0);
+ return rec->sql_desc_length + (lengthtype == SQL_DESC_LENGTH ?
0 : 2);
case SQL_BIT:
return 1;
case SQL_TINYINT:
- return 3 + (display && !rec->sql_desc_unsigned);
+ switch (lengthtype) {
+ case SQL_DESC_LENGTH:
+ return 3;
+ case SQL_DESC_DISPLAY_SIZE:
+ return 4;
+ case SQL_DESC_OCTET_LENGTH:
+ return 1;
+ }
+ break;
case SQL_SMALLINT:
- return 5 + (display && !rec->sql_desc_unsigned);
+ switch (lengthtype) {
+ case SQL_DESC_LENGTH:
+ return 5;
+ case SQL_DESC_DISPLAY_SIZE:
+ return 5 + !rec->sql_desc_unsigned;
+ case SQL_DESC_OCTET_LENGTH:
+ return 2;
+ }
+ break;
case SQL_INTEGER:
- return 10 + (display && !rec->sql_desc_unsigned);
+ switch (lengthtype) {
+ case SQL_DESC_LENGTH:
+ return 10;
+ case SQL_DESC_DISPLAY_SIZE:
+ return 10 + !rec->sql_desc_unsigned;
+ case SQL_DESC_OCTET_LENGTH:
+ return 4;
+ }
+ break;
case SQL_BIGINT:
- return display || rec->sql_desc_unsigned ? 20 : 19;
+ switch (lengthtype) {
+ case SQL_DESC_LENGTH:
+ return 19 + (rec->sql_desc_unsigned != 0);
+ case SQL_DESC_DISPLAY_SIZE:
+ return 20;
+ case SQL_DESC_OCTET_LENGTH:
+ return 20;
+ }
+ break;
case SQL_REAL:
- /* display: sign, 7 digits, decimal point, E, sign, 2 digits */
- return display ? 14 : 7;
+ switch (lengthtype) {
+ case SQL_DESC_LENGTH:
+ return 7;
+ case SQL_DESC_DISPLAY_SIZE:
+ /* sign, 7 digits, decimal point, E, sign, 2 digits */
+ return 14;
+ case SQL_DESC_OCTET_LENGTH:
+ return 4;
+ }
+ break;
case SQL_FLOAT:
case SQL_DOUBLE:
- /* display: sign, 15 digits, decimal point, E, sign, 3 digits */
- return display ? 24 : 15;
+ switch (lengthtype) {
+ case SQL_DESC_LENGTH:
+ return 15;
+ case SQL_DESC_DISPLAY_SIZE:
+ /* sign, 15 digits, decimal point, E, sign, 3 digits */
+ return 24;
+ case SQL_DESC_OCTET_LENGTH:
+ return 8;
+ }
+ break;
case SQL_TYPE_DATE:
- /* strlen("yyyy-mm-dd") */
- return 10;
+ if (lengthtype == SQL_DESC_OCTET_LENGTH)
+ return 6;
+ else {
+ /* strlen("yyyy-mm-dd") */
+ return 10;
+ }
case SQL_TYPE_TIME:
- /* strlen("hh:mm:ss.fff") */
- return 12;
+ if (lengthtype == SQL_DESC_OCTET_LENGTH)
+ return 6;
+ else {
+ /* strlen("hh:mm:ss.fff") */
+ return 12;
+ }
case SQL_TYPE_TIMESTAMP:
- /* strlen("yyyy-mm-dd hh:mm:ss.fff") */
- return 23;
+ if (lengthtype == SQL_DESC_OCTET_LENGTH)
+ return 16;
+ else {
+ /* strlen("yyyy-mm-dd hh:mm:ss.fff") */
+ return 23;
+ }
case SQL_INTERVAL_SECOND:
+ if (lengthtype == SQL_DESC_OCTET_LENGTH)
+ return 34;
/* strlen("INTERVAL -'sss[.fff]' SECOND(p,q)") */
return 11 + 13 +
(rec->sql_desc_datetime_interval_precision > 10) +
@@ -285,6 +351,8 @@ ODBCLength(ODBCDescRec *rec, int display
rec->sql_desc_precision + 1 :
0);
case SQL_INTERVAL_DAY_TO_SECOND:
+ if (lengthtype == SQL_DESC_OCTET_LENGTH)
+ return 34;
/* strlen("INTERVAL -'ddd hh:mm:ss[.fff]' DAY(p) TO SECOND(q)")
*/
return 11 + 21 +
(rec->sql_desc_datetime_interval_precision > 10) +
@@ -295,6 +363,8 @@ ODBCLength(ODBCDescRec *rec, int display
rec->sql_desc_precision + 1 :
0);
case SQL_INTERVAL_HOUR_TO_SECOND:
+ if (lengthtype == SQL_DESC_OCTET_LENGTH)
+ return 34;
/* strlen("INTERVAL -'hhh:mm:ss[.fff]' HOUR(p) TO SECOND(q)") */
return 11 + 22 +
(rec->sql_desc_datetime_interval_precision > 10) +
@@ -305,6 +375,8 @@ ODBCLength(ODBCDescRec *rec, int display
rec->sql_desc_precision + 1 :
0);
case SQL_INTERVAL_MINUTE_TO_SECOND:
+ if (lengthtype == SQL_DESC_OCTET_LENGTH)
+ return 34;
/* strlen("INTERVAL -'mmm:ss[.fff]' MINUTE(p) TO SECOND(q)") */
return 11 + 24 +
(rec->sql_desc_datetime_interval_precision > 10) +
@@ -315,58 +387,79 @@ ODBCLength(ODBCDescRec *rec, int display
rec->sql_desc_precision + 1 :
0);
case SQL_INTERVAL_YEAR:
+ if (lengthtype == SQL_DESC_OCTET_LENGTH)
+ return 34;
/* strlen("INTERVAL -'yyy' YEAR(p)") */
return 11 + 9 +
(rec->sql_desc_datetime_interval_precision > 10) +
rec->sql_desc_datetime_interval_precision;
case SQL_INTERVAL_MONTH:
+ if (lengthtype == SQL_DESC_OCTET_LENGTH)
+ return 34;
/* strlen("INTERVAL -'yyy' MONTH(p)") */
return 11 + 10 +
(rec->sql_desc_datetime_interval_precision > 10) +
rec->sql_desc_datetime_interval_precision;
case SQL_INTERVAL_DAY:
+ if (lengthtype == SQL_DESC_OCTET_LENGTH)
+ return 34;
/* strlen("INTERVAL -'yyy' DAY(p)") */
return 11 + 8 +
(rec->sql_desc_datetime_interval_precision > 10) +
rec->sql_desc_datetime_interval_precision;
case SQL_INTERVAL_HOUR:
+ if (lengthtype == SQL_DESC_OCTET_LENGTH)
+ return 34;
/* strlen("INTERVAL -'yyy' HOUR(p)") */
return 11 + 9 +
(rec->sql_desc_datetime_interval_precision > 10) +
rec->sql_desc_datetime_interval_precision;
case SQL_INTERVAL_MINUTE:
+ if (lengthtype == SQL_DESC_OCTET_LENGTH)
+ return 34;
/* strlen("INTERVAL -'yyy' MINUTE(p)") */
return 11 + 11 +
(rec->sql_desc_datetime_interval_precision > 10) +
rec->sql_desc_datetime_interval_precision;
case SQL_INTERVAL_YEAR_TO_MONTH:
+ if (lengthtype == SQL_DESC_OCTET_LENGTH)
+ return 34;
/* strlen("INTERVAL -'yyy' YEAR(p) TO MONTH") */
return 11 + 18 +
(rec->sql_desc_datetime_interval_precision > 10) +
rec->sql_desc_datetime_interval_precision +
3;
case SQL_INTERVAL_DAY_TO_HOUR:
+ if (lengthtype == SQL_DESC_OCTET_LENGTH)
+ return 34;
/* strlen("INTERVAL -'yyy' DAY(p) TO HOUR") */
return 11 + 16 +
(rec->sql_desc_datetime_interval_precision > 10) +
rec->sql_desc_datetime_interval_precision +
3;
case SQL_INTERVAL_HOUR_TO_MINUTE:
+ if (lengthtype == SQL_DESC_OCTET_LENGTH)
+ return 34;
/* strlen("INTERVAL -'yyy' HOUR(p) TO MINUTE") */
return 11 + 19 +
(rec->sql_desc_datetime_interval_precision > 10) +
rec->sql_desc_datetime_interval_precision +
3;
case SQL_INTERVAL_DAY_TO_MINUTE:
+ if (lengthtype == SQL_DESC_OCTET_LENGTH)
+ return 34;
/* strlen("INTERVAL -'yyy' DAY(p) TO MINUTE") */
return 11 + 18 +
(rec->sql_desc_datetime_interval_precision > 10) +
rec->sql_desc_datetime_interval_precision +
6;
case SQL_GUID:
+ if (lengthtype == SQL_DESC_OCTET_LENGTH)
+ return 16;
/* strlen("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee") */
return 36;
default:
- return SQL_NO_TOTAL;
+ break;
}
+ return SQL_NO_TOTAL;
}
diff --git a/clients/odbc/driver/ODBCDesc.h b/clients/odbc/driver/ODBCDesc.h
--- a/clients/odbc/driver/ODBCDesc.h
+++ b/clients/odbc/driver/ODBCDesc.h
@@ -99,7 +99,8 @@ ODBCError *getDescError(ODBCDesc *desc);
void destroyODBCDesc(ODBCDesc *desc);
void setODBCDescRecCount(ODBCDesc *desc, int count);
ODBCDescRec *addODBCDescRec(ODBCDesc *desc, SQLSMALLINT recno);
-SQLULEN ODBCLength(ODBCDescRec *rec, int display);
+
+SQLULEN ODBCLength(ODBCDescRec *rec, int lengthtype);
SQLRETURN SQLGetDescField_(ODBCDesc *desc, SQLSMALLINT RecordNumber,
SQLSMALLINT FieldIdentifier, SQLPOINTER Value, SQLINTEGER BufferLength,
SQLINTEGER *StringLength);
SQLRETURN SQLSetDescField_(ODBCDesc *desc, SQLSMALLINT RecordNumber,
SQLSMALLINT FieldIdentifier, SQLPOINTER Value, SQLINTEGER BufferLength);
diff --git a/clients/odbc/driver/SQLDescribeCol.c
b/clients/odbc/driver/SQLDescribeCol.c
--- a/clients/odbc/driver/SQLDescribeCol.c
+++ b/clients/odbc/driver/SQLDescribeCol.c
@@ -90,7 +90,7 @@ SQLDescribeCol_(ODBCStmt *stmt,
/* also see SQLDescribeParam */
if (ColumnSizePtr)
- *ColumnSizePtr = ODBCLength(rec, 0);
+ *ColumnSizePtr = ODBCLength(rec, SQL_DESC_LENGTH);
/* also see SQLDescribeParam */
if (DecimalDigitsPtr) {
diff --git a/clients/odbc/driver/SQLDescribeParam.c
b/clients/odbc/driver/SQLDescribeParam.c
--- a/clients/odbc/driver/SQLDescribeParam.c
+++ b/clients/odbc/driver/SQLDescribeParam.c
@@ -86,7 +86,7 @@ SQLDescribeParam(SQLHSTMT StatementHandl
/* also see SQLDescribeCol */
if (ParameterSizePtr)
- *ParameterSizePtr = ODBCLength(rec, 0);
+ *ParameterSizePtr = ODBCLength(rec, SQL_DESC_LENGTH);
/* also see SQLDescribeCol */
if (DecimalDigitsPtr) {
diff --git a/clients/odbc/driver/SQLExecute.c b/clients/odbc/driver/SQLExecute.c
--- a/clients/odbc/driver/SQLExecute.c
+++ b/clients/odbc/driver/SQLExecute.c
@@ -230,18 +230,9 @@ ODBCInitResult(ODBCStmt *stmt)
/* this must come after other fields have been
* initialized */
- rec->sql_desc_length = ODBCLength(rec, 0);
- rec->sql_desc_display_size = ODBCLength(rec, 1);
- if (rec->sql_desc_concise_type == SQL_CHAR ||
- rec->sql_desc_concise_type == SQL_VARCHAR ||
- rec->sql_desc_concise_type == SQL_LONGVARCHAR) {
- /* in theory, each character (really: Unicode
- * code point) could need 6 bytes in the UTF-8
- * encoding; don't include the terminating
- * NULL byte */
- rec->sql_desc_octet_length = 6 * rec->sql_desc_length;
- } else
- rec->sql_desc_octet_length = rec->sql_desc_length;
+ rec->sql_desc_length = ODBCLength(rec, SQL_DESC_LENGTH);
+ rec->sql_desc_display_size = ODBCLength(rec,
SQL_DESC_DISPLAY_SIZE);
+ rec->sql_desc_octet_length = ODBCLength(rec,
SQL_DESC_OCTET_LENGTH);
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list