From 7531f22a68ba8e0e25ae95366fdfe094daa68565 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Fri, 10 Oct 2014 13:27:52 +0200 Subject: - Fix a regression error from regarding Header as Boolean from some table types. Was added to ha_connect::GetBooleanOption (otherwise ignored) modified: storage/connect/ha_connect.cc --- storage/connect/ha_connect.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index c6ca6c11df6..d3140787454 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -960,6 +960,8 @@ bool ha_connect::GetBooleanOption(char *opname, bool bdef) opval= options->readonly; else if (!stricmp(opname, "SepIndex")) opval= options->sepindex; + else if (!stricmp(opname, "Header")) + opval= (options->header != 0); // Is Boolean for some table types else if (options->oplist) if ((pv= GetListOption(xp->g, opname, options->oplist))) opval= (!*pv || *pv == 'y' || *pv == 'Y' || atoi(pv) != 0); -- cgit v1.2.1 From 50fc9b3b1936662f657dedd124244d373ee8b2be Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sun, 12 Oct 2014 12:05:05 +0200 Subject: - Fix null handling for date columns (see MDEV-6744) modified: storage/connect/ha_connect.cc storage/connect/plgdbutl.cpp storage/connect/value.cpp storage/connect/value.h --- storage/connect/ha_connect.cc | 1 + storage/connect/plgdbutl.cpp | 6 +++-- storage/connect/value.cpp | 51 +++++++++++++++++++++++++------------------ storage/connect/value.h | 1 + 4 files changed, 36 insertions(+), 23 deletions(-) diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index d3140787454..f6f7fac8a76 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -1840,6 +1840,7 @@ int ha_connect::ScanRecord(PGLOBAL g, uchar *buf) } // endswitch type ((DTVAL*)sdvalin)->SetFormat(g, fmt, strlen(fmt)); + sdvalin->SetNullable(colp->IsNullable()); fp->val_str(&attribute); sdvalin->SetValue_psz(attribute.c_ptr_safe()); value->SetValue_pval(sdvalin); diff --git a/storage/connect/plgdbutl.cpp b/storage/connect/plgdbutl.cpp index c5b66e8f5e6..755aeb21105 100644 --- a/storage/connect/plgdbutl.cpp +++ b/storage/connect/plgdbutl.cpp @@ -730,6 +730,7 @@ int ExtractDate(char *dts, PDTP pdp, int defy, int val[6]) char *fmt, c, d, e, W[8][12]; int i, k, m, numval; int n, y = 30; + bool b = true; // true for null dates if (pdp) fmt = pdp->InFmt; @@ -763,7 +764,8 @@ int ExtractDate(char *dts, PDTP pdp, int defy, int val[6]) m = pdp->Num; for (i = 0; i < m; i++) { - n = *(int*)W[i]; + if ((n = *(int*)W[i])) + b = false; switch (k = pdp->Index[i]) { case 0: @@ -822,7 +824,7 @@ int ExtractDate(char *dts, PDTP pdp, int defy, int val[6]) htrc("numval=%d val=(%d,%d,%d,%d,%d,%d)\n", numval, val[0], val[1], val[2], val[3], val[4], val[5]); - return numval; + return (b) ? 0 : numval; } // end of ExtractDate /***********************************************************************/ diff --git a/storage/connect/value.cpp b/storage/connect/value.cpp index b2935743bd5..41e425d54e2 100644 --- a/storage/connect/value.cpp +++ b/storage/connect/value.cpp @@ -2428,9 +2428,11 @@ bool DTVAL::SetValue_char(char *p, int n) if (trace > 1) htrc(" setting date: '%s' -> %d\n", Sdate, Tval); - Null = false; - } else + Null = (Nullable && ndv == 0); + } else { rc = TYPVAL::SetValue_char(p, n); + Null = (Nullable && Tval == 0); + } // endif Pdtp return rc; } // end of SetValue @@ -2453,9 +2455,11 @@ void DTVAL::SetValue_psz(PSZ p) if (trace > 1) htrc(" setting date: '%s' -> %d\n", Sdate, Tval); - Null = false; - } else + Null = (Nullable && ndv == 0); + } else { TYPVAL::SetValue_psz(p); + Null = (Nullable && Tval == 0); + } // endif Pdtp } // end of SetValue @@ -2496,7 +2500,7 @@ char *DTVAL::GetCharString(char *p) } else sprintf(p, "%d", Tval); - Null = false; +//Null = false; ?????????????? return p; } // end of GetCharString @@ -2507,24 +2511,29 @@ char *DTVAL::ShowValue(char *buf, int len) { if (Pdtp) { char *p; - size_t m, n = 0; - struct tm tm, *ptm = GetGmTime(&tm); - - if (Len < len) { - p = buf; - m = len; - } else { - p = Sdate; - m = Len + 1; - } // endif Len - if (ptm) - n = strftime(p, m, Pdtp->OutFmt, ptm); + if (!Null) { + size_t m, n = 0; + struct tm tm, *ptm = GetGmTime(&tm); + + if (Len < len) { + p = buf; + m = len; + } else { + p = Sdate; + m = Len + 1; + } // endif Len + + if (ptm) + n = strftime(p, m, Pdtp->OutFmt, ptm); + + if (!n) { + *p = '\0'; + strncat(p, "Error", m); + } // endif n - if (!n) { - *p = '\0'; - strncat(p, "Error", m); - } // endif n + } else + p = ""; // DEFAULT VALUE ??? return p; } else diff --git a/storage/connect/value.h b/storage/connect/value.h index 151ddacf509..295fa11107a 100644 --- a/storage/connect/value.h +++ b/storage/connect/value.h @@ -357,6 +357,7 @@ class DllExport DTVAL : public TYPVAL { DTVAL(PGLOBAL g, double f); // Implementation + virtual bool IsZero(void) {return Null;} virtual bool SetValue_pval(PVAL valp, bool chktype); virtual bool SetValue_char(char *p, int n); virtual void SetValue_psz(PSZ s); -- cgit v1.2.1 From b10fa87b15b504ed1467558cf8984ed8de0c6184 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sun, 12 Oct 2014 15:46:31 +0200 Subject: - Remove one gcc warning modified: storage/connect/tabodbc.cpp --- storage/connect/tabodbc.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/storage/connect/tabodbc.cpp b/storage/connect/tabodbc.cpp index 023d7efa708..c9f5fbe31c7 100644 --- a/storage/connect/tabodbc.cpp +++ b/storage/connect/tabodbc.cpp @@ -1075,8 +1075,9 @@ void ODBCCOL::ReadColumn(PGLOBAL g) } // endif Bufp if (Buf_Type == TYPE_DATE) { - struct tm dbtime = {0,0,0,0,0,0,0,0,0}; + struct tm dbtime; + memset(&dbtime, 0, sizeof(tm)); dbtime.tm_sec = (int)Sqlbuf->second; dbtime.tm_min = (int)Sqlbuf->minute; dbtime.tm_hour = (int)Sqlbuf->hour; -- cgit v1.2.1