diff options
author | Olivier Bertrand <bertrandop@gmail.com> | 2020-12-15 12:28:03 +0100 |
---|---|---|
committer | Olivier Bertrand <bertrandop@gmail.com> | 2020-12-15 12:28:03 +0100 |
commit | ceacffbb3b9504c88d0649d472396fa42397a62c (patch) | |
tree | 958afa431d8c85373f24030bafee194b2af759a1 /storage | |
parent | aa10789f472b975f3ffae2a5adc6514a879226ba (diff) | |
download | mariadb-git-ceacffbb3b9504c88d0649d472396fa42397a62c.tar.gz |
- Fix pretty=2 Tabjson bug on INSERT.
Occuring when inserting more than one line in one statement.
modified: storage/connect/json.cpp
- Fix a wrong if statement
modified: storage/connect/tabjson.cpp
- Continue BSON implementation
modified: storage/connect/bson.cpp
modified: storage/connect/bson.h
modified: storage/connect/filamtxt.cpp
modified: storage/connect/filamtxt.h
modified: storage/connect/tabbson.cpp
modified: storage/connect/tabbson.h
- No need anymore
deleted: storage/connect/mysql-test/connect/r/bson.result
deleted: storage/connect/mysql-test/connect/t/bson.test
Diffstat (limited to 'storage')
-rw-r--r-- | storage/connect/bson.cpp | 33 | ||||
-rw-r--r-- | storage/connect/bson.h | 1 | ||||
-rw-r--r-- | storage/connect/filamtxt.cpp | 104 | ||||
-rw-r--r-- | storage/connect/filamtxt.h | 10 | ||||
-rw-r--r-- | storage/connect/json.cpp | 4 | ||||
-rw-r--r-- | storage/connect/mysql-test/connect/r/bson.result | 517 | ||||
-rw-r--r-- | storage/connect/mysql-test/connect/t/bson.test | 294 | ||||
-rw-r--r-- | storage/connect/tabbson.cpp | 127 | ||||
-rw-r--r-- | storage/connect/tabbson.h | 5 | ||||
-rw-r--r-- | storage/connect/tabjson.cpp | 2 |
10 files changed, 189 insertions, 908 deletions
diff --git a/storage/connect/bson.cpp b/storage/connect/bson.cpp index a291dd69df6..08f4dca46f2 100644 --- a/storage/connect/bson.cpp +++ b/storage/connect/bson.cpp @@ -872,7 +872,18 @@ void BJSON::SubSet(bool b) } // end of SubSet -/* ------------------------ Bobject functions ------------------------ */ +/*********************************************************************************/ +/* Set the beginning of suballocations. */ +/*********************************************************************************/ +void BJSON::MemSet(size_t size) +{ + PPOOLHEADER pph = (PPOOLHEADER)G->Sarea; + + pph->To_Free = size + sizeof(POOLHEADER); + pph->FreeBlk = G->Sarea_Size - pph->To_Free; +} // end of MemSet + + /* ------------------------ Bobject functions ------------------------ */ /***********************************************************************/ /* Sub-allocate and initialize a BPAIR. */ @@ -1187,18 +1198,17 @@ void BJSON::MergeArray(PBVAL bap1, PBVAL bap2) void BJSON::SetArrayValue(PBVAL bap, PBVAL nvp, int n) { CheckType(bap, TYPE_JAR); + int i = 0; PBVAL bvp = NULL, pvp = NULL; - if (bap->To_Val) { - for (int i = 0; bvp = GetArray(bap); i++, bvp = GetNext(bvp)) + if (bap->To_Val) + for (bvp = GetArray(bap); bvp; i++, bvp = GetNext(bvp)) if (i == n) { SetValueVal(bvp, nvp); return; } else pvp = bvp; - } // endif bap - if (!bvp) AddArrayValue(bap, MOF(nvp)); @@ -1264,7 +1274,8 @@ void BJSON::DeleteValue(PBVAL bap, int n) bap->Nd--; break; - } // endif i + } else + pvp = bvp; } // end of DeleteValue @@ -1587,17 +1598,17 @@ PBVAL BJSON::SetValue(PBVAL vlp, PVAL valp) } else switch (valp->GetType()) { case TYPE_DATE: if (((DTVAL*)valp)->IsFormatted()) - vlp->To_Val = MOF(PlugDup(G, valp->GetCharValue())); + vlp->To_Val = DupStr(valp->GetCharValue()); else { char buf[32]; - vlp->To_Val = MOF(PlugDup(G, valp->GetCharString(buf))); + vlp->To_Val = DupStr(valp->GetCharString(buf)); } // endif Formatted vlp->Type = TYPE_DTM; break; case TYPE_STRING: - vlp->To_Val = MOF(PlugDup(G, valp->GetCharValue())); + vlp->To_Val = DupStr(valp->GetCharValue()); vlp->Type = TYPE_STRG; break; case TYPE_DOUBLE: @@ -1608,7 +1619,7 @@ PBVAL BJSON::SetValue(PBVAL vlp, PVAL valp) vlp->F = (float)valp->GetFloatValue(); vlp->Type = TYPE_FLOAT; } else { - double *dp = (double*)PlugSubAlloc(G, NULL, sizeof(double)); + double *dp = (double*)BsonSubAlloc(sizeof(double)); *dp = valp->GetFloatValue(); vlp->To_Val = MOF(dp); @@ -1629,7 +1640,7 @@ PBVAL BJSON::SetValue(PBVAL vlp, PVAL valp) vlp->N = valp->GetIntValue(); vlp->Type = TYPE_INTG; } else { - longlong* llp = (longlong*)PlugSubAlloc(G, NULL, sizeof(longlong)); + longlong* llp = (longlong*)BsonSubAlloc(sizeof(longlong)); *llp = valp->GetBigintValue(); vlp->To_Val = MOF(llp); diff --git a/storage/connect/bson.h b/storage/connect/bson.h index 402981befaa..435e355d249 100644 --- a/storage/connect/bson.h +++ b/storage/connect/bson.h @@ -76,6 +76,7 @@ public: void* GetBase(void) { return Base; } void SubSet(bool b = false); void MemSave(void) {G->Saved_Size = ((PPOOLHEADER)G->Sarea)->To_Free;} + void MemSet(size_t size); void GetMsg(PGLOBAL g) { if (g != G) strcpy(g->Message, G->Message); } // SubAlloc functions diff --git a/storage/connect/filamtxt.cpp b/storage/connect/filamtxt.cpp index ef6d3ecafca..35f1102cf5d 100644 --- a/storage/connect/filamtxt.cpp +++ b/storage/connect/filamtxt.cpp @@ -805,8 +805,8 @@ int DOSFAM::ReadBuffer(PGLOBAL g) Placed = false; if (trace(2)) - htrc(" About to read: stream=%p To_Buf=%p Buflen=%d\n", - Stream, To_Buf, Buflen); + htrc(" About to read: stream=%p To_Buf=%p Buflen=%d Fpos=%d\n", + Stream, To_Buf, Buflen, Fpos); if (fgets(To_Buf, Buflen, Stream)) { p = To_Buf + strlen(To_Buf) - 1; @@ -1665,6 +1665,7 @@ void BLKFAM::Rewind(void) /* --------------------------- Class BINFAM -------------------------- */ +#if 0 /***********************************************************************/ /* BIN GetFileLength: returns file size in number of bytes. */ /***********************************************************************/ @@ -1692,7 +1693,6 @@ int BINFAM::Cardinality(PGLOBAL g) return (g) ? -1 : 0; } // end of Cardinality -#if 0 /***********************************************************************/ /* OpenTableFile: Open a DOS/UNIX table file using C standard I/Os. */ /***********************************************************************/ @@ -1742,16 +1742,34 @@ bool BINFAM::OpenTableFile(PGLOBAL g) { /***********************************************************************/ bool BINFAM::AllocateBuffer(PGLOBAL g) { - MODE mode = Tdbp->GetMode(); + MODE mode = Tdbp->GetMode(); - // Lrecl is Ok - Buflen = Lrecl; + // Lrecl is Ok + Buflen = Lrecl; - if (trace(1)) - htrc("SubAllocating a buffer of %d bytes\n", Buflen); + // Buffer will be allocated separately + if (mode == MODE_ANY) { + xtrc(1, "SubAllocating a buffer of %d bytes\n", Buflen); + To_Buf = (char*)PlugSubAlloc(g, NULL, Buflen); + } else if (UseTemp || mode == MODE_DELETE) { + // Have a big buffer to move lines + Dbflen = Buflen * DOS_BUFF_LEN; + DelBuf = PlugSubAlloc(g, NULL, Dbflen); + } // endif mode - To_Buf = (char*)PlugSubAlloc(g, NULL, Buflen); - return false; + return false; +#if 0 + MODE mode = Tdbp->GetMode(); + + // Lrecl is Ok + Dbflen = Buflen = Lrecl; + + if (trace(1)) + htrc("SubAllocating a buffer of %d bytes\n", Buflen); + + DelBuf = To_Buf = (char*)PlugSubAlloc(g, NULL, Buflen); + return false; +#endif // 0 } // end of AllocateBuffer #if 0 @@ -1830,8 +1848,8 @@ int BINFAM::ReadBuffer(PGLOBAL g) } else Placed = false; - xtrc(2, " About to read: bstream=%p To_Buf=%p Buflen=%d\n", - Stream, To_Buf, Buflen); + xtrc(2, " About to read: bstream=%p To_Buf=%p Buflen=%d Fpos=%d\n", + Stream, To_Buf, Buflen, Fpos); // Read the prefix giving the row length if (!fread(&Recsize, sizeof(size_t), 1, Stream)) { @@ -1848,7 +1866,6 @@ int BINFAM::ReadBuffer(PGLOBAL g) if (fread(To_Buf, Recsize, 1, Stream)) { xtrc(2, " Read: To_Buf=%p Recsize=%zd\n", To_Buf, Recsize); - // memcpy(Tdbp->GetLine(), To_Buf, Recsize); num_read++; rc = RC_OK; } else if (feof(Stream)) { @@ -1876,7 +1893,51 @@ int BINFAM::WriteBuffer(PGLOBAL g) int curpos = 0; bool moved = true; - /*********************************************************************/ + // T_Stream is the temporary stream or the table file stream itself + if (!T_Stream) { + if (UseTemp && Tdbp->GetMode() == MODE_UPDATE) { + if (OpenTempFile(g)) + return RC_FX; + + } else + T_Stream = Stream; + + } // endif T_Stream + + if (Tdbp->GetMode() == MODE_UPDATE) { + /*******************************************************************/ + /* Here we simply rewrite a record on itself. There are two cases */ + /* were another method should be used, a/ when Update apply to */ + /* the whole file, b/ when updating the last field of a variable */ + /* length file. The method could be to rewrite a new file, then */ + /* to erase the old one and rename the new updated file. */ + /*******************************************************************/ + curpos = ftell(Stream); + + if (trace(1)) + htrc("Last : %d cur: %d\n", Fpos, curpos); + + if (UseTemp) { + /*****************************************************************/ + /* We are using a temporary file. */ + /* Before writing the updated record, we must eventually copy */ + /* all the intermediate records that have not been updated. */ + /*****************************************************************/ + if (MoveIntermediateLines(g, &moved)) + return RC_FX; + + Spos = curpos; // New start position + } else + // Update is directly written back into the file, + // with this (fast) method, record size cannot change. + if (fseek(Stream, Fpos, SEEK_SET)) { + sprintf(g->Message, MSG(FSETPOS_ERROR), 0); + return RC_FX; + } // endif + + } // endif mode + + /*********************************************************************/ /* Prepare writing the line. */ /*********************************************************************/ //memcpy(To_Buf, Tdbp->GetLine(), Recsize); @@ -1884,17 +1945,23 @@ int BINFAM::WriteBuffer(PGLOBAL g) /*********************************************************************/ /* Now start the writing process. */ /*********************************************************************/ - if (fwrite(&Recsize, sizeof(size_t), 1, Stream) != 1) { + if (fwrite(&Recsize, sizeof(size_t), 1, T_Stream) != 1) { sprintf(g->Message, "Error %d writing prefix to %s", errno, To_File); return RC_FX; - } else if (fwrite(To_Buf, Recsize, 1, Stream) != 1) { + } else if (fwrite(To_Buf, Recsize, 1, T_Stream) != 1) { sprintf(g->Message, "Error %d writing %zd bytes to %s", errno, Recsize, To_File); return RC_FX; } // endif fwrite - xtrc(1, "write done\n"); + if (Tdbp->GetMode() == MODE_UPDATE && moved) + if (fseek(Stream, curpos, SEEK_SET)) { + sprintf(g->Message, MSG(FSEEK_ERROR), strerror(errno)); + return RC_FX; + } // endif + + xtrc(1, "Binary write done\n"); return RC_OK; } // end of WriteBuffer @@ -2023,7 +2090,6 @@ int DOSFAM::DeleteRecords(PGLOBAL g, int irc) return RC_OK; // All is correct } // end of DeleteRecords -#endif // 0 /***********************************************************************/ /* Table file close routine for DOS access method. */ @@ -2049,4 +2115,4 @@ void BINFAM::Rewind(void) Rows = 0; OldBlk = CurBlk = -1; } // end of Rewind - +#endif // 0 diff --git a/storage/connect/filamtxt.h b/storage/connect/filamtxt.h index e5067b5a3e0..353e06ad3bd 100644 --- a/storage/connect/filamtxt.h +++ b/storage/connect/filamtxt.h @@ -229,20 +229,20 @@ public: // Methods //virtual void Reset(void) {TXTFAM::Reset();} - virtual int GetFileLength(PGLOBAL g); - virtual int Cardinality(PGLOBAL g); +//virtual int GetFileLength(PGLOBAL g); +//virtual int Cardinality(PGLOBAL g); virtual int MaxBlkSize(PGLOBAL g, int s) {return s;} virtual bool AllocateBuffer(PGLOBAL g); //virtual int GetRowID(void); //virtual bool RecordPos(PGLOBAL g); //virtual bool SetPos(PGLOBAL g, int recpos); - virtual int SkipRecord(PGLOBAL g, bool header) {return 0;} + virtual int SkipRecord(PGLOBAL g, bool header) {return RC_OK;} //virtual bool OpenTableFile(PGLOBAL g); virtual int ReadBuffer(PGLOBAL g); virtual int WriteBuffer(PGLOBAL g); //virtual int DeleteRecords(PGLOBAL g, int irc); - virtual void CloseTableFile(PGLOBAL g, bool abort); - virtual void Rewind(void); +//virtual void CloseTableFile(PGLOBAL g, bool abort); +//virtual void Rewind(void); //protected: //virtual int InitDelete(PGLOBAL g, int fpos, int spos); diff --git a/storage/connect/json.cpp b/storage/connect/json.cpp index bf7ff7170ff..7c1748e0fde 100644 --- a/storage/connect/json.cpp +++ b/storage/connect/json.cpp @@ -1665,7 +1665,7 @@ void JVALUE::SetValue(PGLOBAL g, PVAL valp) } else switch (valp->GetType()) { case TYPE_DATE: if (((DTVAL*)valp)->IsFormatted()) - Strp = valp->GetCharValue(); + Strp = PlugDup(g, valp->GetCharValue()); else { char buf[32]; @@ -1675,7 +1675,7 @@ void JVALUE::SetValue(PGLOBAL g, PVAL valp) DataType = TYPE_DTM; break; case TYPE_STRING: - Strp = valp->GetCharValue(); + Strp = PlugDup(g, valp->GetCharValue()); DataType = TYPE_STRG; break; case TYPE_DOUBLE: diff --git a/storage/connect/mysql-test/connect/r/bson.result b/storage/connect/mysql-test/connect/r/bson.result deleted file mode 100644 index fd15e020aac..00000000000 --- a/storage/connect/mysql-test/connect/r/bson.result +++ /dev/null @@ -1,517 +0,0 @@ -# -# Testing doc samples -# -CREATE TABLE t1 -( -ISBN CHAR(15), -LANG CHAR(2), -SUBJECT CHAR(32), -AUTHOR CHAR(64), -TITLE CHAR(32), -TRANSLATION CHAR(32), -TRANSLATOR CHAR(80), -PUBLISHER CHAR(32), -DATEPUB int(4) -) ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='biblio.json'; -SELECT * FROM t1; -ISBN LANG SUBJECT AUTHOR TITLE TRANSLATION TRANSLATOR PUBLISHER DATEPUB -9782212090819 fr applications Jean-Christophe Bernadac, François Knab Construire une application XML NULL NULL Eyrolles Paris 1999 -9782840825685 fr applications William J. Pardi XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 1999 -DROP TABLE t1; -# -# Testing Jpath. Get the number of authors -# -CREATE TABLE t1 -( -ISBN CHAR(15), -Language CHAR(2) JPATH='$.LANG', -Subject CHAR(32) JPATH='$.SUBJECT', -Authors INT(2) JPATH='$.AUTHOR[#]', -Title CHAR(32) JPATH='$.TITLE', -Translation CHAR(32) JPATH='$.TRANSLATION', -Translator CHAR(80) JPATH='$.TRANSLATOR', -Publisher CHAR(20) JPATH='$.PUBLISHER.NAME', -Location CHAR(16) JPATH='$.PUBLISHER.PLACE', -Year int(4) JPATH='$.DATEPUB' -) -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='biblio.json'; -SELECT * FROM t1; -ISBN Language Subject Authors Title Translation Translator Publisher Location Year -9782212090819 fr applications 2 Construire une application XML NULL NULL Eyrolles Paris 1999 -9782840825685 fr applications 1 XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 1999 -DROP TABLE t1; -# -# Concatenates the authors -# -CREATE TABLE t1 -( -ISBN CHAR(15), -Language CHAR(2) JPATH='$.LANG', -Subject CHAR(32) JPATH='$.SUBJECT', -AuthorFN CHAR(128) JPATH='$.AUTHOR[" and "].FIRSTNAME', -AuthorLN CHAR(128) JPATH='$.AUTHOR[" and "].LASTNAME', -Title CHAR(32) JPATH='$.TITLE', -Translation CHAR(32) JPATH='$.TRANSLATION', -Translator CHAR(80) JPATH='$.TRANSLATOR', -Publisher CHAR(20) JPATH='$.PUBLISHER.NAME', -Location CHAR(16) JPATH='$.PUBLISHER.PLACE', -Year int(4) JPATH='$.DATEPUB' -) -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='biblio.json'; -SELECT * FROM t1; -ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year -9782212090819 fr applications Jean-Christophe and François Bernadac and Knab Construire une application XML NULL NULL Eyrolles Paris 1999 -9782840825685 fr applications William J. Pardi XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 1999 -DROP TABLE t1; -# -# Testing expanding authors -# -CREATE TABLE t1 -( -ISBN CHAR(15), -Language CHAR(2) JPATH='$.LANG', -Subject CHAR(32) JPATH='$.SUBJECT', -AuthorFN CHAR(128) JPATH='$.AUTHOR[*].FIRSTNAME', -AuthorLN CHAR(128) JPATH='$.AUTHOR[*].LASTNAME', -Title CHAR(32) JPATH='$.TITLE', -Translation CHAR(32) JPATH='$.TRANSLATION', -Translator CHAR(80) JPATH='$.TRANSLATOR', -Publisher CHAR(20) JPATH='$.PUBLISHER.NAME', -Location CHAR(16) JPATH='$.PUBLISHER.PLACE', -Year int(4) JPATH='$.DATEPUB' -) -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='biblio.json'; -SELECT * FROM t1; -ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year -9782212090819 fr applications Jean-Christophe Bernadac Construire une application XML NULL NULL Eyrolles Paris 1999 -9782212090819 fr applications François Knab Construire une application XML NULL NULL Eyrolles Paris 1999 -9782840825685 fr applications William J. Pardi XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 1999 -UPDATE t1 SET AuthorFN = 'Philippe' WHERE AuthorLN = 'Knab'; -SELECT * FROM t1 WHERE ISBN = '9782212090819'; -ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year -9782212090819 fr applications Jean-Christophe Bernadac Construire une application XML NULL NULL Eyrolles Paris 1999 -9782212090819 fr applications Philippe Knab Construire une application XML NULL NULL Eyrolles Paris 1999 -# -# To add an author a new table must be created -# -CREATE TABLE t2 ( -FIRSTNAME CHAR(32), -LASTNAME CHAR(32)) -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='biblio.json' OPTION_LIST='Object=$[1].AUTHOR'; -SELECT * FROM t2; -FIRSTNAME LASTNAME -William J. Pardi -INSERT INTO t2 VALUES('Charles','Dickens'); -SELECT * FROM t1; -ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year -9782212090819 fr applications Jean-Christophe Bernadac Construire une application XML NULL NULL Eyrolles Paris 1999 -9782212090819 fr applications Philippe Knab Construire une application XML NULL NULL 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 Charles Dickens XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 1999 -DROP TABLE t1; -DROP TABLE t2; -# -# Check the biblio file has the good format -# -CREATE TABLE t1 -( -line char(255) -) -ENGINE=CONNECT TABLE_TYPE=DOS FILE_NAME='biblio.json'; -SELECT * FROM t1; -line -[ - { - "ISBN": "9782212090819", - "LANG": "fr", - "SUBJECT": "applications", - "AUTHOR": [ - { - "FIRSTNAME": "Jean-Christophe", - "LASTNAME": "Bernadac" - }, - { - "FIRSTNAME": "Philippe", - "LASTNAME": "Knab" - } - ], - "TITLE": "Construire une application XML", - "PUBLISHER": { - "NAME": "Eyrolles", - "PLACE": "Paris" - }, - "DATEPUB": 1999 - }, - { - "ISBN": "9782840825685", - "LANG": "fr", - "SUBJECT": "applications", - "AUTHOR": [ - { - "FIRSTNAME": "William J.", - "LASTNAME": "Pardi" - }, - { - "FIRSTNAME": "Charles", - "LASTNAME": "Dickens" - } - ], - "TITLE": "XML en Action", - "TRANSLATION": "adapté de l'anglais par", - "TRANSLATOR": { - "FIRSTNAME": "James", - "LASTNAME": "Guerin" - }, - "PUBLISHER": { - "NAME": "Microsoft Press", - "PLACE": "Paris" - }, - "DATEPUB": 1999 - } -] -DROP TABLE t1; -# -# Testing a pretty=0 file -# -CREATE TABLE t1 -( -ISBN CHAR(15) NOT NULL, -Language CHAR(2) JPATH='$.LANG', -Subject CHAR(32) JPATH='$.SUBJECT', -AuthorFN CHAR(128) JPATH='$.AUTHOR[*].FIRSTNAME', -AuthorLN CHAR(128) JPATH='$.AUTHOR[*].LASTNAME', -Title CHAR(32) JPATH='$.TITLE', -Translation CHAR(32) JPATH='$.TRANSLATED.PREFIX', -TranslatorFN CHAR(80) JPATH='$.TRANSLATED.TRANSLATOR.FIRSTNAME', -TranslatorLN CHAR(80) JPATH='$.TRANSLATED.TRANSLATOR.LASTNAME', -Publisher CHAR(20) JPATH='$.PUBLISHER.NAME', -Location CHAR(16) JPATH='$.PUBLISHER.PLACE', -Year int(4) JPATH='$.DATEPUB', -INDEX IX(ISBN) -) -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='bib0.json' LRECL=320 OPTION_LIST='Pretty=0'; -SHOW INDEX FROM t1; -Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment -t1 1 IX 1 ISBN A NULL NULL NULL XINDEX -SELECT * FROM t1; -ISBN Language Subject AuthorFN AuthorLN Title Translation TranslatorFN TranslatorLN Publisher Location Year -9782212090819 fr applications Jean-Michel Bernadac Construire une application XML NULL NULL NULL Eyrolles Paris 1999 -9782212090819 fr applications François Knab Construire une application XML NULL NULL NULL Eyrolles Paris 1999 -9782840825685 fr applications William J. Pardi XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 2001 -DESCRIBE SELECT * FROM t1 WHERE ISBN = '9782212090819'; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ref IX IX 15 const 1 Using where -UPDATE t1 SET AuthorFN = 'Philippe' WHERE ISBN = '9782212090819'; -ERROR HY000: Got error 122 'Cannot write expanded column when Pretty is not 2' from CONNECT -DROP TABLE t1; -# -# A file with 2 arrays -# -CREATE TABLE t1 ( -WHO CHAR(12), -WEEK INT(2) JPATH='$.WEEK[*].NUMBER', -WHAT CHAR(32) JPATH='$.WEEK[].EXPENSE["+"].WHAT', -AMOUNT DOUBLE(8,2) JPATH='$.WEEK[].EXPENSE[+].AMOUNT') -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='expense.json'; -SELECT * FROM t1; -WHO WEEK WHAT AMOUNT -Joe 3 Beer+Food+Food+Car 69.00 -Joe 4 Beer+Beer+Food+Food+Beer 83.00 -Joe 5 Beer+Food 26.00 -Beth 3 Beer 16.00 -Beth 4 Food+Beer 32.00 -Beth 5 Food+Beer 32.00 -Janet 3 Car+Food+Beer 55.00 -Janet 4 Car 17.00 -Janet 5 Beer+Car+Beer+Food 57.00 -DROP TABLE t1; -# -# Now it can be fully expanded -# -CREATE TABLE t1 ( -WHO CHAR(12), -WEEK INT(2) JPATH='$.WEEK[*].NUMBER', -WHAT CHAR(32) JPATH='$.WEEK[*].EXPENSE[*].WHAT', -AMOUNT DOUBLE(8,2) JPATH='$.WEEK[*].EXPENSE[*].AMOUNT') -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='expense.json'; -SELECT * FROM t1; -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; -# -# A table showing many calculated results -# -CREATE TABLE t1 ( -WHO CHAR(12) NOT NULL, -WEEKS CHAR(12) NOT NULL JPATH='$.WEEK[", "].NUMBER', -SUMS CHAR(64) NOT NULL JPATH='$.WEEK["+"].EXPENSE[+].AMOUNT', -SUM DOUBLE(8,2) NOT NULL JPATH='$.WEEK[+].EXPENSE[+].AMOUNT', -AVGS CHAR(64) NOT NULL JPATH='$.WEEK["+"].EXPENSE[!].AMOUNT', -SUMAVG DOUBLE(8,2) NOT NULL JPATH='$.WEEK[+].EXPENSE[!].AMOUNT', -AVGSUM DOUBLE(8,2) NOT NULL JPATH='$.WEEK[!].EXPENSE[+].AMOUNT', -AVGAVG DOUBLE(8,2) NOT NULL JPATH='$.WEEK[!].EXPENSE[!].AMOUNT', -AVERAGE DOUBLE(8,2) NOT NULL JPATH='$.WEEK[!].EXPENSE[*].AMOUNT') -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='expense.json'; -SELECT * FROM t1; -WHO WEEKS SUMS SUM AVGS SUMAVG AVGSUM AVGAVG AVERAGE -Joe 3, 4, 5 69.00+83.00+26.00 178.00 17.25+16.60+13.00 46.85 59.33 15.62 16.18 -Beth 3, 4, 5 16.00+32.00+32.00 80.00 16.00+16.00+16.00 48.00 26.67 16.00 16.00 -Janet 3, 4, 5 55.00+17.00+57.00 129.00 18.33+17.00+14.25 49.58 43.00 16.53 16.12 -DROP TABLE t1; -# -# Expand expense in 3 one week tables -# -CREATE TABLE t2 ( -WHO CHAR(12), -WEEK INT(2) JPATH='$.WEEK[0].NUMBER', -WHAT CHAR(32) JPATH='$.WEEK[0].EXPENSE[*].WHAT', -AMOUNT DOUBLE(8,2) JPATH='$.WEEK[0].EXPENSE[*].AMOUNT') -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='expense.json'; -SELECT * FROM t2; -WHO WEEK WHAT AMOUNT -Joe 3 Beer 18.00 -Joe 3 Food 12.00 -Joe 3 Food 19.00 -Joe 3 Car 20.00 -Beth 3 Beer 16.00 -Janet 3 Car 19.00 -Janet 3 Food 18.00 -Janet 3 Beer 18.00 -CREATE TABLE t3 ( -WHO CHAR(12), -WEEK INT(2) JPATH='$.WEEK[1].NUMBER', -WHAT CHAR(32) JPATH='$.WEEK[1].EXPENSE[*].WHAT', -AMOUNT DOUBLE(8,2) JPATH='$.WEEK[1].EXPENSE[*].AMOUNT') -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='expense.json'; -SELECT * FROM t3; -WHO WEEK WHAT AMOUNT -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 -Beth 4 Food 17.00 -Beth 4 Beer 15.00 -Janet 4 Car 17.00 -CREATE TABLE t4 ( -WHO CHAR(12), -WEEK INT(2) JPATH='$.WEEK[2].NUMBER', -WHAT CHAR(32) JPATH='$.WEEK[2].EXPENSE[*].WHAT', -AMOUNT DOUBLE(8,2) JPATH='$.WEEK[2].EXPENSE[*].AMOUNT') -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='expense.json'; -SELECT * FROM t4; -WHO WEEK WHAT AMOUNT -Joe 5 Beer 14.00 -Joe 5 Food 12.00 -Beth 5 Food 12.00 -Beth 5 Beer 20.00 -Janet 5 Beer 14.00 -Janet 5 Car 12.00 -Janet 5 Beer 19.00 -Janet 5 Food 12.00 -# -# The expanded table is made as a TBL table -# -CREATE TABLE t1 ( -WHO CHAR(12), -WEEK INT(2), -WHAT CHAR(32), -AMOUNT DOUBLE(8,2)) -ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t2,t3,t4'; -SELECT * FROM t1; -WHO WEEK WHAT AMOUNT -Joe 3 Beer 18.00 -Joe 3 Food 12.00 -Joe 3 Food 19.00 -Joe 3 Car 20.00 -Beth 3 Beer 16.00 -Janet 3 Car 19.00 -Janet 3 Food 18.00 -Janet 3 Beer 18.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 -Beth 4 Food 17.00 -Beth 4 Beer 15.00 -Janet 4 Car 17.00 -Joe 5 Beer 14.00 -Joe 5 Food 12.00 -Beth 5 Food 12.00 -Beth 5 Beer 20.00 -Janet 5 Beer 14.00 -Janet 5 Car 12.00 -Janet 5 Beer 19.00 -Janet 5 Food 12.00 -DROP TABLE t1, t2, t3, t4; -# -# Three partial JSON tables -# -CREATE TABLE t2 ( -WHO CHAR(12), -WEEK INT(2), -WHAT CHAR(32) JPATH='$.EXPENSE[*].WHAT', -AMOUNT DOUBLE(8,2) JPATH='$.EXPENSE.[*].AMOUNT') -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='mulexp3.json'; -SELECT * FROM t2; -WHO WEEK WHAT AMOUNT -Joe 3 Beer 18.00 -Joe 3 Food 12.00 -Joe 3 Food 19.00 -Joe 3 Car 20.00 -Beth 3 Beer 16.00 -Janet 3 Car 19.00 -Janet 3 Food 18.00 -Janet 3 Beer 18.00 -CREATE TABLE t3 ( -WHO CHAR(12), -WEEK INT(2), -WHAT CHAR(32) JPATH='$.EXPENSE[*].WHAT', -AMOUNT DOUBLE(8,2) JPATH='$.EXPENSE.[*].AMOUNT') -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='mulexp4.json'; -SELECT * FROM t3; -WHO WEEK WHAT AMOUNT -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 -Beth 4 Food 17.00 -Beth 4 Beer 15.00 -Janet 4 Car 17.00 -CREATE TABLE t4 ( -WHO CHAR(12), -WEEK INT(2), -WHAT CHAR(32) JPATH='$.EXPENSE[*].WHAT', -AMOUNT DOUBLE(8,2) JPATH='$.EXPENSE.[*].AMOUNT') -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='mulexp5.json'; -SELECT * FROM t4; -WHO WEEK WHAT AMOUNT -Joe 5 Beer 14.00 -Joe 5 Food 12.00 -Beth 5 Food 12.00 -Beth 5 Beer 20.00 -Janet 5 Beer 14.00 -Janet 5 Car 12.00 -Janet 5 Beer 19.00 -Janet 5 Food 12.00 -# -# The complete table can be a multiple JSON table -# -CREATE TABLE t1 ( -WHO CHAR(12), -WEEK INT(2), -WHAT CHAR(32) JPATH='$.EXPENSE[*].WHAT', -AMOUNT DOUBLE(8,2) JPATH='$.EXPENSE.[*].AMOUNT') -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='mulexp*.json' MULTIPLE=1; -SELECT * FROM t1 ORDER BY WHO, WEEK, WHAT, AMOUNT; -WHO WEEK WHAT AMOUNT -Beth 3 Beer 16.00 -Beth 4 Beer 15.00 -Beth 4 Food 17.00 -Beth 5 Beer 20.00 -Beth 5 Food 12.00 -Janet 3 Beer 18.00 -Janet 3 Car 19.00 -Janet 3 Food 18.00 -Janet 4 Car 17.00 -Janet 5 Beer 14.00 -Janet 5 Beer 19.00 -Janet 5 Car 12.00 -Janet 5 Food 12.00 -Joe 3 Beer 18.00 -Joe 3 Car 20.00 -Joe 3 Food 12.00 -Joe 3 Food 19.00 -Joe 4 Beer 14.00 -Joe 4 Beer 16.00 -Joe 4 Beer 19.00 -Joe 4 Food 17.00 -Joe 4 Food 17.00 -Joe 5 Beer 14.00 -Joe 5 Food 12.00 -DROP TABLE t1; -# -# Or also a partition JSON table -# -CREATE TABLE t1 ( -WHO CHAR(12), -WEEK INT(2), -WHAT CHAR(32) JPATH='$.EXPENSE[*].WHAT', -AMOUNT DOUBLE(8,2) JPATH='$.EXPENSE.[*].AMOUNT') -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='mulexp%s.json'; -ALTER TABLE t1 -PARTITION BY LIST COLUMNS(WEEK) ( -PARTITION `3` VALUES IN(3), -PARTITION `4` VALUES IN(4), -PARTITION `5` VALUES IN(5)); -Warnings: -Warning 1105 Data repartition in 3 is unchecked -Warning 1105 Data repartition in 4 is unchecked -Warning 1105 Data repartition in 5 is unchecked -SHOW WARNINGS; -Level Code Message -Warning 1105 Data repartition in 3 is unchecked -Warning 1105 Data repartition in 4 is unchecked -Warning 1105 Data repartition in 5 is unchecked -SELECT * FROM t1; -WHO WEEK WHAT AMOUNT -Joe 3 Beer 18.00 -Joe 3 Food 12.00 -Joe 3 Food 19.00 -Joe 3 Car 20.00 -Beth 3 Beer 16.00 -Janet 3 Car 19.00 -Janet 3 Food 18.00 -Janet 3 Beer 18.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 -Beth 4 Food 17.00 -Beth 4 Beer 15.00 -Janet 4 Car 17.00 -Joe 5 Beer 14.00 -Joe 5 Food 12.00 -Beth 5 Food 12.00 -Beth 5 Beer 20.00 -Janet 5 Beer 14.00 -Janet 5 Car 12.00 -Janet 5 Beer 19.00 -Janet 5 Food 12.00 -SELECT * FROM t1 WHERE WEEK = 4; -WHO WEEK WHAT AMOUNT -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 -Beth 4 Food 17.00 -Beth 4 Beer 15.00 -Janet 4 Car 17.00 -DROP TABLE t1, t2, t3, t4; diff --git a/storage/connect/mysql-test/connect/t/bson.test b/storage/connect/mysql-test/connect/t/bson.test deleted file mode 100644 index ab38cab73fc..00000000000 --- a/storage/connect/mysql-test/connect/t/bson.test +++ /dev/null @@ -1,294 +0,0 @@ ---source include/not_embedded.inc ---source include/have_partition.inc - -let $MYSQLD_DATADIR= `select @@datadir`; - ---copy_file $MTR_SUITE_DIR/std_data/biblio.json $MYSQLD_DATADIR/test/biblio.json ---copy_file $MTR_SUITE_DIR/std_data/bib0.json $MYSQLD_DATADIR/test/bib0.json ---copy_file $MTR_SUITE_DIR/std_data/expense.json $MYSQLD_DATADIR/test/expense.json ---copy_file $MTR_SUITE_DIR/std_data/mulexp3.json $MYSQLD_DATADIR/test/mulexp3.json ---copy_file $MTR_SUITE_DIR/std_data/mulexp4.json $MYSQLD_DATADIR/test/mulexp4.json ---copy_file $MTR_SUITE_DIR/std_data/mulexp5.json $MYSQLD_DATADIR/test/mulexp5.json - ---echo # ---echo # Testing doc samples ---echo # -CREATE TABLE t1 -( - ISBN CHAR(15), - LANG CHAR(2), - SUBJECT CHAR(32), - AUTHOR CHAR(64), - TITLE CHAR(32), - TRANSLATION CHAR(32), - TRANSLATOR CHAR(80), - PUBLISHER CHAR(32), - DATEPUB int(4) -) ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='biblio.json'; -SELECT * FROM t1; -DROP TABLE t1; - - ---echo # ---echo # Testing Jpath. Get the number of authors ---echo # -CREATE TABLE t1 -( - ISBN CHAR(15), - Language CHAR(2) JPATH='$.LANG', - Subject CHAR(32) JPATH='$.SUBJECT', - Authors INT(2) JPATH='$.AUTHOR[#]', - Title CHAR(32) JPATH='$.TITLE', - Translation CHAR(32) JPATH='$.TRANSLATION', - Translator CHAR(80) JPATH='$.TRANSLATOR', - Publisher CHAR(20) JPATH='$.PUBLISHER.NAME', - Location CHAR(16) JPATH='$.PUBLISHER.PLACE', - Year int(4) JPATH='$.DATEPUB' -) -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='biblio.json'; -SELECT * FROM t1; -DROP TABLE t1; - ---echo # ---echo # Concatenates the authors ---echo # -CREATE TABLE t1 -( - ISBN CHAR(15), - Language CHAR(2) JPATH='$.LANG', - Subject CHAR(32) JPATH='$.SUBJECT', - AuthorFN CHAR(128) JPATH='$.AUTHOR[" and "].FIRSTNAME', - AuthorLN CHAR(128) JPATH='$.AUTHOR[" and "].LASTNAME', - Title CHAR(32) JPATH='$.TITLE', - Translation CHAR(32) JPATH='$.TRANSLATION', - Translator CHAR(80) JPATH='$.TRANSLATOR', - Publisher CHAR(20) JPATH='$.PUBLISHER.NAME', - Location CHAR(16) JPATH='$.PUBLISHER.PLACE', - Year int(4) JPATH='$.DATEPUB' -) -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='biblio.json'; -SELECT * FROM t1; -DROP TABLE t1; - ---echo # ---echo # Testing expanding authors ---echo # -CREATE TABLE t1 -( - ISBN CHAR(15), - Language CHAR(2) JPATH='$.LANG', - Subject CHAR(32) JPATH='$.SUBJECT', - AuthorFN CHAR(128) JPATH='$.AUTHOR[*].FIRSTNAME', - AuthorLN CHAR(128) JPATH='$.AUTHOR[*].LASTNAME', - Title CHAR(32) JPATH='$.TITLE', - Translation CHAR(32) JPATH='$.TRANSLATION', - Translator CHAR(80) JPATH='$.TRANSLATOR', - Publisher CHAR(20) JPATH='$.PUBLISHER.NAME', - Location CHAR(16) JPATH='$.PUBLISHER.PLACE', - Year int(4) JPATH='$.DATEPUB' -) -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='biblio.json'; -SELECT * FROM t1; -UPDATE t1 SET AuthorFN = 'Philippe' WHERE AuthorLN = 'Knab'; -SELECT * FROM t1 WHERE ISBN = '9782212090819'; - ---echo # ---echo # To add an author a new table must be created ---echo # -CREATE TABLE t2 ( -FIRSTNAME CHAR(32), -LASTNAME CHAR(32)) -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='biblio.json' OPTION_LIST='Object=$[1].AUTHOR'; -SELECT * FROM t2; -INSERT INTO t2 VALUES('Charles','Dickens'); -SELECT * FROM t1; -DROP TABLE t1; -DROP TABLE t2; - ---echo # ---echo # Check the biblio file has the good format ---echo # -CREATE TABLE t1 -( - line char(255) -) -ENGINE=CONNECT TABLE_TYPE=DOS FILE_NAME='biblio.json'; -SELECT * FROM t1; -DROP TABLE t1; - ---echo # ---echo # Testing a pretty=0 file ---echo # -CREATE TABLE t1 -( - ISBN CHAR(15) NOT NULL, - Language CHAR(2) JPATH='$.LANG', - Subject CHAR(32) JPATH='$.SUBJECT', - AuthorFN CHAR(128) JPATH='$.AUTHOR[*].FIRSTNAME', - AuthorLN CHAR(128) JPATH='$.AUTHOR[*].LASTNAME', - Title CHAR(32) JPATH='$.TITLE', - Translation CHAR(32) JPATH='$.TRANSLATED.PREFIX', - TranslatorFN CHAR(80) JPATH='$.TRANSLATED.TRANSLATOR.FIRSTNAME', - TranslatorLN CHAR(80) JPATH='$.TRANSLATED.TRANSLATOR.LASTNAME', - Publisher CHAR(20) JPATH='$.PUBLISHER.NAME', - Location CHAR(16) JPATH='$.PUBLISHER.PLACE', - Year int(4) JPATH='$.DATEPUB', - INDEX IX(ISBN) -) -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='bib0.json' LRECL=320 OPTION_LIST='Pretty=0'; -SHOW INDEX FROM t1; -SELECT * FROM t1; -DESCRIBE SELECT * FROM t1 WHERE ISBN = '9782212090819'; ---error ER_GET_ERRMSG -UPDATE t1 SET AuthorFN = 'Philippe' WHERE ISBN = '9782212090819'; -DROP TABLE t1; - ---echo # ---echo # A file with 2 arrays ---echo # -CREATE TABLE t1 ( -WHO CHAR(12), -WEEK INT(2) JPATH='$.WEEK[*].NUMBER', -WHAT CHAR(32) JPATH='$.WEEK[].EXPENSE["+"].WHAT', -AMOUNT DOUBLE(8,2) JPATH='$.WEEK[].EXPENSE[+].AMOUNT') -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='expense.json'; -SELECT * FROM t1; -DROP TABLE t1; - ---echo # ---echo # Now it can be fully expanded ---echo # -CREATE TABLE t1 ( -WHO CHAR(12), -WEEK INT(2) JPATH='$.WEEK[*].NUMBER', -WHAT CHAR(32) JPATH='$.WEEK[*].EXPENSE[*].WHAT', -AMOUNT DOUBLE(8,2) JPATH='$.WEEK[*].EXPENSE[*].AMOUNT') -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='expense.json'; -#--error ER_GET_ERRMSG -SELECT * FROM t1; -DROP TABLE t1; - ---echo # ---echo # A table showing many calculated results ---echo # -CREATE TABLE t1 ( -WHO CHAR(12) NOT NULL, -WEEKS CHAR(12) NOT NULL JPATH='$.WEEK[", "].NUMBER', -SUMS CHAR(64) NOT NULL JPATH='$.WEEK["+"].EXPENSE[+].AMOUNT', -SUM DOUBLE(8,2) NOT NULL JPATH='$.WEEK[+].EXPENSE[+].AMOUNT', -AVGS CHAR(64) NOT NULL JPATH='$.WEEK["+"].EXPENSE[!].AMOUNT', -SUMAVG DOUBLE(8,2) NOT NULL JPATH='$.WEEK[+].EXPENSE[!].AMOUNT', -AVGSUM DOUBLE(8,2) NOT NULL JPATH='$.WEEK[!].EXPENSE[+].AMOUNT', -AVGAVG DOUBLE(8,2) NOT NULL JPATH='$.WEEK[!].EXPENSE[!].AMOUNT', -AVERAGE DOUBLE(8,2) NOT NULL JPATH='$.WEEK[!].EXPENSE[*].AMOUNT') -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='expense.json'; -SELECT * FROM t1; -DROP TABLE t1; - ---echo # ---echo # Expand expense in 3 one week tables ---echo # -CREATE TABLE t2 ( -WHO CHAR(12), -WEEK INT(2) JPATH='$.WEEK[0].NUMBER', -WHAT CHAR(32) JPATH='$.WEEK[0].EXPENSE[*].WHAT', -AMOUNT DOUBLE(8,2) JPATH='$.WEEK[0].EXPENSE[*].AMOUNT') -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='expense.json'; -SELECT * FROM t2; - -CREATE TABLE t3 ( -WHO CHAR(12), -WEEK INT(2) JPATH='$.WEEK[1].NUMBER', -WHAT CHAR(32) JPATH='$.WEEK[1].EXPENSE[*].WHAT', -AMOUNT DOUBLE(8,2) JPATH='$.WEEK[1].EXPENSE[*].AMOUNT') -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='expense.json'; -SELECT * FROM t3; - -CREATE TABLE t4 ( -WHO CHAR(12), -WEEK INT(2) JPATH='$.WEEK[2].NUMBER', -WHAT CHAR(32) JPATH='$.WEEK[2].EXPENSE[*].WHAT', -AMOUNT DOUBLE(8,2) JPATH='$.WEEK[2].EXPENSE[*].AMOUNT') -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='expense.json'; -SELECT * FROM t4; - ---echo # ---echo # The expanded table is made as a TBL table ---echo # -CREATE TABLE t1 ( -WHO CHAR(12), -WEEK INT(2), -WHAT CHAR(32), -AMOUNT DOUBLE(8,2)) -ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t2,t3,t4'; -SELECT * FROM t1; -DROP TABLE t1, t2, t3, t4; - ---echo # ---echo # Three partial JSON tables ---echo # -CREATE TABLE t2 ( -WHO CHAR(12), -WEEK INT(2), -WHAT CHAR(32) JPATH='$.EXPENSE[*].WHAT', -AMOUNT DOUBLE(8,2) JPATH='$.EXPENSE.[*].AMOUNT') -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='mulexp3.json'; -SELECT * FROM t2; - -CREATE TABLE t3 ( -WHO CHAR(12), -WEEK INT(2), -WHAT CHAR(32) JPATH='$.EXPENSE[*].WHAT', -AMOUNT DOUBLE(8,2) JPATH='$.EXPENSE.[*].AMOUNT') -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='mulexp4.json'; -SELECT * FROM t3; - -CREATE TABLE t4 ( -WHO CHAR(12), -WEEK INT(2), -WHAT CHAR(32) JPATH='$.EXPENSE[*].WHAT', -AMOUNT DOUBLE(8,2) JPATH='$.EXPENSE.[*].AMOUNT') -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='mulexp5.json'; -SELECT * FROM t4; - ---echo # ---echo # The complete table can be a multiple JSON table ---echo # -CREATE TABLE t1 ( -WHO CHAR(12), -WEEK INT(2), -WHAT CHAR(32) JPATH='$.EXPENSE[*].WHAT', -AMOUNT DOUBLE(8,2) JPATH='$.EXPENSE.[*].AMOUNT') -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='mulexp*.json' MULTIPLE=1; -SELECT * FROM t1 ORDER BY WHO, WEEK, WHAT, AMOUNT; -DROP TABLE t1; - ---echo # ---echo # Or also a partition JSON table ---echo # -CREATE TABLE t1 ( -WHO CHAR(12), -WEEK INT(2), -WHAT CHAR(32) JPATH='$.EXPENSE[*].WHAT', -AMOUNT DOUBLE(8,2) JPATH='$.EXPENSE.[*].AMOUNT') -ENGINE=CONNECT TABLE_TYPE=BSON FILE_NAME='mulexp%s.json'; -ALTER TABLE t1 -PARTITION BY LIST COLUMNS(WEEK) ( -PARTITION `3` VALUES IN(3), -PARTITION `4` VALUES IN(4), -PARTITION `5` VALUES IN(5)); -SHOW WARNINGS; -SELECT * FROM t1; -SELECT * FROM t1 WHERE WEEK = 4; -DROP TABLE t1, t2, t3, t4; - -# -# Clean up -# ---remove_file $MYSQLD_DATADIR/test/biblio.json ---remove_file $MYSQLD_DATADIR/test/bib0.dnx ---remove_file $MYSQLD_DATADIR/test/bib0.json ---remove_file $MYSQLD_DATADIR/test/expense.json ---remove_file $MYSQLD_DATADIR/test/mulexp3.json ---remove_file $MYSQLD_DATADIR/test/mulexp4.json ---remove_file $MYSQLD_DATADIR/test/mulexp5.json diff --git a/storage/connect/tabbson.cpp b/storage/connect/tabbson.cpp index c1647604b63..454484fc610 100644 --- a/storage/connect/tabbson.cpp +++ b/storage/connect/tabbson.cpp @@ -634,29 +634,28 @@ PBVAL BTUTIL::ParseLine(PGLOBAL g, int *pretty, bool *comma) /***********************************************************************/ /* Make the top tree from the object path. */ /***********************************************************************/ -PBVAL BTUTIL::MakeTopTree(PGLOBAL g, PBVAL jsp) +PBVAL BTUTIL::MakeTopTree(PGLOBAL g, int type) { - PBVAL top = NULL; + PBVAL top = NULL, val = NULL; if (Tp->Objname) { - if (!Tp->Val) { - // Parse and allocate Objname item(s) + if (!Tp->Row) { + // Parse and allocate Objpath item(s) char* p; - char* objpath = PlugDup(g, Tp->Objname); + char *objpath = PlugDup(g, Tp->Objname); int i; PBVAL objp = NULL; PBVAL arp = NULL; - PBVAL val = NULL; for (; objpath; objpath = p) { if ((p = strchr(objpath, Tp->Sep))) *p++ = 0; if (*objpath != '[' && !IsNum(objpath)) { - // objp = new(g) JOBJECT; + objp = NewVal(TYPE_JOB); if (!top) - top = NewVal(TYPE_JOB); + top = objp; if (val) SetValueObj(val, objp); @@ -687,12 +686,12 @@ PBVAL BTUTIL::MakeTopTree(PGLOBAL g, PBVAL jsp) } // endfor p - Tp->Val = val; } // endif Val - SetValueVal(Tp->Val, jsp); + Tp->Row = val; + Tp->Row->Type = type; } else - top = jsp; + top = Tp->Row = NewVal(type); return top; } // end of MakeTopTree @@ -1270,7 +1269,6 @@ TDBBSN::TDBBSN(PGLOBAL g, PBDEF tdp, PTXF txfp) : TDBDOS(tdp, txfp) Bp = new(g) BTUTIL(tdp->G, this); Top = NULL; Row = NULL; - Val = NULL; Colp = NULL; if (tdp) { @@ -1306,7 +1304,6 @@ TDBBSN::TDBBSN(TDBBSN* tdbp) : TDBDOS(NULL, tdbp) Bp = tdbp->Bp; Top = tdbp->Top; Row = tdbp->Row; - Val = tdbp->Val; Colp = tdbp->Colp; Jmode = tdbp->Jmode; Objname = tdbp->Objname; @@ -1413,11 +1410,6 @@ bool TDBBSN::OpenDB(PGLOBAL g) { TUSE use = Use; - if (Pretty < 0 && Mode == MODE_UPDATE) { - sprintf(g->Message, "Mode %d NIY for Bjson", Mode); - return true; - } // endif Mode - if (Use == USE_OPEN) { /*******************************************************************/ /* Table already open replace it at its beginning. ??? */ @@ -1437,19 +1429,20 @@ bool TDBBSN::OpenDB(PGLOBAL g) return false; if (Pretty < 0) { - /*******************************************************************/ - /* Binary BJSON table. */ - /*******************************************************************/ + /*********************************************************************/ + /* Binary BJSON table. */ + /*********************************************************************/ xtrc(1, "JSN OpenDB: tdbp=%p tdb=R%d use=%d mode=%d\n", this, Tdb_No, Use, Mode); - /*********************************************************************/ - /* Lrecl is Ok. */ - /*********************************************************************/ + // Lrecl is Ok size_t linelen = Lrecl; + MODE mode = Mode; - // Buffer must be set to G->Sarea + // Buffer must be allocated in G->Sarea + Mode = MODE_ANY; Txfp->AllocateBuffer(Bp->G); + Mode = mode; if (Mode == MODE_INSERT) Bp->SubSet(true); @@ -1461,27 +1454,29 @@ bool TDBBSN::OpenDB(PGLOBAL g) xtrc(1, "OpenJSN: R%hd mode=%d To_Line=%p\n", Tdb_No, Mode, To_Line); } // endif Pretty - /***********************************************************************/ - /* First opening. */ - /***********************************************************************/ + /***********************************************************************/ + /* First opening. */ + /***********************************************************************/ if (Mode == MODE_INSERT) { + int type; + switch (Jmode) { - case MODE_OBJECT: Row = Bp->NewVal(TYPE_JOB); break; - case MODE_ARRAY: Row = Bp->NewVal(TYPE_JAR); break; - case MODE_VALUE: Row = Bp->NewVal(TYPE_JVAL); break; - default: - sprintf(g->Message, "Invalid Jmode %d", Jmode); - return true; + case MODE_OBJECT: type = TYPE_JOB; break; + case MODE_ARRAY: type = TYPE_JAR; break; + case MODE_VALUE: type = TYPE_JVAL; break; + default: + sprintf(g->Message, "Invalid Jmode %d", Jmode); + return true; } // endswitch Jmode + Top = Bp->MakeTopTree(g, type); Bp->MemSave(); } // endif Mode if (Xcol) - To_Filter = NULL; // Imcompatible + To_Filter = NULL; // Not compatible return false; - } // end of OpenDB /***********************************************************************/ @@ -1534,6 +1529,7 @@ int TDBBSN::ReadDB(PGLOBAL g) Bp->SubSet(); if ((Row = Bp->ParseLine(g, &Pretty, &Comma))) { + Top = Row; Row = Bp->FindRow(g); SameRow = 0; Fpos++; @@ -1545,10 +1541,9 @@ int TDBBSN::ReadDB(PGLOBAL g) } else rc = RC_EF; - } else { - // Here we get a movable Json binary tree - Bp->SubSet(); // Perhaps Useful when updating - Row = (PBVAL)To_Line; + } else { // Here we get a movable Json binary tree + Bp->MemSet(((BINFAM*)Txfp)->Recsize); // Useful when updating + Row = Top = (PBVAL)To_Line; Row = Bp->FindRow(g); SameRow = 0; Fpos++; @@ -1569,8 +1564,8 @@ bool TDBBSN::PrepareWriting(PGLOBAL g) if (Pretty >= 0) { PSZ s; - if (!(Top = Bp->MakeTopTree(g, Row))) - return true; +// if (!(Top = Bp->MakeTopTree(g, Row->Type))) +// return true; if ((s = Bp->SerialVal(g, Top, Pretty))) { if (Comma) @@ -2030,25 +2025,44 @@ void BSONCOL::WriteColumn(PGLOBAL g) throw 666; } // endif jsp + switch (row->Type) { + case TYPE_JAR: + if (Nod > 1 && Nodes[Nod - 2].Op == OP_EQ) + Cp->SetArrayValue(row, jsp, Nodes[Nod - 2].Rank); + else + Cp->AddArrayValue(row, jsp); + + break; + case TYPE_JOB: + if (Nod > 1 && Nodes[Nod - 2].Key) + Cp->SetKeyValue(row, jsp, Nodes[Nod - 2].Key); + + break; + case TYPE_JVAL: + default: + Cp->SetValueVal(row, jsp); + } // endswitch Type + + break; } else jsp = Cp->NewVal(Value); switch (row->Type) { - case TYPE_JAR: - if (Nodes[Nod - 1].Op == OP_EQ) - Cp->SetArrayValue(row, jsp, Nodes[Nod - 1].Rank); - else - Cp->AddArrayValue(row, jsp); + case TYPE_JAR: + if (Nodes[Nod - 1].Op == OP_EQ) + Cp->SetArrayValue(row, jsp, Nodes[Nod - 1].Rank); + else + Cp->AddArrayValue(row, jsp); - break; - case TYPE_JOB: - if (Nodes[Nod - 1].Key) - Cp->SetKeyValue(row, jsp, Nodes[Nod - 1].Key); + break; + case TYPE_JOB: + if (Nodes[Nod - 1].Key) + Cp->SetKeyValue(row, jsp, Nodes[Nod - 1].Key); - break; - case TYPE_JVAL: - default: - Cp->SetValueVal(row, jsp); + break; + case TYPE_JVAL: + default: + Cp->SetValueVal(row, jsp); } // endswitch Type break; @@ -2103,9 +2117,10 @@ int TDBBSON::MakeNewDoc(PGLOBAL g) // Create a void table that will be populated Docp = Bp->NewVal(TYPE_JAR); - if (!(Top = Bp->MakeTopTree(g, Docp))) + if (!(Top = Bp->MakeTopTree(g, TYPE_JAR))) return RC_FX; + Docp = Row; Done = true; return RC_OK; } // end of MakeNewDoc diff --git a/storage/connect/tabbson.h b/storage/connect/tabbson.h index 677bcbfd6e9..5b764b2eabd 100644 --- a/storage/connect/tabbson.h +++ b/storage/connect/tabbson.h @@ -111,7 +111,7 @@ public: // Utility functions PBVAL FindRow(PGLOBAL g); PBVAL ParseLine(PGLOBAL g, int *pretty, bool *comma); - PBVAL MakeTopTree(PGLOBAL g, PBVAL jsp); + PBVAL MakeTopTree(PGLOBAL g, int type); PSZ SerialVal(PGLOBAL g, PBVAL top, int pretty); protected: @@ -196,10 +196,9 @@ protected: //int MakeTopTree(PGLOBAL g, PBVAL jsp); // Members - PBTUT Bp; // The BSUTIL handling class + PBTUT Bp; // The BSUTIL handling class PBVAL Top; // The top JSON tree PBVAL Row; // The current row - PBVAL Val; // The value of the current row PBSCOL Colp; // The multiple column JMODE Jmode; // MODE_OBJECT by default PCSZ Objname; // The table object name diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp index 429efea56fa..4bddef1940e 100644 --- a/storage/connect/tabjson.cpp +++ b/storage/connect/tabjson.cpp @@ -1925,7 +1925,7 @@ PJSON JSONCOL::GetRow(PGLOBAL g) PJSON nwr, row = Tjp->Row; for (int i = 0; i < Nod && row; i++) { - if (Nodes[i+1].Op == OP_XX) + if (i < Nod-1 && Nodes[i+1].Op == OP_XX) break; else switch (row->GetType()) { case TYPE_JOB: |