summaryrefslogtreecommitdiff
path: root/storage
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2015-10-27 18:57:28 +0100
committerSergei Golubchik <serg@mariadb.org>2015-10-27 18:57:28 +0100
commit3c5733cd2dab8877afd46f38139f2cbb13b71125 (patch)
tree9b30e5cb6caff1cf55fae7a978d1b9be1f40fde1 /storage
parent6a28882b57497b7c167577b2cdc03c7193779b71 (diff)
parent41a3c58e28ec682fbffb5fde3021dd0e7958a7c5 (diff)
downloadmariadb-git-3c5733cd2dab8877afd46f38139f2cbb13b71125.tar.gz
Merge branch 'connect/10.0' into 10.0
Diffstat (limited to 'storage')
-rw-r--r--storage/connect/ha_connect.cc32
-rw-r--r--storage/connect/odbconn.cpp6
-rw-r--r--storage/connect/reldef.h3
-rw-r--r--storage/connect/tabdos.cpp3
-rw-r--r--storage/connect/tabjson.cpp12
-rw-r--r--storage/connect/tabodbc.cpp17
-rw-r--r--storage/connect/value.cpp22
7 files changed, 66 insertions, 29 deletions
diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc
index e1ef6f6af62..3036783e5b7 100644
--- a/storage/connect/ha_connect.cc
+++ b/storage/connect/ha_connect.cc
@@ -169,7 +169,7 @@
#define JSONMAX 10 // JSON Default max grp size
extern "C" {
- char version[]= "Version 1.03.0007 July 05, 2015";
+ char version[]= "Version 1.03.0007 October 20, 2015";
#if defined(__WIN__)
char compver[]= "Version 1.03.0007 " __DATE__ " " __TIME__;
char slash= '\\';
@@ -1134,7 +1134,10 @@ PTOS ha_connect::GetTableOptionStruct(TABLE_SHARE *s)
{
TABLE_SHARE *tsp= (tshp) ? tshp : (s) ? s : table_share;
- return (tsp) ? tsp->option_struct : NULL;
+ return (tsp && (!tsp->db_plugin ||
+ !stricmp(plugin_name(tsp->db_plugin)->str, "connect") ||
+ !stricmp(plugin_name(tsp->db_plugin)->str, "partition")))
+ ? tsp->option_struct : NULL;
} // end of GetTableOptionStruct
/****************************************************************************/
@@ -2471,7 +2474,18 @@ PFIL ha_connect::CondFilter(PGLOBAL g, Item *cond)
!(colp[i]= tdbp->ColDB(g, (PSZ)pField->field->field_name, 0)))
return NULL; // Column does not belong to this table
- if (trace) {
+ // These types are not yet implemented (buggy)
+ switch (pField->field->type()) {
+ case MYSQL_TYPE_TIMESTAMP:
+ case MYSQL_TYPE_DATE:
+ case MYSQL_TYPE_TIME:
+ case MYSQL_TYPE_DATETIME:
+ case MYSQL_TYPE_YEAR:
+ case MYSQL_TYPE_NEWDATE:
+ return NULL;
+ } // endswitch type
+
+ if (trace) {
htrc("Field index=%d\n", pField->field->field_index);
htrc("Field name=%s\n", pField->field->field_name);
} // endif trace
@@ -2486,12 +2500,10 @@ PFIL ha_connect::CondFilter(PGLOBAL g, Item *cond)
if (!i && (ismul))
return NULL;
- if ((res= pval->val_str(&tmp)) == NULL)
- return NULL; // To be clarified
-
- switch (args[i]->real_type()) {
+ switch (args[i]->real_type()) {
case COND::STRING_ITEM:
- pp->Value= PlugSubAllocStr(g, NULL, res->ptr(), res->length());
+ res= pval->val_str(&tmp);
+ pp->Value= PlugSubAllocStr(g, NULL, res->ptr(), res->length());
pp->Type= (pp->Value) ? TYPE_STRING : TYPE_ERROR;
break;
case COND::INT_ITEM:
@@ -2520,8 +2532,8 @@ PFIL ha_connect::CondFilter(PGLOBAL g, Item *cond)
return NULL;
} // endswitch type
- if (trace)
- htrc("Value=%.*s\n", res->length(), res->ptr());
+ if (trace)
+ htrc("Value type=%hd\n", pp->Type);
// Append the value to the argument list
if (pprec)
diff --git a/storage/connect/odbconn.cpp b/storage/connect/odbconn.cpp
index 6aaa048de81..1ccdf231970 100644
--- a/storage/connect/odbconn.cpp
+++ b/storage/connect/odbconn.cpp
@@ -2360,9 +2360,11 @@ int ODBConn::GetCatInfo(CATPARM *cap)
} // endif rc
for (n = 0, crp = qrp->Colresp; crp; n++, crp = crp->Next) {
- if (vlen[n] == SQL_NULL_DATA)
+ if (vlen[n] == SQL_NO_TOTAL)
+ ThrowDBX("Unexpected SQL_NO_TOTAL returned from SQLFetch");
+ else if (vlen[n] == SQL_NULL_DATA)
pval[n]->SetNull(true);
- else if (crp->Type == TYPE_STRING && vlen[n] != SQL_NULL_DATA)
+ else if (crp->Type == TYPE_STRING/* && vlen[n] != SQL_NULL_DATA*/)
pval[n]->SetValue_char(pbuf[n], vlen[n]);
else
pval[n]->SetNull(false);
diff --git a/storage/connect/reldef.h b/storage/connect/reldef.h
index 4aa29037dfc..dada5716dbe 100644
--- a/storage/connect/reldef.h
+++ b/storage/connect/reldef.h
@@ -193,7 +193,8 @@ class DllExport COLDEF : public COLCRT { /* Column description block
friend class COLBLK;
friend class DBFFAM;
friend class TDBASE;
- public:
+ friend class TDBDOS;
+public:
COLDEF(void); // Constructor
// Implementation
diff --git a/storage/connect/tabdos.cpp b/storage/connect/tabdos.cpp
index a1e58ab3344..527fe55dd89 100644
--- a/storage/connect/tabdos.cpp
+++ b/storage/connect/tabdos.cpp
@@ -2018,7 +2018,8 @@ int TDBDOS::EstimatedLength(void)
// result if we set dep to 1
dep = 1 + cdp->GetLong() / 20; // Why 20 ?????
} else for (; cdp; cdp = cdp->GetNext())
- dep = MY_MAX(dep, cdp->GetOffset());
+ if (!(cdp->Flags & (U_VIRTUAL|U_SPECIAL)))
+ dep = MY_MAX(dep, cdp->GetOffset());
return (int)dep;
} // end of Estimated Length
diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp
index fafba6228b9..211a58f0344 100644
--- a/storage/connect/tabjson.cpp
+++ b/storage/connect/tabjson.cpp
@@ -755,7 +755,7 @@ int TDBJSN::MakeTopTree(PGLOBAL g, PJSON jsp)
} else
strcpy(To_Line, s);
- Row->Clear();
+// Row->Clear();
return false;
} else
return true;
@@ -979,7 +979,8 @@ bool JSONCOL::ParseJpath(PGLOBAL g)
if (!stricmp(Name, colp->GetName())) {
Nod = colp->Nod;
Nodes = colp->Nodes;
- goto fin;
+ Xpd = colp->Xpd;
+ goto fin;
} // endif Name
sprintf(g->Message, "Cannot parse updated column %s", Name);
@@ -1347,7 +1348,12 @@ PJSON JSONCOL::GetRow(PGLOBAL g)
/***********************************************************************/
void JSONCOL::WriteColumn(PGLOBAL g)
{
- /*********************************************************************/
+ if (Xpd && Tjp->Pretty < 2) {
+ strcpy(g->Message, "Cannot write expanded column when Pretty is not 2");
+ longjmp(g->jumper[g->jump_level], 666);
+ } // endif Xpd
+
+ /*********************************************************************/
/* Check whether this node must be written. */
/*********************************************************************/
if (Value != To_Val)
diff --git a/storage/connect/tabodbc.cpp b/storage/connect/tabodbc.cpp
index 098ed1ac114..31854870ed2 100644
--- a/storage/connect/tabodbc.cpp
+++ b/storage/connect/tabodbc.cpp
@@ -321,10 +321,21 @@ PSZ TDBODBC::GetFile(PGLOBAL g)
{
if (Connect) {
char *p1, *p2;
- size_t n;
+ int i;
+ size_t n;
- if ((p1 = strstr(Connect, "DBQ="))) {
- p1 += 4; // Beginning of file name
+ if (!(p1 = strstr(Connect, "DBQ="))) {
+ char *p, *lc = strlwr(PlugDup(g, Connect));
+
+ if ((p = strstr(lc, "database=")))
+ p1 = Connect + (p - lc);
+
+ i = 9;
+ } else
+ i = 4;
+
+ if (p1) {
+ p1 += i; // Beginning of file name
p2 = strchr(p1, ';'); // End of file path/name
// Make the File path/name from the connect string
diff --git a/storage/connect/value.cpp b/storage/connect/value.cpp
index 03ec0eb8e40..884ce976a52 100644
--- a/storage/connect/value.cpp
+++ b/storage/connect/value.cpp
@@ -103,6 +103,7 @@ ulonglong CharToNumber(char *p, int n, ulonglong maxval,
if (minus) *minus = false;
if (rc) *rc = false;
+ if (n <= 0) return 0LL;
// Eliminate leading blanks or 0
for (p2 = p + n; p < p2 && (*p == ' ' || *p == '0'); p++) ;
@@ -705,7 +706,7 @@ bool TYPVAL<TYPE>::SetValue_char(char *p, int n)
template <>
bool TYPVAL<double>::SetValue_char(char *p, int n)
{
- if (p) {
+ if (p && n > 0) {
char buf[64];
for (; n > 0 && *p == ' '; p++)
@@ -1345,7 +1346,7 @@ bool TYPVAL<PSZ>::SetValue_char(char *p, int n)
{
bool rc;
- if (p) {
+ if (p && n > 0) {
rc = n > Len;
if ((n = MY_MIN(n, Len))) {
@@ -1804,7 +1805,7 @@ bool DECVAL::SetValue_char(char *p, int n)
{
bool rc;
- if (p) {
+ if (p && n > 0) {
rc = n > Len;
if ((n = MY_MIN(n, Len))) {
@@ -2095,7 +2096,7 @@ bool BINVAL::SetValue_char(char *p, int n)
{
bool rc;
- if (p) {
+ if (p && n > 0) {
rc = n > Clen;
Len = MY_MIN(n, Clen);
memcpy(Binp, p, Len);
@@ -2672,13 +2673,16 @@ bool DTVAL::SetValue_char(char *p, int n)
int ndv;
int dval[6];
- // Trim trailing blanks
- for (p2 = p + n -1; p < p2 && *p2 == ' '; p2--) ;
+ if (n > 0) {
+ // Trim trailing blanks
+ for (p2 = p + n -1; p < p2 && *p2 == ' '; p2--);
- if ((rc = (n = p2 - p + 1) > Len))
- n = Len;
+ if ((rc = (n = p2 - p + 1) > Len))
+ n = Len;
+
+ memcpy(Sdate, p, n);
+ } // endif n
- memcpy(Sdate, p, n);
Sdate[n] = '\0';
ndv = ExtractDate(Sdate, Pdtp, DefYear, dval);