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

Reply via email to