diff options
-rw-r--r-- | storage/connect/ha_connect.cc | 1 | ||||
-rw-r--r-- | storage/connect/plgdbutl.cpp | 6 | ||||
-rw-r--r-- | storage/connect/value.cpp | 51 | ||||
-rw-r--r-- | 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<int>::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<int>::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<int> { 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); |