mirror of
https://github.com/MariaDB/server.git
synced 2025-04-12 18:25:38 +02:00
Add experimental Bson_Array function (not documented)
Change names of functions not returning Json. modified: storage/connect/json.cpp modified: storage/connect/json.h modified: storage/connect/jsonudf.cpp modified: storage/connect/jsonudf.h modified: storage/connect/mysql-test/connect/r/json_udf.result modified: storage/connect/plugutil.c modified: storage/connect/value.cpp modified: storage/connect/value.h
This commit is contained in:
parent
175ef097e2
commit
7915abffbf
8 changed files with 892 additions and 738 deletions
storage/connect
|
@ -63,7 +63,7 @@ PJSON ParseJson(PGLOBAL g, char *s, int len, int pretty, bool *comma)
|
|||
switch (s[i]) {
|
||||
case '[':
|
||||
if (jsp) {
|
||||
if (pretty < 3) {
|
||||
if (pretty && pretty < 3) {
|
||||
strcpy(g->Message, "More than one item in file");
|
||||
goto err;
|
||||
} else
|
||||
|
@ -75,7 +75,7 @@ PJSON ParseJson(PGLOBAL g, char *s, int len, int pretty, bool *comma)
|
|||
break;
|
||||
case '{':
|
||||
if (jsp) {
|
||||
if (pretty < 3) {
|
||||
if (pretty && pretty < 3) {
|
||||
strcpy(g->Message, "More than one item in file");
|
||||
goto err;
|
||||
} else
|
||||
|
@ -336,7 +336,6 @@ PJVAL ParseValue(PGLOBAL g, int& i, STRG& src)
|
|||
|
||||
}; // endswitch s[i]
|
||||
|
||||
jvp->Size = 1;
|
||||
return jvp;
|
||||
|
||||
err:
|
||||
|
@ -973,6 +972,7 @@ void JOBJECT::DeleteKey(PSZ key)
|
|||
for (jp = First; jp; jp = jp->Next)
|
||||
if (!strcmp(jp->Key, key)) {
|
||||
*pjp = jp->Next;
|
||||
Size--;
|
||||
break;
|
||||
} else
|
||||
pjp = &jp->Next;
|
||||
|
@ -1246,9 +1246,9 @@ void JVALUE::SetFloat(PGLOBAL g, double f)
|
|||
/***********************************************************************/
|
||||
/* Set the Value's value as the given string. */
|
||||
/***********************************************************************/
|
||||
void JVALUE::SetString(PGLOBAL g, PSZ s)
|
||||
void JVALUE::SetString(PGLOBAL g, PSZ s, short c)
|
||||
{
|
||||
Value = AllocateValue(g, s, TYPE_STRING);
|
||||
Value = AllocateValue(g, s, TYPE_STRING, c);
|
||||
} // end of SetString
|
||||
|
||||
/***********************************************************************/
|
||||
|
|
|
@ -155,7 +155,8 @@ class JSON : public BLOCK {
|
|||
virtual PJAR GetArray(void) {return NULL;}
|
||||
virtual PJVAL GetValue(int i) {X return NULL;}
|
||||
virtual PVAL GetValue(void) {X return NULL;}
|
||||
virtual PJSON GetJson(void) {X return NULL;}
|
||||
virtual PJSON GetJsp(void) { X return NULL; }
|
||||
virtual PJSON GetJson(void) { X return NULL; }
|
||||
virtual PJPR GetFirst(void) {X return NULL;}
|
||||
virtual int GetInteger(void) {X return 0;}
|
||||
virtual double GetFloat() {X return 0.0;}
|
||||
|
@ -165,7 +166,7 @@ class JSON : public BLOCK {
|
|||
virtual void SetValue(PGLOBAL g, PJVAL jvp, PSZ key) {X}
|
||||
virtual void SetValue(PVAL valp) {X}
|
||||
virtual void SetValue(PJSON jsp) {X}
|
||||
virtual void SetString(PGLOBAL g, PSZ s) {X}
|
||||
virtual void SetString(PGLOBAL g, PSZ s, short c) {X}
|
||||
virtual void SetInteger(PGLOBAL g, int n) {X}
|
||||
virtual void SetFloat(PGLOBAL g, double f) {X}
|
||||
virtual void DeleteKey(char *k) {X}
|
||||
|
@ -258,15 +259,16 @@ class JVALUE : public JSON {
|
|||
virtual PJOB GetObject(void);
|
||||
virtual PJAR GetArray(void);
|
||||
virtual PVAL GetValue(void) {return Value;}
|
||||
virtual PJSON GetJson(void) {return (Jsp ? Jsp : this);}
|
||||
virtual int GetInteger(void);
|
||||
virtual PJSON GetJsp(void) {return Jsp;}
|
||||
virtual PJSON GetJson(void) { return (Jsp ? Jsp : this); }
|
||||
virtual int GetInteger(void);
|
||||
virtual long long GetBigint(void);
|
||||
virtual double GetFloat(void);
|
||||
virtual PSZ GetString(void);
|
||||
virtual PSZ GetText(PGLOBAL g, PSZ text);
|
||||
virtual void SetValue(PVAL valp) {Value = valp;}
|
||||
virtual void SetValue(PJSON jsp) {Jsp = jsp;}
|
||||
virtual void SetString(PGLOBAL g, PSZ s);
|
||||
virtual void SetString(PGLOBAL g, PSZ s, short c = 0);
|
||||
virtual void SetInteger(PGLOBAL g, int n);
|
||||
virtual void SetBigint(PGLOBAL g, longlong ll);
|
||||
virtual void SetFloat(PGLOBAL g, double f);
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,10 +1,10 @@
|
|||
/*************** tabjson H Declares Source Code File (.H) **************/
|
||||
/* Name: jsonudf.h Version 1.1 */
|
||||
/* */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2015 */
|
||||
/* */
|
||||
/* This file contains the JSON UDF function and classe declares. */
|
||||
/***********************************************************************/
|
||||
/******************** tabjson H Declares Source Code File (.H) *******************/
|
||||
/* Name: jsonudf.h Version 1.1 */
|
||||
/* */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2015 */
|
||||
/* */
|
||||
/* This file contains the JSON UDF function and class declares. */
|
||||
/*********************************************************************************/
|
||||
#include "global.h"
|
||||
#include "plgdbsem.h"
|
||||
#include "block.h"
|
||||
|
@ -15,9 +15,9 @@
|
|||
#define UDF_EXEC_ARGS \
|
||||
UDF_INIT*, UDF_ARGS*, char*, unsigned long*, char*, char*
|
||||
|
||||
/***********************************************************************/
|
||||
/* The JSON tree node. Can be an Object or an Array. */
|
||||
/***********************************************************************/
|
||||
/*********************************************************************************/
|
||||
/* The JSON tree node. Can be an Object or an Array. */
|
||||
/*********************************************************************************/
|
||||
typedef struct _jnode {
|
||||
PSZ Key; // The key used for object
|
||||
OPVAL Op; // Operator used for this node
|
||||
|
@ -28,8 +28,9 @@ typedef struct _jnode {
|
|||
int Nx; // Next to read row number
|
||||
} JNODE, *PJNODE;
|
||||
|
||||
typedef class JSNX *PJSNX;
|
||||
typedef class JSNX *PJSNX;
|
||||
typedef class JOUTPATH *PJTP;
|
||||
typedef class JOUTALL *PJTA;
|
||||
|
||||
extern "C" {
|
||||
DllExport my_bool Json_Value_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
|
@ -84,34 +85,51 @@ extern "C" {
|
|||
DllExport void Json_Object_Grp_clear(UDF_INIT *, char *, char *);
|
||||
DllExport void Json_Object_Grp_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool Json_Get_String_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *Json_Get_String(UDF_EXEC_ARGS);
|
||||
DllExport void Json_Get_String_deinit(UDF_INIT*);
|
||||
DllExport my_bool JsonGetString_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *JsonGetString(UDF_EXEC_ARGS);
|
||||
DllExport void JsonGetString_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool Json_Get_Int_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport long long Json_Get_Int(UDF_INIT*, UDF_ARGS*, char*, char*);
|
||||
DllExport void Json_Get_Int_deinit(UDF_INIT*);
|
||||
DllExport my_bool JsonGetInt_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport long long JsonGetInt(UDF_INIT*, UDF_ARGS*, char*, char*);
|
||||
DllExport void JsonGetInt_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool Json_Get_Real_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport double Json_Get_Real(UDF_INIT*, UDF_ARGS*, char*, char*);
|
||||
DllExport void Json_Get_Real_deinit(UDF_INIT*);
|
||||
DllExport my_bool JsonGetReal_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport double JsonGetReal(UDF_INIT*, UDF_ARGS*, char*, char*);
|
||||
DllExport void JsonGetReal_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool Json_Locate_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *Json_Locate(UDF_EXEC_ARGS);
|
||||
DllExport void Json_Locate_deinit(UDF_INIT*);
|
||||
DllExport my_bool JsonLocate_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *JsonLocate(UDF_EXEC_ARGS);
|
||||
DllExport void JsonLocate_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool Json_Locate_All_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *Json_Locate_All(UDF_EXEC_ARGS);
|
||||
DllExport void Json_Locate_All_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool Json_File_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *Json_File(UDF_EXEC_ARGS);
|
||||
DllExport void Json_File_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool Json_Make_File_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *Json_Make_File(UDF_EXEC_ARGS);
|
||||
DllExport void Json_Make_File_deinit(UDF_INIT*);
|
||||
DllExport my_bool JsonMakeFile_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *JsonMakeFile(UDF_EXEC_ARGS);
|
||||
DllExport void JsonMakeFile_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool Bson_Array_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *Bson_Array(UDF_EXEC_ARGS);
|
||||
DllExport void Bson_Array_deinit(UDF_INIT*);
|
||||
} // extern "C"
|
||||
|
||||
/***********************************************************************/
|
||||
/* Class JSNX: JSON access method. */
|
||||
/***********************************************************************/
|
||||
/*********************************************************************************/
|
||||
/* Structure JPN. Used to make the locate path. */
|
||||
/*********************************************************************************/
|
||||
typedef struct _jpn {
|
||||
enum JTYP Type;
|
||||
PSZ Key;
|
||||
int N;
|
||||
} JPN, *PJPN;
|
||||
|
||||
/*********************************************************************************/
|
||||
/* Class JSNX: JSON access method. */
|
||||
/*********************************************************************************/
|
||||
class JSNX : public BLOCK {
|
||||
public:
|
||||
// Constructors
|
||||
|
@ -126,11 +144,10 @@ public:
|
|||
my_bool ParseJpath(PGLOBAL g);
|
||||
void ReadValue(PGLOBAL g);
|
||||
PJVAL GetJson(PGLOBAL g);
|
||||
char *Locate(PGLOBAL g, PJSON jsp, char *what,
|
||||
enum Item_result type, unsigned long len);
|
||||
char *Locate(PGLOBAL g, PJSON jsp, PJVAL jvp, int k = 1);
|
||||
char *LocateAll(PGLOBAL g, PJSON jsp, PJVAL jvp, int mx = 10);
|
||||
|
||||
protected:
|
||||
my_bool CheckExpand(PGLOBAL g, int i, PSZ nm, my_bool b);
|
||||
my_bool SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm);
|
||||
PVAL GetColumnValue(PGLOBAL g, PJSON row, int i);
|
||||
PJVAL GetValue(PGLOBAL g, PJSON row, int i);
|
||||
|
@ -138,42 +155,37 @@ protected:
|
|||
PVAL CalculateArray(PGLOBAL g, PJAR arp, int n);
|
||||
PVAL MakeJson(PGLOBAL g, PJSON jsp);
|
||||
void SetJsonValue(PGLOBAL g, PVAL vp, PJVAL val, int n);
|
||||
//PJSON GetRow(PGLOBAL g);
|
||||
my_bool LocateArray(PJAR jarp);
|
||||
my_bool LocateObject(PJOB jobp);
|
||||
my_bool LocateValue(PJVAL jvp);
|
||||
my_bool LocateArrayAll(PJAR jarp);
|
||||
my_bool LocateObjectAll(PJOB jobp);
|
||||
my_bool LocateValueAll(PJVAL jvp);
|
||||
my_bool CompareTree(PJSON jp1, PJSON jp2);
|
||||
my_bool AddPath(void);
|
||||
|
||||
// Default constructor not to be used
|
||||
JSNX(void) {}
|
||||
|
||||
// Members
|
||||
PJSON Row;
|
||||
PVAL Value;
|
||||
PVAL MulVal; // To value used by multiple column
|
||||
PJTP Jp;
|
||||
JNODE *Nodes; // The intermediate objects
|
||||
char *Jpath; // The json path
|
||||
int Buf_Type;
|
||||
int Long;
|
||||
int Prec;
|
||||
int Nod; // The number of intermediate objects
|
||||
int Xnod; // Index of multiple values
|
||||
int B; // Index base
|
||||
my_bool Xpd; // True for expandable column
|
||||
my_bool Parsed; // True when parsed
|
||||
PJSON Row;
|
||||
PJVAL Jvalp;
|
||||
PJPN Jpnp;
|
||||
JOUTSTR *Jp;
|
||||
JNODE *Nodes; // The intermediate objects
|
||||
PVAL Value;
|
||||
PVAL MulVal; // To value used by multiple column
|
||||
char *Jpath; // The json path
|
||||
int Buf_Type;
|
||||
int Long;
|
||||
int Prec;
|
||||
int Nod; // The number of intermediate objects
|
||||
int Xnod; // Index of multiple values
|
||||
int K; // Kth item to locate
|
||||
int I; // Index of JPN
|
||||
int Imax; // Max number of JPN's
|
||||
int B; // Index base
|
||||
my_bool Xpd; // True for expandable column
|
||||
my_bool Parsed; // True when parsed
|
||||
my_bool Found; // Item found by locate
|
||||
}; // end of class JSNX
|
||||
|
||||
/***********************************************************************/
|
||||
/* Class JOUTPATH. Used to make the locate path. */
|
||||
/***********************************************************************/
|
||||
class JOUTPATH : public JOUTSTR {
|
||||
public:
|
||||
JOUTPATH(PGLOBAL g, char *w, enum Item_result type, unsigned long len)
|
||||
: JOUTSTR(g) {What = w; Type = type; Len = len; Found = false;}
|
||||
|
||||
// Members
|
||||
enum Item_result Type;
|
||||
unsigned long Len;
|
||||
char *What;
|
||||
my_bool Found;
|
||||
}; // end of class JOUTPATH
|
||||
|
|
|
@ -20,14 +20,14 @@ Array
|
|||
[56,3.141600,"foo",null,"One more"]
|
||||
SELECT Json_Array_Add(Json_Value('one value'),'One more');
|
||||
Json_Array_Add(Json_Value('one value'),'One more')
|
||||
"one value"
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 1105 First argument is not an array
|
||||
SELECT Json_Array_Add('one value','One more');
|
||||
ERROR HY000: Can't initialize function 'Json_Array_Add'; Json_Array_Add first argument must be a json item
|
||||
SELECT Json_Array_Add('one value' json_,'One more');
|
||||
Json_Array_Add('one value' json_,'One more')
|
||||
one value
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 1105 Unexpected character 'o' near one value
|
||||
Warning 1105 First argument is not an array
|
||||
|
@ -147,7 +147,7 @@ Json_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Object(SERIALNO, NAME, SALARY
|
|||
{"DEPARTMENT":"2452","TITLE":"SCIENTIST","EMPLOYES":[{"SERIALNO":"34567","NAME":"BIGHEAD","SALARY":8000.000000},{"SERIALNO":"36666","NAME":"BIGHORN","SALARY":11000.000000}]}
|
||||
{"DEPARTMENT":"2452","TITLE":"SECRETARY","EMPLOYES":[{"SERIALNO":"11111","NAME":"CHERRY","SALARY":4500.000000}]}
|
||||
SELECT Json_Object_Grp(SALARY) FROM t1;
|
||||
ERROR HY000: Can't initialize function 'Json_Object_Grp'; Json_Array_Grp can only accept 2 arguments
|
||||
ERROR HY000: Can't initialize function 'Json_Object_Grp'; Json_Object_Grp can only accept 2 arguments
|
||||
SELECT Json_Object_Grp(SALARY, NAME) FROM t1;
|
||||
Json_Object_Grp(SALARY, NAME)
|
||||
{"BANCROFT":9600.000000,"SMITH":9000.000000,"MERCHANT":8700.000000,"FUNNIGUY":8500.000000,"BUGHAPPY":8500.000000,"BIGHEAD":8000.000000,"SHRINKY":7500.000000,"WALTER":7400.000000,"FODDERMAN":7000.000000,"TONGHO":6800.000000,"SHORTSIGHT":5500.000000,"MESSIFUL":5000.500000,"HONEY":4900.000000,"GOOSEPEN":4700.000000,"CHERRY":4500.000000,"MONAPENNY":3800.000000,"KITTY":3000.450000,"PLUMHEAD":2800.000000,"STRONG":23000.000000,"BULLOZER":14800.000000,"WERTHER":14500.000000,"QUINN":14000.000000,"ORELLY":13400.000000,"BIGHORN":11000.000000,"BROWNY":10500.000000,"WHEELFOR":10030.000000,"MARTIN":10000.000000}
|
||||
|
|
|
@ -143,7 +143,7 @@ PGLOBAL PlugInit(LPCSTR Language, uint worksize)
|
|||
fprintf(stderr, MSG(GLOBAL_ERROR), (int)sizeof(GLOBAL));
|
||||
return NULL;
|
||||
} else {
|
||||
g->Sarea_Size = worksize;
|
||||
g->Sarea = NULL;
|
||||
g->Createas = 0;
|
||||
g->Alchecked = 0;
|
||||
g->Mrr = 0;
|
||||
|
@ -155,7 +155,7 @@ PGLOBAL PlugInit(LPCSTR Language, uint worksize)
|
|||
/*******************************************************************/
|
||||
/* Allocate the main work segment. */
|
||||
/*******************************************************************/
|
||||
if (!(g->Sarea = PlugAllocMem(g, worksize))) {
|
||||
if (worksize && !(g->Sarea = PlugAllocMem(g, worksize))) {
|
||||
char errmsg[256];
|
||||
sprintf(errmsg, MSG(WORK_AREA), g->Message);
|
||||
strcpy(g->Message, errmsg);
|
||||
|
@ -163,7 +163,7 @@ PGLOBAL PlugInit(LPCSTR Language, uint worksize)
|
|||
} else
|
||||
g->Sarea_Size = worksize;
|
||||
|
||||
} /* endif g */
|
||||
} /* endif g */
|
||||
|
||||
g->jump_level = -1; /* New setting to allow recursive call of Plug */
|
||||
return(g);
|
||||
|
|
|
@ -340,7 +340,7 @@ PVAL AllocateValue(PGLOBAL g, void *value, short type, short prec)
|
|||
|
||||
switch (type) {
|
||||
case TYPE_STRING:
|
||||
valp = new(g) TYPVAL<PSZ>((PSZ)value);
|
||||
valp = new(g) TYPVAL<PSZ>((PSZ)value, prec);
|
||||
break;
|
||||
case TYPE_SHORT:
|
||||
valp = new(g) TYPVAL<short>(*(short*)value, TYPE_SHORT);
|
||||
|
@ -1209,12 +1209,12 @@ void TYPVAL<TYPE>::Print(PGLOBAL g, char *ps, uint z)
|
|||
/***********************************************************************/
|
||||
/* STRING public constructor from a constant string. */
|
||||
/***********************************************************************/
|
||||
TYPVAL<PSZ>::TYPVAL(PSZ s) : VALUE(TYPE_STRING)
|
||||
TYPVAL<PSZ>::TYPVAL(PSZ s, short c) : VALUE(TYPE_STRING)
|
||||
{
|
||||
Strp = s;
|
||||
Len = strlen(s);
|
||||
Clen = Len;
|
||||
Ci = false;
|
||||
Ci = (c == 1);
|
||||
} // end of STRING constructor
|
||||
|
||||
/***********************************************************************/
|
||||
|
|
|
@ -216,7 +216,7 @@ template <>
|
|||
class DllExport TYPVAL<PSZ>: public VALUE {
|
||||
public:
|
||||
// Constructors
|
||||
TYPVAL(PSZ s);
|
||||
TYPVAL(PSZ s, short c = 0);
|
||||
TYPVAL(PGLOBAL g, PSZ s, int n, int c);
|
||||
|
||||
// Implementation
|
||||
|
|
Loading…
Add table
Reference in a new issue