mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
Merge branch 'Buggynours:10.0' into 10.0
This commit is contained in:
commit
b9c89ad038
17 changed files with 303 additions and 116 deletions
|
@ -118,7 +118,7 @@ extern "C" {
|
|||
/* Static variables */
|
||||
/***********************************************************************/
|
||||
#if defined(STORAGE)
|
||||
char sys_stamp[4] = SYS_STAMP;
|
||||
char sys_stamp[5] = SYS_STAMP;
|
||||
#else
|
||||
extern char sys_stamp[];
|
||||
#endif
|
||||
|
|
|
@ -168,35 +168,21 @@
|
|||
#define JSONMAX 10 // JSON Default max grp size
|
||||
|
||||
extern "C" {
|
||||
char version[]= "Version 1.03.0006 April 12, 2015";
|
||||
|
||||
char version[]= "Version 1.03.0007 April 30, 2015";
|
||||
#if defined(WIN32)
|
||||
char compver[]= "Version 1.03.0006 " __DATE__ " " __TIME__;
|
||||
char compver[]= "Version 1.03.0007 " __DATE__ " " __TIME__;
|
||||
char slash= '\\';
|
||||
#else // !WIN32
|
||||
char slash= '/';
|
||||
#endif // !WIN32
|
||||
|
||||
// int trace= 0; // The general trace value
|
||||
// ulong xconv= 0; // The type conversion option
|
||||
// int zconv= 0; // The text conversion size
|
||||
} // extern "C"
|
||||
|
||||
#if defined(XMAP)
|
||||
my_bool xmap= false;
|
||||
#endif // XMAP
|
||||
|
||||
// uint worksize= 0;
|
||||
ulong ha_connect::num= 0;
|
||||
//int DTVAL::Shift= 0;
|
||||
|
||||
/* CONNECT system variables */
|
||||
//atic int conv_size= 0;
|
||||
//atic uint work_size= 0;
|
||||
//atic ulong type_conv= 0;
|
||||
#if defined(XMAP)
|
||||
//atic my_bool indx_map= 0;
|
||||
#endif // XMAP
|
||||
#if defined(XMSG)
|
||||
extern "C" {
|
||||
char *msg_path;
|
||||
|
@ -613,9 +599,9 @@ DllExport LPCSTR PlugSetPath(LPSTR to, LPCSTR name, LPCSTR dir)
|
|||
delete_table method in handler.cc
|
||||
*/
|
||||
static const char *ha_connect_exts[]= {
|
||||
".dos", ".fix", ".csv", ".bin", ".fmt", ".dbf", ".xml", ".ini", ".vec",
|
||||
".dnx", ".fnx", ".bnx", ".vnx", ".dbx", ".dop", ".fop", ".bop", ".vop",
|
||||
NULL};
|
||||
".dos", ".fix", ".csv", ".bin", ".fmt", ".dbf", ".xml", ".json", ".ini",
|
||||
".vec", ".dnx", ".fnx", ".bnx", ".vnx", ".dbx", ".dop", ".fop", ".bop",
|
||||
".vop", NULL};
|
||||
|
||||
/**
|
||||
@brief
|
||||
|
@ -4646,8 +4632,13 @@ int ha_connect::delete_or_rename_table(const char *name, const char *to)
|
|||
|
||||
} // endif pos
|
||||
|
||||
} else // Avoid infamous DBUG_ASSERT
|
||||
thd->get_stmt_da()->reset_diagnostics_area();
|
||||
} // endif open_table_def
|
||||
|
||||
// This below was done to avoid DBUG_ASSERT in some case that
|
||||
// we don't know anymore what they were. It was suppressed because
|
||||
// it did cause assertion in other cases (see MDEV-7935)
|
||||
// } else // Avoid infamous DBUG_ASSERT
|
||||
// thd->get_stmt_da()->reset_diagnostics_area();
|
||||
|
||||
free_table_share(share);
|
||||
} else // Temporary file
|
||||
|
@ -4730,6 +4721,25 @@ ha_rows ha_connect::records_in_range(uint inx, key_range *min_key,
|
|||
DBUG_RETURN(rows);
|
||||
} // end of records_in_range
|
||||
|
||||
// Used to check whether a MYSQL table is created on itself
|
||||
bool CheckSelf(PGLOBAL g, TABLE_SHARE *s, const char *host,
|
||||
const char *db, char *tab, const char *src, int port)
|
||||
{
|
||||
if (src)
|
||||
return false;
|
||||
else if (host && stricmp(host, "localhost") && strcmp(host, "127.0.0.1"))
|
||||
return false;
|
||||
else if (db && stricmp(db, s->db.str))
|
||||
return false;
|
||||
else if (tab && stricmp(tab, s->table_name.str))
|
||||
return false;
|
||||
else if (port && port != (signed)GetDefaultPort())
|
||||
return false;
|
||||
|
||||
strcpy(g->Message, "This MySQL table is defined on itself");
|
||||
return true;
|
||||
} // end of CheckSelf
|
||||
|
||||
/**
|
||||
Convert an ISO-8859-1 column name to UTF-8
|
||||
*/
|
||||
|
@ -4933,25 +4943,6 @@ static int init_table_share(THD* thd,
|
|||
sql->ptr(), sql->length());
|
||||
} // end of init_table_share
|
||||
|
||||
// Used to check whether a MYSQL table is created on itself
|
||||
bool CheckSelf(PGLOBAL g, TABLE_SHARE *s, const char *host,
|
||||
const char *db, char *tab, const char *src, int port)
|
||||
{
|
||||
if (src)
|
||||
return false;
|
||||
else if (host && stricmp(host, "localhost") && strcmp(host, "127.0.0.1"))
|
||||
return false;
|
||||
else if (db && stricmp(db, s->db.str))
|
||||
return false;
|
||||
else if (tab && stricmp(tab, s->table_name.str))
|
||||
return false;
|
||||
else if (port && port != (signed)GetDefaultPort())
|
||||
return false;
|
||||
|
||||
strcpy(g->Message, "This MySQL table is defined on itself");
|
||||
return true;
|
||||
} // end of CheckSelf
|
||||
|
||||
/**
|
||||
@brief
|
||||
connect_assisted_discovery() is called when creating a table with no columns.
|
||||
|
|
|
@ -17,40 +17,45 @@
|
|||
#include "json.h"
|
||||
|
||||
#define MEMFIX 512
|
||||
#define UDF_EXEC_ARGS \
|
||||
UDF_INIT*, UDF_ARGS*, char*, unsigned long*, char*, char*
|
||||
|
||||
uint GetJsonGrpSize(void);
|
||||
|
||||
extern "C" {
|
||||
DllExport my_bool Json_Value_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *Json_Value(UDF_INIT*, UDF_ARGS*, char*,
|
||||
unsigned long*, char *, char *);
|
||||
DllExport char *Json_Value(UDF_EXEC_ARGS);
|
||||
DllExport void Json_Value_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool Json_Array_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *Json_Array(UDF_INIT*, UDF_ARGS*, char*,
|
||||
unsigned long*, char *, char *);
|
||||
DllExport char *Json_Array(UDF_EXEC_ARGS);
|
||||
DllExport void Json_Array_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool Json_Array_Add_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *Json_Array_Add(UDF_INIT*, UDF_ARGS*, char*,
|
||||
unsigned long*, char *, char *);
|
||||
DllExport char *Json_Array_Add(UDF_EXEC_ARGS);
|
||||
DllExport void Json_Array_Add_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool Json_Array_Delete_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *Json_Array_Delete(UDF_EXEC_ARGS);
|
||||
DllExport void Json_Array_Delete_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool Json_Object_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *Json_Object(UDF_INIT*, UDF_ARGS*, char*,
|
||||
unsigned long*, char *, char *);
|
||||
DllExport char *Json_Object(UDF_EXEC_ARGS);
|
||||
DllExport void Json_Object_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool Json_Object_Nonull_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport char *Json_Object_Nonull(UDF_INIT*, UDF_ARGS*, char*,
|
||||
unsigned long*, char *, char *);
|
||||
DllExport char *Json_Object_Nonull(UDF_EXEC_ARGS);
|
||||
DllExport void Json_Object_Nonull_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool Json_Array_Grp_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport void Json_Array_Grp_add(UDF_INIT *, UDF_ARGS *, char *, char *);
|
||||
DllExport char *Json_Array_Grp(UDF_INIT*, UDF_ARGS*, char*,
|
||||
unsigned long*, char *, char *);
|
||||
DllExport char *Json_Array_Grp(UDF_EXEC_ARGS);
|
||||
DllExport void Json_Array_Grp_clear(UDF_INIT *, char *, char *);
|
||||
DllExport void Json_Array_Grp_deinit(UDF_INIT*);
|
||||
|
||||
DllExport my_bool Json_Object_Grp_init(UDF_INIT*, UDF_ARGS*, char*);
|
||||
DllExport void Json_Object_Grp_add(UDF_INIT *, UDF_ARGS *, char *, char *);
|
||||
DllExport char *Json_Object_Grp(UDF_INIT*, UDF_ARGS*, char*,
|
||||
unsigned long*, char *, char *);
|
||||
DllExport char *Json_Object_Grp(UDF_EXEC_ARGS);
|
||||
DllExport void Json_Object_Grp_clear(UDF_INIT *, char *, char *);
|
||||
DllExport void Json_Object_Grp_deinit(UDF_INIT*);
|
||||
} // extern "C"
|
||||
|
@ -404,6 +409,67 @@ void Json_Array_Add_deinit(UDF_INIT* initid)
|
|||
PlugExit((PGLOBAL)initid->ptr);
|
||||
} // end of Json_Array_Add_deinit
|
||||
|
||||
/***********************************************************************/
|
||||
/* Add values to a Json array. */
|
||||
/***********************************************************************/
|
||||
my_bool Json_Array_Delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
|
||||
{
|
||||
unsigned long reslen, memlen;
|
||||
|
||||
if (args->arg_count != 2) {
|
||||
strcpy(message, "Json_Value_Delete must have 2 arguments");
|
||||
return true;
|
||||
} else if (!IsJson(args, 0)) {
|
||||
strcpy(message, "Json_Value_Delete first argument must be a json item");
|
||||
return true;
|
||||
} else
|
||||
CalcLen(args, false, reslen, memlen);
|
||||
|
||||
return JsonInit(initid, message, reslen, memlen);
|
||||
} // end of Json_Array_Delete_init
|
||||
|
||||
char *Json_Array_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
unsigned long *res_length, char *is_null, char *error)
|
||||
{
|
||||
char *str;
|
||||
int n;
|
||||
PJVAL jvp;
|
||||
PJAR arp;
|
||||
PGLOBAL g = (PGLOBAL)initid->ptr;
|
||||
|
||||
PlugSubSet(g, g->Sarea, g->Sarea_Size);
|
||||
jvp = MakeValue(g, args, 0);
|
||||
|
||||
if (jvp->GetValType() != TYPE_JAR) {
|
||||
push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0,
|
||||
"First argument is not an array");
|
||||
str = args->args[0];
|
||||
} else if (args->arg_type[1] != INT_RESULT) {
|
||||
push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0,
|
||||
"Second argument is not an integer");
|
||||
str = args->args[0];
|
||||
} else {
|
||||
n = *(int*)args->args[1];
|
||||
arp = jvp->GetArray();
|
||||
arp->DeleteValue(n - 1);
|
||||
arp->InitArray(g);
|
||||
|
||||
if (!(str = Serialize(g, arp, NULL, 0))) {
|
||||
str = strcpy(result, g->Message);
|
||||
push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, str);
|
||||
} // endif str
|
||||
|
||||
} // endif's
|
||||
|
||||
*res_length = strlen(str);
|
||||
return str;
|
||||
} // end of Json_Array_Delete
|
||||
|
||||
void Json_Array_Delete_deinit(UDF_INIT* initid)
|
||||
{
|
||||
PlugExit((PGLOBAL)initid->ptr);
|
||||
} // end of Json_Array_Delete_deinit
|
||||
|
||||
/***********************************************************************/
|
||||
/* Make a Json Oject containing all the parameters. */
|
||||
/***********************************************************************/
|
||||
|
|
|
@ -89,8 +89,8 @@ ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher L
|
|||
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 Philippe 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
|
||||
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
|
||||
#
|
||||
|
@ -104,8 +104,8 @@ 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 Philippe 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
|
||||
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;
|
||||
|
@ -127,11 +127,11 @@ line
|
|||
"SUBJECT": "applications",
|
||||
"AUTHOR": [
|
||||
{
|
||||
"FIRSTNAME": "Philippe",
|
||||
"FIRSTNAME": "Jean-Christophe",
|
||||
"LASTNAME": "Bernadac"
|
||||
},
|
||||
{
|
||||
"FIRSTNAME": "François",
|
||||
"FIRSTNAME": "Philippe",
|
||||
"LASTNAME": "Knab"
|
||||
}
|
||||
],
|
||||
|
|
32
storage/connect/mysql-test/connect/r/xml_html.result
Normal file
32
storage/connect/mysql-test/connect/r/xml_html.result
Normal file
|
@ -0,0 +1,32 @@
|
|||
Warnings:
|
||||
Warning 1105 No file name. Table will use t1.xml
|
||||
SET NAMES utf8;
|
||||
#
|
||||
# Testing HTML like XML file
|
||||
#
|
||||
CREATE TABLE beers (
|
||||
`Name` CHAR(16) FIELD_FORMAT='brandName',
|
||||
`Origin` CHAR(16) FIELD_FORMAT='origin',
|
||||
`Description` CHAR(32) FIELD_FORMAT='details')
|
||||
ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='beers.xml'
|
||||
TABNAME='table' OPTION_LIST='xmlsup=libxml2,rownode=tr,colnode=td';
|
||||
SELECT * FROM beers;
|
||||
Name Origin Description
|
||||
Huntsman Bath, UK Wonderful hop, light alcohol
|
||||
Tuborg Danmark In small bottles
|
||||
DROP TABLE beers;
|
||||
#
|
||||
# Testing HTML file
|
||||
#
|
||||
CREATE TABLE coffee (
|
||||
`Name` CHAR(16),
|
||||
`Cups` INT(8),
|
||||
`Type` CHAR(16),
|
||||
`Sugar` CHAR(4))
|
||||
ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='coffee.htm'
|
||||
TABNAME='TABLE' HEADER=1 OPTION_LIST='xmlsup=libxml2,Coltype=HTML';
|
||||
SELECT * FROM coffee;
|
||||
Name Cups Type Sugar
|
||||
T. Sexton 10 Espresso No
|
||||
J. Dinnen 5 Decaf Yes
|
||||
DROP TABLE coffee;
|
16
storage/connect/mysql-test/connect/std_data/beers.xml
Normal file
16
storage/connect/mysql-test/connect/std_data/beers.xml
Normal file
|
@ -0,0 +1,16 @@
|
|||
<?xml version="1.0"?>
|
||||
<Beers>
|
||||
<table>
|
||||
<th><td>Name</td><td>Origin</td><td>Description</td></th>
|
||||
<tr>
|
||||
<td><brandName>Huntsman</brandName></td>
|
||||
<td><origin>Bath, UK</origin></td>
|
||||
<td><details>Wonderful hop, light alcohol</details></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><brandName>Tuborg</brandName></td>
|
||||
<td><origin>Danmark</origin></td>
|
||||
<td><details>In small bottles</details></td>
|
||||
</tr>
|
||||
</table>
|
||||
</Beers>
|
24
storage/connect/mysql-test/connect/std_data/coffee.htm
Normal file
24
storage/connect/mysql-test/connect/std_data/coffee.htm
Normal file
|
@ -0,0 +1,24 @@
|
|||
<TABLE summary="This table charts the number of cups of coffe
|
||||
consumed by each senator, the type of coffee (decaf
|
||||
or regular), and whether taken with sugar.">
|
||||
<CAPTION>Cups of coffee consumed by each senator</CAPTION>
|
||||
<TR>
|
||||
<TH>Name</TH>
|
||||
<TH>Cups</TH>
|
||||
<TH>Type of Coffee</TH>
|
||||
<TH>Sugar?</TH>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>T. Sexton</TD>
|
||||
<TD>10</TD>
|
||||
<TD>Espresso</TD>
|
||||
<TD>No</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD>J. Dinnen</TD>
|
||||
<TD>5</TD>
|
||||
<TD>Decaf</TD>
|
||||
<TD>Yes</TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
|
|
@ -1,36 +1,36 @@
|
|||
--disable_query_log
|
||||
#
|
||||
# Check if server has support for loading plugins
|
||||
#
|
||||
if (`SELECT @@have_dynamic_loading != 'YES'`) {
|
||||
--skip UDF requires dynamic loading
|
||||
}
|
||||
if (!$HA_CONNECT_SO) {
|
||||
--skip Needs a dynamically built ha_connect.so
|
||||
}
|
||||
|
||||
let $is_win = `select convert(@@version_compile_os using latin1) IN ("Win32","Win64","Windows")`;
|
||||
|
||||
if ($is_win)
|
||||
{
|
||||
--eval CREATE FUNCTION Json_Array RETURNS STRING SONAME 'ha_connect.dll';
|
||||
--eval CREATE FUNCTION Json_Array_Add RETURNS STRING SONAME 'ha_connect.dll';
|
||||
--eval CREATE FUNCTION Json_Object RETURNS STRING SONAME 'ha_connect.dll';
|
||||
--eval CREATE FUNCTION Json_Object_Nonull RETURNS STRING SONAME 'ha_connect.dll';
|
||||
--eval CREATE FUNCTION Json_Value returns STRING SONAME 'ha_connect.dll';
|
||||
--eval CREATE AGGREGATE FUNCTION Json_Array_Grp RETURNS STRING SONAME 'ha_connect.dll';
|
||||
--eval CREATE AGGREGATE FUNCTION Json_Object_Grp RETURNS STRING SONAME 'ha_connect.dll';
|
||||
}
|
||||
|
||||
if (!$is_win)
|
||||
{
|
||||
--eval CREATE FUNCTION Json_Array RETURNS STRING SONAME 'ha_connect.so';
|
||||
--eval CREATE FUNCTION Json_Array_Add RETURNS STRING SONAME 'ha_connect.so';
|
||||
--eval CREATE FUNCTION Json_Object RETURNS STRING SONAME 'ha_connect.so';
|
||||
--eval CREATE FUNCTION Json_Object_Nonull RETURNS STRING SONAME 'ha_connect.so';
|
||||
--eval CREATE FUNCTION Json_Value returns STRING SONAME 'ha_connect.so';
|
||||
--eval CREATE AGGREGATE FUNCTION Json_Array_Grp RETURNS STRING SONAME 'ha_connect.so';
|
||||
--eval CREATE AGGREGATE FUNCTION Json_Object_Grp RETURNS STRING SONAME 'ha_connect.so';
|
||||
}
|
||||
--enable_query_log
|
||||
|
||||
--disable_query_log
|
||||
#
|
||||
# Check if server has support for loading plugins
|
||||
#
|
||||
if (`SELECT @@have_dynamic_loading != 'YES'`) {
|
||||
--skip UDF requires dynamic loading
|
||||
}
|
||||
if (!$HA_CONNECT_SO) {
|
||||
--skip Needs a dynamically built ha_connect.so
|
||||
}
|
||||
|
||||
let $is_win = `select convert(@@version_compile_os using latin1) IN ("Win32","Win64","Windows")`;
|
||||
|
||||
if ($is_win)
|
||||
{
|
||||
--eval CREATE FUNCTION Json_Array RETURNS STRING SONAME 'ha_connect.dll';
|
||||
--eval CREATE FUNCTION Json_Array_Add RETURNS STRING SONAME 'ha_connect.dll';
|
||||
--eval CREATE FUNCTION Json_Object RETURNS STRING SONAME 'ha_connect.dll';
|
||||
--eval CREATE FUNCTION Json_Object_Nonull RETURNS STRING SONAME 'ha_connect.dll';
|
||||
--eval CREATE FUNCTION Json_Value returns STRING SONAME 'ha_connect.dll';
|
||||
--eval CREATE AGGREGATE FUNCTION Json_Array_Grp RETURNS STRING SONAME 'ha_connect.dll';
|
||||
--eval CREATE AGGREGATE FUNCTION Json_Object_Grp RETURNS STRING SONAME 'ha_connect.dll';
|
||||
}
|
||||
|
||||
if (!$is_win)
|
||||
{
|
||||
--eval CREATE FUNCTION Json_Array RETURNS STRING SONAME 'ha_connect.so';
|
||||
--eval CREATE FUNCTION Json_Array_Add RETURNS STRING SONAME 'ha_connect.so';
|
||||
--eval CREATE FUNCTION Json_Object RETURNS STRING SONAME 'ha_connect.so';
|
||||
--eval CREATE FUNCTION Json_Object_Nonull RETURNS STRING SONAME 'ha_connect.so';
|
||||
--eval CREATE FUNCTION Json_Value returns STRING SONAME 'ha_connect.so';
|
||||
--eval CREATE AGGREGATE FUNCTION Json_Array_Grp RETURNS STRING SONAME 'ha_connect.so';
|
||||
--eval CREATE AGGREGATE FUNCTION Json_Object_Grp RETURNS STRING SONAME 'ha_connect.so';
|
||||
}
|
||||
--enable_query_log
|
||||
|
||||
|
|
39
storage/connect/mysql-test/connect/t/xml_html.test
Normal file
39
storage/connect/mysql-test/connect/t/xml_html.test
Normal file
|
@ -0,0 +1,39 @@
|
|||
--source have_libxml2.inc
|
||||
|
||||
let $MYSQLD_DATADIR= `select @@datadir`;
|
||||
|
||||
SET NAMES utf8;
|
||||
|
||||
--copy_file $MTR_SUITE_DIR/std_data/beers.xml $MYSQLD_DATADIR/test/beers.xml
|
||||
--copy_file $MTR_SUITE_DIR/std_data/coffee.htm $MYSQLD_DATADIR/test/coffee.htm
|
||||
|
||||
--echo #
|
||||
--echo # Testing HTML like XML file
|
||||
--echo #
|
||||
CREATE TABLE beers (
|
||||
`Name` CHAR(16) FIELD_FORMAT='brandName',
|
||||
`Origin` CHAR(16) FIELD_FORMAT='origin',
|
||||
`Description` CHAR(32) FIELD_FORMAT='details')
|
||||
ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='beers.xml'
|
||||
TABNAME='table' OPTION_LIST='xmlsup=libxml2,rownode=tr,colnode=td';
|
||||
SELECT * FROM beers;
|
||||
DROP TABLE beers;
|
||||
|
||||
--echo #
|
||||
--echo # Testing HTML file
|
||||
--echo #
|
||||
CREATE TABLE coffee (
|
||||
`Name` CHAR(16),
|
||||
`Cups` INT(8),
|
||||
`Type` CHAR(16),
|
||||
`Sugar` CHAR(4))
|
||||
ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='coffee.htm'
|
||||
TABNAME='TABLE' HEADER=1 OPTION_LIST='xmlsup=libxml2,Coltype=HTML';
|
||||
SELECT * FROM coffee;
|
||||
DROP TABLE coffee;
|
||||
|
||||
#
|
||||
# Clean up
|
||||
#
|
||||
--remove_file $MYSQLD_DATADIR/test/beers.xml
|
||||
--remove_file $MYSQLD_DATADIR/test/coffee.htm
|
|
@ -968,6 +968,20 @@ bool JSONCOL::ParseJpath(PGLOBAL g)
|
|||
else if (!Jpath)
|
||||
Jpath = Name;
|
||||
|
||||
if (To_Tdb->GetOrig()) {
|
||||
// This is an updated column, get nodes from origin
|
||||
for (PJCOL colp = (PJCOL)Tjp->GetColumns(); colp;
|
||||
colp = (PJCOL)colp->GetNext())
|
||||
if (!stricmp(Name, colp->GetName())) {
|
||||
Nod = colp->Nod;
|
||||
Nodes = colp->Nodes;
|
||||
goto fin;
|
||||
} // endif Name
|
||||
|
||||
sprintf(g->Message, "Cannot parse updated column %s", Name);
|
||||
return true;
|
||||
} // endif To_Orig
|
||||
|
||||
pbuf = PlugDup(g, Jpath);
|
||||
|
||||
// The Jpath must be analyzed
|
||||
|
@ -998,6 +1012,7 @@ bool JSONCOL::ParseJpath(PGLOBAL g)
|
|||
|
||||
} // endfor i, p
|
||||
|
||||
fin:
|
||||
MulVal = AllocateValue(g, Value);
|
||||
Parsed = true;
|
||||
return false;
|
||||
|
@ -1147,7 +1162,7 @@ PVAL JSONCOL::ExpandArray(PGLOBAL g, PJAR arp, int n)
|
|||
|
||||
ars = MY_MIN(Tjp->Limit, arp->size());
|
||||
|
||||
if (!(jvp = arp->GetValue(Nodes[n].Nx))) {
|
||||
if (!(jvp = arp->GetValue((Nodes[n].Rx = Nodes[n].Nx)))) {
|
||||
strcpy(g->Message, "Logical error expanding array");
|
||||
longjmp(g->jumper[g->jump_level], 666);
|
||||
} // endif jvp
|
||||
|
@ -1278,7 +1293,7 @@ PJSON JSONCOL::GetRow(PGLOBAL g)
|
|||
if (Nodes[i].Rank)
|
||||
val = arp->GetValue(Nodes[i].Rank - 1);
|
||||
else
|
||||
val = arp->GetValue(Nodes[i].Nx);
|
||||
val = arp->GetValue(Nodes[i].Rx);
|
||||
|
||||
} else
|
||||
val = NULL;
|
||||
|
@ -1726,7 +1741,7 @@ bool TDBJSON::OpenDB(PGLOBAL g)
|
|||
/***********************************************************************/
|
||||
int TDBJSON::ReadDB(PGLOBAL g)
|
||||
{
|
||||
int rc;
|
||||
int rc;
|
||||
|
||||
N++;
|
||||
|
||||
|
|
|
@ -25,7 +25,8 @@ typedef struct _jnode {
|
|||
PVAL CncVal; // To cont value used for OP_CNC
|
||||
PVAL Valp; // The internal array VALUE
|
||||
int Rank; // The rank in array
|
||||
int Nx; // Same row number
|
||||
int Rx; // Read row number
|
||||
int Nx; // Next to read row number
|
||||
} JNODE, *PJNODE;
|
||||
|
||||
/***********************************************************************/
|
||||
|
|
|
@ -171,8 +171,10 @@ bool TDBMUL::InitFileNames(PGLOBAL g)
|
|||
} // endif hSearch
|
||||
|
||||
while (n < PFNZ) {
|
||||
strcat(strcat(strcpy(filename, drive), direc), FileData.cFileName);
|
||||
pfn[n++] = PlugDup(g, filename);
|
||||
if (!(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
|
||||
strcat(strcat(strcpy(filename, drive), direc), FileData.cFileName);
|
||||
pfn[n++] = PlugDup(g, filename);
|
||||
} // endif dwFileAttributes
|
||||
|
||||
if (!FindNextFile(hSearch, &FileData)) {
|
||||
rc = GetLastError();
|
||||
|
|
|
@ -1060,9 +1060,16 @@ bool TDBMYSQL::ReadKey(PGLOBAL g, OPVAL op, const void *key, int len)
|
|||
int oldlen = Query->GetLength();
|
||||
|
||||
if (!key || op == OP_NEXT ||
|
||||
Mode == MODE_UPDATE || Mode == MODE_DELETE)
|
||||
Mode == MODE_UPDATE || Mode == MODE_DELETE) {
|
||||
if (!key && Mode == MODE_READX) {
|
||||
// This is a false indexed read
|
||||
m_Rc = Myc.ExecSQL(g, Query->GetStr());
|
||||
Mode = MODE_READ;
|
||||
return (m_Rc == RC_FX) ? true : false;
|
||||
} // endif key
|
||||
|
||||
return false;
|
||||
else if (op == OP_FIRST) {
|
||||
} else if (op == OP_FIRST) {
|
||||
if (To_CondFil) {
|
||||
oom = Query->Append(" WHERE ");
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
/* */
|
||||
/* COPYRIGHT: */
|
||||
/* ---------- */
|
||||
/* (C) Copyright to PlugDB Software Development 2008-2014 */
|
||||
/* (C) Copyright to PlugDB Software Development 2008-2015 */
|
||||
/* Author: Olivier BERTRAND */
|
||||
/* */
|
||||
/* WHAT THIS PROGRAM DOES: */
|
||||
|
|
|
@ -52,7 +52,6 @@
|
|||
#include "tabutil.h"
|
||||
#include "ha_connect.h"
|
||||
|
||||
//extern "C" int zconv;
|
||||
int GetConvSize(void);
|
||||
|
||||
/************************************************************************/
|
||||
|
@ -72,11 +71,8 @@ TABLE_SHARE *GetTableShare(PGLOBAL g, THD *thd, const char *db,
|
|||
{
|
||||
char key[256];
|
||||
uint k;
|
||||
//TABLE_LIST table_list;
|
||||
TABLE_SHARE *s;
|
||||
|
||||
//table_list.init_one_table(db, strlen(db), name, strlen(name),
|
||||
// NULL, TL_IGNORE);
|
||||
k = sprintf(key, "%s", db) + 1;
|
||||
k += sprintf(key + k, "%s", name);
|
||||
key[++k] = 0;
|
||||
|
@ -86,9 +82,6 @@ TABLE_SHARE *GetTableShare(PGLOBAL g, THD *thd, const char *db,
|
|||
return NULL;
|
||||
} // endif s
|
||||
|
||||
// 1 2 4 8
|
||||
//flags = GTS_TABLE | GTS_VIEW | GTS_NOLOCK | GTS_FORCE_DISCOVERY;
|
||||
|
||||
if (!open_table_def(thd, s, GTS_TABLE | GTS_VIEW)) {
|
||||
if (!s->is_view) {
|
||||
if (stricmp(plugin_name(s->db_plugin)->str, "connect"))
|
||||
|
|
|
@ -1505,8 +1505,9 @@ bool XMLCOL::ParseXpath(PGLOBAL g, bool mode)
|
|||
} else if (Type == 2) {
|
||||
// HTML like table, columns are retrieved by position
|
||||
new(this) XPOSCOL(Value); // Change the class of this column
|
||||
Tdbp->Hasnod = true;
|
||||
return false;
|
||||
Inod = -1;
|
||||
// Tdbp->Hasnod = true;
|
||||
// return false;
|
||||
} else if (Type == 0 && !mode) {
|
||||
strcat(strcat(pbuf, "@"), Name);
|
||||
} else { // Type == 1
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/************* Value C++ Functions Source Code File (.CPP) *************/
|
||||
/* Name: VALUE.CPP Version 2.5 */
|
||||
/* */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2001-2014 */
|
||||
/* (C) Copyright to the author Olivier BERTRAND 2001-2015 */
|
||||
/* */
|
||||
/* This file contains the VALUE and derived classes family functions. */
|
||||
/* These classes contain values of different types. They are used so */
|
||||
|
|
Loading…
Reference in a new issue