Changeset: a2693e94ee2d for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a2693e94ee2d
Added Files:
sql/test/bugs/Tests/apply_with_union_assertion.sql
sql/test/bugs/Tests/apply_with_union_assertion.stable.err
sql/test/bugs/Tests/apply_with_union_assertion.stable.out
Modified Files:
clients/odbc/driver/ODBCConvert.c
clients/odbc/driver/ODBCUtil.c
clients/odbc/driver/ODBCUtil.h
clients/odbc/driver/SQLBindCol.c
clients/odbc/driver/SQLBindParameter.c
clients/odbc/driver/SQLColAttribute.c
clients/odbc/driver/SQLColAttributes.c
clients/odbc/driver/SQLDescribeCol.c
clients/odbc/driver/SQLDescribeParam.c
clients/odbc/driver/SQLExtendedFetch.c
clients/odbc/driver/SQLFetch.c
clients/odbc/driver/SQLGetConnectAttr.c
clients/odbc/driver/SQLGetConnectOption.c
clients/odbc/driver/SQLGetCursorName.c
clients/odbc/driver/SQLGetData.c
clients/odbc/driver/SQLGetDescField.c
clients/odbc/driver/SQLGetDescRec.c
clients/odbc/driver/SQLGetDiagField.c
clients/odbc/driver/SQLGetEnvAttr.c
clients/odbc/driver/SQLGetInfo.c
clients/odbc/driver/SQLGetStmtAttr.c
clients/odbc/driver/SQLGetStmtOption.c
clients/odbc/driver/SQLSetConnectAttr.c
clients/odbc/driver/SQLSetDescField.c
clients/odbc/driver/SQLSetDescRec.c
clients/odbc/driver/SQLSetEnvAttr.c
clients/odbc/driver/SQLSetParam.c
clients/odbc/driver/SQLSetStmtAttr.c
clients/odbc/driver/SQLSetStmtOption.c
sql/server/rel_optimizer.c
sql/test/bugs/Tests/All
Branch: default
Log Message:
Merge with Oct2014 branch.
diffs (truncated from 2005 to 300 lines):
diff --git a/clients/odbc/driver/ODBCConvert.c
b/clients/odbc/driver/ODBCConvert.c
--- a/clients/odbc/driver/ODBCConvert.c
+++ b/clients/odbc/driver/ODBCConvert.c
@@ -242,6 +242,7 @@ parsedate(const char *data, DATE_STRUCT
{
int n;
+ memset(dval, 0, sizeof(*dval));
while (space(*data))
data++;
if (sscanf(data, "{d '%hd-%hu-%hu'}%n",
@@ -267,6 +268,7 @@ parsetime(const char *data, TIME_STRUCT
int n;
int braces;
+ memset(tval, 0, sizeof(*tval));
while (space(*data))
data++;
if (sscanf(data, "{t '%hu:%hu:%hu%n",
@@ -312,6 +314,7 @@ parsetimestamp(const char *data, TIMESTA
int n;
int braces;
+ memset(tsval, 0, sizeof(*tsval));
while (space(*data))
data++;
if (sscanf(data, "{TS '%hd-%hu-%hu %hu:%hu:%hu%n",
@@ -531,6 +534,7 @@ parsemonthintervalstring(char **svalp,
long val1 = -1, val2 = -1;
SQLLEN leadingprecision;
+ memset(ival, 0, sizeof(*ival));
if (slen < 8 || strncasecmp(sval, "interval", 8) != 0)
return SQL_ERROR;
sval += 8;
@@ -688,6 +692,7 @@ parsesecondintervalstring(char **svalp,
unsigned v1, v2, v3, v4;
int n;
+ memset(ival, 0, sizeof(*ival));
if (slen < 8 || strncasecmp(sval, "interval", 8) != 0)
return SQL_ERROR;
sval += 8;
@@ -999,6 +1004,10 @@ ODBCFetch(ODBCStmt *stmt,
TIMESTAMP_STRUCT tsval;
double fval = 0;
+ /* staging variables for output data */
+ SQL_NUMERIC_STRUCT nmval;
+ SQL_INTERVAL_STRUCT ivval;
+
assert(ptr != NULL);
ird = stmt->ImplRowDescr;
@@ -1837,11 +1846,21 @@ ODBCFetch(ODBCStmt *stmt,
SQLSMALLINT n;
ODBCutf82wchar((SQLCHAR *) ptr, SQL_NTS, (SQLWCHAR *)
origptr, origbuflen, &n);
+#ifdef ODBCDEBUG
+ ODBCLOG("Writing %d bytes to " PTRFMT "\n",
+ (int) (n * sizeof(SQLWCHAR)),
+ PTRFMTCAST origptr);
+#endif
if (origlenp)
*origlenp = n * sizeof(SQLWCHAR); /* # of
bytes, not chars */
free(ptr);
}
+#ifdef ODBCDEBUG
+ else
+ ODBCLOG("Writing %d bytes to " PTRFMT "\n",
+ (int) strlen(ptr), PTRFMTCAST ptr);
+#endif
break;
}
case SQL_C_BINARY:
@@ -1913,7 +1932,7 @@ ODBCFetch(ODBCStmt *stmt,
addStmtError(stmt, "22003", NULL, 0);
return SQL_ERROR;
}
- *(unsigned char *) ptr = fval >= 1;
+ WriteData(ptr, fval >= 1, unsigned char);
if (fval != 0 && fval != 1) {
/* Fractional truncation */
@@ -1938,7 +1957,7 @@ ODBCFetch(ODBCStmt *stmt,
addStmtError(stmt, "22003", NULL, 0);
return SQL_ERROR;
}
- *(unsigned char *) ptr = (unsigned char) nval.val;
+ WriteData(ptr, (unsigned char) nval.val, unsigned char);
if (truncated) {
/* Fractional truncation */
@@ -2036,18 +2055,18 @@ ODBCFetch(ODBCStmt *stmt,
switch (type) {
case SQL_C_STINYINT:
case SQL_C_TINYINT:
- *(signed char *) ptr = nval.sign ? (signed
char) nval.val : -(signed char) nval.val;
+ WriteData(ptr, nval.sign ? (signed char)
nval.val : -(signed char) nval.val, signed char);
break;
case SQL_C_SSHORT:
case SQL_C_SHORT:
- *(short *) ptr = nval.sign ? (short) nval.val :
-(short) nval.val;
+ WriteData(ptr, nval.sign ? (short) nval.val :
-(short) nval.val, short);
break;
case SQL_C_SLONG:
case SQL_C_LONG:
- *(int *) ptr = nval.sign ? (int) nval.val :
-(int) nval.val;
+ WriteData(ptr, nval.sign ? (int) nval.val :
-(int) nval.val, int);
break;
case SQL_C_SBIGINT:
- *(SQLBIGINT *) ptr = nval.sign ? (SQLBIGINT)
nval.val : -(SQLBIGINT) nval.val;
+ WriteData(ptr, nval.sign ? (SQLBIGINT) nval.val
: -(SQLBIGINT) nval.val, SQLBIGINT);
break;
}
break;
@@ -2136,16 +2155,16 @@ ODBCFetch(ODBCStmt *stmt,
switch (type) {
case SQL_C_UTINYINT:
- *(unsigned char *) ptr = (unsigned char)
nval.val;
+ WriteData(ptr, (unsigned char) nval.val,
unsigned char);
break;
case SQL_C_USHORT:
- *(unsigned short *) ptr = (unsigned short)
nval.val;
+ WriteData(ptr, (unsigned short) nval.val,
unsigned short);
break;
case SQL_C_ULONG:
- *(unsigned int *) ptr = (unsigned int) nval.val;
+ WriteData(ptr, (unsigned int) nval.val,
unsigned int);
break;
case SQL_C_UBIGINT:
- *(SQLUBIGINT *) ptr = (SQLUBIGINT) nval.val;
+ WriteData(ptr, (SQLUBIGINT) nval.val,
SQLUBIGINT);
break;
}
break;
@@ -2201,21 +2220,23 @@ ODBCFetch(ODBCStmt *stmt,
nval.scale--;
nval.precision--;
}
- ((SQL_NUMERIC_STRUCT *) ptr)->precision =
nval.precision;
- ((SQL_NUMERIC_STRUCT *) ptr)->scale = nval.scale;
- ((SQL_NUMERIC_STRUCT *) ptr)->sign = nval.sign;
+ memset(&nmval, 0, sizeof(nmval));
+ nmval.precision = nval.precision;
+ nmval.scale = nval.scale;
+ nmval.sign = nval.sign;
for (i = 0; i < SQL_MAX_NUMERIC_LEN; i++) {
- ((SQL_NUMERIC_STRUCT *) ptr)->val[i] =
(SQLCHAR) (nval.val & 0xFF);
+ nmval.val[i] = (SQLCHAR) (nval.val & 0xFF);
nval.val >>= 8;
}
+ WriteData(ptr, nmval, SQL_NUMERIC_STRUCT);
+ if (lenp)
+ *lenp = sizeof(SQL_NUMERIC_STRUCT);
break;
default:
/* Restricted data type attribute violation */
addStmtError(stmt, "07006", NULL, 0);
return SQL_ERROR;
}
- if (lenp)
- *lenp = sizeof(SQL_NUMERIC_STRUCT);
break;
case SQL_C_FLOAT:
case SQL_C_DOUBLE:
@@ -2269,13 +2290,13 @@ ODBCFetch(ODBCStmt *stmt,
addStmtError(stmt, "22003", NULL, 0);
return SQL_ERROR;
}
- *(float *) ptr = (float) fval;
+ WriteData(ptr, (float) fval, float);
if (lenp)
*lenp = sizeof(float);
} else {
if (ardrec && row > 0)
ptr = (SQLPOINTER) ((char *) ptr + row *
(bind_type == SQL_BIND_BY_COLUMN ? (SQLINTEGER) sizeof(double) : bind_type));
- *(double *) ptr = fval;
+ WriteData(ptr, fval, double);
if (lenp)
*lenp = sizeof(double);
@@ -2310,7 +2331,7 @@ ODBCFetch(ODBCStmt *stmt,
}
/* fall through */
case SQL_TYPE_DATE:
- *(DATE_STRUCT *) ptr = dval;
+ WriteData(ptr, dval, DATE_STRUCT);
break;
default:
/* Restricted data type attribute violation */
@@ -2349,7 +2370,7 @@ ODBCFetch(ODBCStmt *stmt,
}
/* fall through */
case SQL_TYPE_TIME:
- *(TIME_STRUCT *) ptr = tval;
+ WriteData(ptr, tval, TIME_STRUCT);
break;
default:
/* Restricted data type attribute violation */
@@ -2412,7 +2433,7 @@ ODBCFetch(ODBCStmt *stmt,
}
/* fall through */
case SQL_TYPE_TIMESTAMP: /* note i==1 unless we fell
through */
- *(TIMESTAMP_STRUCT *) ptr = tsval;
+ WriteData(ptr, tsval, TIMESTAMP_STRUCT);
break;
default:
/* Restricted data type attribute violation */
@@ -2456,14 +2477,14 @@ ODBCFetch(ODBCStmt *stmt,
addStmtError(stmt, "07006", NULL, 0);
return SQL_ERROR;
}
-#define p ((SQL_INTERVAL_STRUCT *) ptr) /* abbrev. */
- p->interval_sign = ival.interval_sign;
- p->intval.year_month.year = 0;
- p->intval.year_month.month = 0;
+ memset(&ivval, 0, sizeof(ivval));
+ ivval.interval_sign = ival.interval_sign;
+ ivval.intval.year_month.year = 0;
+ ivval.intval.year_month.month = 0;
switch (type) {
case SQL_C_INTERVAL_YEAR:
- p->interval_type = SQL_IS_YEAR;
- if ((p->intval.year_month.year =
ival.intval.year_month.year) >= maxdatetimeval) {
+ ivval.interval_type = SQL_IS_YEAR;
+ if ((ivval.intval.year_month.year =
ival.intval.year_month.year) >= maxdatetimeval) {
/* Interval field overflow */
addStmtError(stmt, "22015", NULL, 0);
return SQL_ERROR;
@@ -2474,24 +2495,24 @@ ODBCFetch(ODBCStmt *stmt,
}
break;
case SQL_C_INTERVAL_MONTH:
- p->interval_type = SQL_IS_MONTH;
- if ((p->intval.year_month.month =
ival.intval.year_month.month + 12 * ival.intval.year_month.year) >=
maxdatetimeval) {
+ ivval.interval_type = SQL_IS_MONTH;
+ if ((ivval.intval.year_month.month =
ival.intval.year_month.month + 12 * ival.intval.year_month.year) >=
maxdatetimeval) {
/* Interval field overflow */
addStmtError(stmt, "22015", NULL, 0);
return SQL_ERROR;
}
break;
case SQL_C_INTERVAL_YEAR_TO_MONTH:
- p->interval_type = SQL_IS_YEAR_TO_MONTH;
- if ((p->intval.year_month.year =
ival.intval.year_month.year) >= maxdatetimeval) {
+ ivval.interval_type = SQL_IS_YEAR_TO_MONTH;
+ if ((ivval.intval.year_month.year =
ival.intval.year_month.year) >= maxdatetimeval) {
/* Interval field overflow */
addStmtError(stmt, "22015", NULL, 0);
return SQL_ERROR;
}
- p->intval.year_month.month =
ival.intval.year_month.month;
+ ivval.intval.year_month.month =
ival.intval.year_month.month;
break;
}
-#undef p
+ WriteData(ptr, ivval, SQL_INTERVAL_STRUCT);
if (lenp)
*lenp = sizeof(SQL_INTERVAL_STRUCT);
break;
@@ -2543,17 +2564,17 @@ ODBCFetch(ODBCStmt *stmt,
addStmtError(stmt, "07006", NULL, 0);
return SQL_ERROR;
}
-#define p ((SQL_INTERVAL_STRUCT *) ptr) /* abbrev. */
- p->interval_sign = ival.interval_sign;
- p->intval.day_second.day = 0;
- p->intval.day_second.hour = 0;
- p->intval.day_second.minute = 0;
- p->intval.day_second.second = 0;
- p->intval.day_second.fraction = 0;
+ memset(&ivval, 0, sizeof(ivval));
+ ivval.interval_sign = ival.interval_sign;
+ ivval.intval.day_second.day = 0;
+ ivval.intval.day_second.hour = 0;
+ ivval.intval.day_second.minute = 0;
+ ivval.intval.day_second.second = 0;
+ ivval.intval.day_second.fraction = 0;
switch (type) {
case SQL_C_INTERVAL_DAY:
- p->interval_type = SQL_IS_DAY;
- if ((p->intval.day_second.day =
ival.intval.day_second.day) >= maxdatetimeval) {
+ ivval.interval_type = SQL_IS_DAY;
+ if ((ivval.intval.day_second.day =
ival.intval.day_second.day) >= maxdatetimeval) {
/* Interval field overflow */
addStmtError(stmt, "22015", NULL, 0);
return SQL_ERROR;
@@ -2564,8 +2585,8 @@ ODBCFetch(ODBCStmt *stmt,
}
break;
case SQL_C_INTERVAL_HOUR:
- p->interval_type = SQL_IS_HOUR;
- if ((p->intval.day_second.hour =
ival.intval.day_second.hour + 24 * ival.intval.day_second.day) >=
maxdatetimeval) {
+ ivval.interval_type = SQL_IS_HOUR;
+ if ((ivval.intval.day_second.hour =
ival.intval.day_second.hour + 24 * ival.intval.day_second.day) >=
maxdatetimeval) {
/* Interval field overflow */
addStmtError(stmt, "22015", NULL, 0);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list