Commit fd1ca70b authored by Olivier Bertrand's avatar Olivier Bertrand

- Enhance JSON tables handling.

modified:
  storage/connect/json.cpp
  storage/connect/json.h
  storage/connect/mysql-test/connect/r/json.result
  storage/connect/mysql-test/connect/t/json.test
  storage/connect/tabjson.cpp
  storage/connect/tabjson.h

- Avoid crash when a partition table name pattern is ill formed
  (such as using place holder %i instead of %s)
modified:
  storage/connect/ha_connect.cc
parent 9a2dc7df
...@@ -997,8 +997,12 @@ char *ha_connect::GetRealString(const char *s) ...@@ -997,8 +997,12 @@ char *ha_connect::GetRealString(const char *s)
char *sv; char *sv;
if (IsPartitioned() && s) { if (IsPartitioned() && s) {
sv= (char*)PlugSubAlloc(xp->g, NULL, strlen(s) + strlen(partname)); // sv= (char*)PlugSubAlloc(xp->g, NULL, strlen(s) + strlen(partname));
// With wrong string pattern, the size of the constructed string
// can be more than strlen(s) + strlen(partname)
sv= (char*)PlugSubAlloc(xp->g, NULL, 0);
sprintf(sv, s, partname); sprintf(sv, s, partname);
PlugSubAlloc(xp->g, NULL, strlen(sv) + 1);
} else } else
sv= (char*)s; sv= (char*)s;
......
...@@ -576,9 +576,9 @@ bool SerializeObject(JOUT *js, PJOB jobp) ...@@ -576,9 +576,9 @@ bool SerializeObject(JOUT *js, PJOB jobp)
else if (js->WriteChr(',')) else if (js->WriteChr(','))
return true; return true;
if (js->WriteChr('\"') || if (js->WriteChr('"') ||
js->WriteStr(pair->Key) || js->WriteStr(pair->Key) ||
js->WriteChr('\"') || js->WriteChr('"') ||
js->WriteChr(':') || js->WriteChr(':') ||
SerializeValue(js, pair->Val)) SerializeValue(js, pair->Val))
return true; return true;
...@@ -725,13 +725,13 @@ bool JOUTFILE::Escape(const char *s) ...@@ -725,13 +725,13 @@ bool JOUTFILE::Escape(const char *s)
for (unsigned int i = 0; i < strlen(s); i++) for (unsigned int i = 0; i < strlen(s); i++)
switch (s[i]) { switch (s[i]) {
case '"': fputs("\\\"", Stream); break;
case '\\': fputs("\\\\", Stream); break;
case '\t': fputs("\\t", Stream); break; case '\t': fputs("\\t", Stream); break;
case '\n': fputs("\\n", Stream); break; case '\n': fputs("\\n", Stream); break;
case '\r': fputs("\\r", Stream); break; case '\r': fputs("\\r", Stream); break;
case '\b': fputs("\\b", Stream); break; case '\b': fputs("\\b", Stream); break;
case '\f': fputs("\\f", Stream); break; case '\f': fputs("\\f", Stream); break;
case '\\': fputs("\\\\", Stream); break;
case '"': fputs("\\\"", Stream); break;
default: default:
fputc(s[i], Stream); fputc(s[i], Stream);
break; break;
......
...@@ -18,7 +18,8 @@ enum JTYP {TYPE_STRG = 1, ...@@ -18,7 +18,8 @@ enum JTYP {TYPE_STRG = 1,
TYPE_BOOL = 4, TYPE_BOOL = 4,
TYPE_INTG = 7, TYPE_INTG = 7,
TYPE_JSON = 12, TYPE_JSON = 12,
TYPE_JAR, TYPE_JOB, TYPE_JAR,
TYPE_JOB,
TYPE_JVAL}; TYPE_JVAL};
class JOUT; class JOUT;
......
...@@ -89,8 +89,8 @@ ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher L ...@@ -89,8 +89,8 @@ ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher L
UPDATE t1 SET AuthorFN = 'Philippe' WHERE AuthorLN = 'Knab'; UPDATE t1 SET AuthorFN = 'Philippe' WHERE AuthorLN = 'Knab';
SELECT * FROM t1 WHERE ISBN = '9782212090819'; SELECT * FROM t1 WHERE ISBN = '9782212090819';
ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year
9782212090819 fr applications Jean-Christophe Bernadac Construire une application XML Eyrolles Paris 1999 9782212090819 fr applications Philippe Bernadac Construire une application XML Eyrolles Paris 1999
9782212090819 fr applications Philippe Knab Construire une application XML Eyrolles Paris 1999 9782212090819 fr applications Franois Knab Construire une application XML Eyrolles Paris 1999
# #
# To add an author a new table must be created # To add an author a new table must be created
# #
...@@ -104,8 +104,8 @@ William J. Pardi ...@@ -104,8 +104,8 @@ William J. Pardi
INSERT INTO t2 VALUES('Charles','Dickens'); INSERT INTO t2 VALUES('Charles','Dickens');
SELECT * FROM t1; SELECT * FROM t1;
ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year
9782212090819 fr applications Jean-Christophe Bernadac Construire une application XML Eyrolles Paris 1999 9782212090819 fr applications Philippe Bernadac Construire une application XML Eyrolles Paris 1999
9782212090819 fr applications Philippe Knab Construire une application XML Eyrolles Paris 1999 9782212090819 fr applications Franois Knab Construire une application XML Eyrolles Paris 1999
9782840825685 fr applications William J. Pardi XML en Action adapt de l'anglais par James Guerin Microsoft Press Paris 1999 9782840825685 fr applications William J. Pardi XML en Action adapt de l'anglais par James Guerin Microsoft Press Paris 1999
9782840825685 fr applications Charles Dickens XML en Action adapt de l'anglais par James Guerin Microsoft Press Paris 1999 9782840825685 fr applications Charles Dickens XML en Action adapt de l'anglais par James Guerin Microsoft Press Paris 1999
DROP TABLE t1; DROP TABLE t1;
...@@ -127,11 +127,11 @@ line ...@@ -127,11 +127,11 @@ line
"SUBJECT": "applications", "SUBJECT": "applications",
"AUTHOR": [ "AUTHOR": [
{ {
"FIRSTNAME": "Jean-Christophe", "FIRSTNAME": "Philippe",
"LASTNAME": "Bernadac" "LASTNAME": "Bernadac"
}, },
{ {
"FIRSTNAME": "Philippe", "FIRSTNAME": "Franois",
"LASTNAME": "Knab" "LASTNAME": "Knab"
} }
], ],
...@@ -192,7 +192,7 @@ Janet 4 Car 17.00 ...@@ -192,7 +192,7 @@ Janet 4 Car 17.00
Janet 5 Beer+Car+Beer+Food 57.00 Janet 5 Beer+Car+Beer+Food 57.00
DROP TABLE t1; DROP TABLE t1;
# #
# Cannot be fully expanded # Now it can be fully expanded
# #
CREATE TABLE t1 ( CREATE TABLE t1 (
WHO CHAR(12), WHO CHAR(12),
...@@ -201,7 +201,31 @@ WHAT CHAR(32) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:WHAT', ...@@ -201,7 +201,31 @@ WHAT CHAR(32) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:WHAT',
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:AMOUNT') AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:AMOUNT')
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn'; ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn';
SELECT * FROM t1; SELECT * FROM t1;
ERROR HY000: Got error 174 'Cannot expand more than one array' from CONNECT WHO WEEK WHAT AMOUNT
Joe 3 Beer 18.00
Joe 3 Food 12.00
Joe 3 Food 19.00
Joe 3 Car 20.00
Joe 4 Beer 19.00
Joe 4 Beer 16.00
Joe 4 Food 17.00
Joe 4 Food 17.00
Joe 4 Beer 14.00
Joe 5 Beer 14.00
Joe 5 Food 12.00
Beth 3 Beer 16.00
Beth 4 Food 17.00
Beth 4 Beer 15.00
Beth 5 Food 12.00
Beth 5 Beer 20.00
Janet 3 Car 19.00
Janet 3 Food 18.00
Janet 3 Beer 18.00
Janet 4 Car 17.00
Janet 5 Beer 14.00
Janet 5 Car 12.00
Janet 5 Beer 19.00
Janet 5 Food 12.00
DROP TABLE t1; DROP TABLE t1;
# #
# Expand expense in 3 one week tables # Expand expense in 3 one week tables
......
...@@ -128,7 +128,7 @@ SELECT * FROM t1; ...@@ -128,7 +128,7 @@ SELECT * FROM t1;
DROP TABLE t1; DROP TABLE t1;
--echo # --echo #
--echo # Cannot be fully expanded --echo # Now it can be fully expanded
--echo # --echo #
CREATE TABLE t1 ( CREATE TABLE t1 (
WHO CHAR(12), WHO CHAR(12),
...@@ -136,7 +136,7 @@ WEEK INT(2) FIELD_FORMAT='WEEK:[X]:NUMBER', ...@@ -136,7 +136,7 @@ WEEK INT(2) FIELD_FORMAT='WEEK:[X]:NUMBER',
WHAT CHAR(32) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:WHAT', WHAT CHAR(32) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:WHAT',
AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:AMOUNT') AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:AMOUNT')
ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn'; ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn';
--error ER_GET_ERRMSG #--error ER_GET_ERRMSG
SELECT * FROM t1; SELECT * FROM t1;
DROP TABLE t1; DROP TABLE t1;
......
This diff is collapsed.
...@@ -15,6 +15,7 @@ enum JMODE {MODE_OBJECT, MODE_ARRAY, MODE_VALUE}; ...@@ -15,6 +15,7 @@ enum JMODE {MODE_OBJECT, MODE_ARRAY, MODE_VALUE};
typedef class JSONDEF *PJDEF; typedef class JSONDEF *PJDEF;
typedef class TDBJSON *PJTDB; typedef class TDBJSON *PJTDB;
typedef class JSONCOL *PJCOL; typedef class JSONCOL *PJCOL;
typedef class JARLST *PJARS;
class TDBJSN; class TDBJSN;
...@@ -25,7 +26,9 @@ typedef struct _jnode { ...@@ -25,7 +26,9 @@ typedef struct _jnode {
PSZ Key; // The key used for object PSZ Key; // The key used for object
OPVAL Op; // Operator used for this node OPVAL Op; // Operator used for this node
PVAL CncVal; // To cont value used for OP_CNC PVAL CncVal; // To cont value used for OP_CNC
PVAL Valp; // The internal array VALUE
int Rank; // The rank in array int Rank; // The rank in array
int Nx; // Same row number
} JNODE, *PJNODE; } JNODE, *PJNODE;
/***********************************************************************/ /***********************************************************************/
...@@ -98,11 +101,11 @@ class TDBJSN : public TDBDOS { ...@@ -98,11 +101,11 @@ class TDBJSN : public TDBDOS {
int N; // The current Rownum int N; // The current Rownum
int Limit; // Limit of multiple values int Limit; // Limit of multiple values
int Pretty; // Depends on file structure int Pretty; // Depends on file structure
bool Strict; // Strict syntax checking int NextSame; // Same next row
bool NextSame; // Same next row
bool Comma; // Row has final comma
int SameRow; // Same row nb int SameRow; // Same row nb
int Xval; // Index of expandable array int Xval; // Index of expandable array
bool Strict; // Strict syntax checking
bool Comma; // Row has final comma
}; // end of class TDBJSN }; // end of class TDBJSN
/* -------------------------- JSONCOL class -------------------------- */ /* -------------------------- JSONCOL class -------------------------- */
...@@ -130,8 +133,11 @@ class JSONCOL : public DOSCOL { ...@@ -130,8 +133,11 @@ class JSONCOL : public DOSCOL {
protected: protected:
bool CheckExpand(PGLOBAL g, int i, PSZ nm, bool b); bool CheckExpand(PGLOBAL g, int i, PSZ nm, bool b);
bool SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm); bool SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm);
PJSON GetRow(PGLOBAL g, int mode); PVAL GetColumnValue(PGLOBAL g, PJSON row, int i);
PVAL ExpandArray(PGLOBAL g, PJAR arp, int n);
PVAL CalculateArray(PGLOBAL g, PJAR arp, int n);
void SetJsonValue(PGLOBAL g, PVAL vp, PJVAL val, int n); void SetJsonValue(PGLOBAL g, PVAL vp, PJVAL val, int n);
PJSON GetRow(PGLOBAL g);
// Default constructor not to be used // Default constructor not to be used
JSONCOL(void) {} JSONCOL(void) {}
...@@ -139,12 +145,10 @@ class JSONCOL : public DOSCOL { ...@@ -139,12 +145,10 @@ class JSONCOL : public DOSCOL {
// Members // Members
TDBJSN *Tjp; // To the JSN table block TDBJSN *Tjp; // To the JSN table block
PVAL MulVal; // To value used by multiple column PVAL MulVal; // To value used by multiple column
PJAR Arp; // The intermediate array
char *Jpath; // The json path char *Jpath; // The json path
JNODE *Nodes ; // The intermediate objects JNODE *Nodes; // The intermediate objects
int Nod; // The number of intermediate objects int Nod; // The number of intermediate objects
int Ival; // Index of multiple values int Xnod; // Index of multiple values
int Nx; // The last read sub-row
bool Xpd; // True for expandable column bool Xpd; // True for expandable column
bool Parsed; // True when parsed bool Parsed; // True when parsed
}; // end of class JSONCOL }; // end of class JSONCOL
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment