mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Merge 10.4 into 10.5
This commit is contained in:
19
storage/spider/mysql-test/spider/bugfix/r/mdev_31117.result
Normal file
19
storage/spider/mysql-test/spider/bugfix/r/mdev_31117.result
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#
|
||||||
|
# MDEV-31117 Spider UBSAN runtime error: applying non-zero offset x to null pointer in st_spider_param_string_parse::restore_delims
|
||||||
|
#
|
||||||
|
for master_1
|
||||||
|
for child2
|
||||||
|
for child3
|
||||||
|
CREATE TABLE t (c INT) ENGINE=Spider COMMENT='abc';
|
||||||
|
ERROR HY000: The connect info 'abc' is invalid
|
||||||
|
ALTER TABLE mysql.help_topic ENGINE=Spider;
|
||||||
|
ERROR HY000: The connect info 'help topics' is invalid
|
||||||
|
CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
|
||||||
|
create table t2 (c int);
|
||||||
|
create table t1 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", "srv" "srv",TABLE "t2"';
|
||||||
|
ERROR HY000: The connect info '"srv" "srv",TABLE "t2"' is invalid
|
||||||
|
create table t1 (c int) ENGINE=Spider CONNECTION='WRAPPER "mysql", srv \'srv\',TABLE "t2", password "say \\"hello\\ world!\\""';
|
||||||
|
drop table t1, t2;
|
||||||
|
for master_1
|
||||||
|
for child2
|
||||||
|
for child3
|
30
storage/spider/mysql-test/spider/bugfix/t/mdev_31117.test
Normal file
30
storage/spider/mysql-test/spider/bugfix/t/mdev_31117.test
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # MDEV-31117 Spider UBSAN runtime error: applying non-zero offset x to null pointer in st_spider_param_string_parse::restore_delims
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--disable_query_log
|
||||||
|
--disable_result_log
|
||||||
|
--source ../../t/test_init.inc
|
||||||
|
--enable_result_log
|
||||||
|
--enable_query_log
|
||||||
|
|
||||||
|
--error 12501
|
||||||
|
CREATE TABLE t (c INT) ENGINE=Spider COMMENT='abc';
|
||||||
|
|
||||||
|
--error 12501
|
||||||
|
ALTER TABLE mysql.help_topic ENGINE=Spider;
|
||||||
|
|
||||||
|
evalp CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root');
|
||||||
|
create table t2 (c int);
|
||||||
|
# param title should not have delimiter
|
||||||
|
--error 12501
|
||||||
|
create table t1 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", "srv" "srv",TABLE "t2"';
|
||||||
|
# test escaping
|
||||||
|
create table t1 (c int) ENGINE=Spider CONNECTION='WRAPPER "mysql", srv \'srv\',TABLE "t2", password "say \\"hello\\ world!\\""';
|
||||||
|
drop table t1, t2;
|
||||||
|
|
||||||
|
--disable_query_log
|
||||||
|
--disable_result_log
|
||||||
|
--source ../t/test_deinit.inc
|
||||||
|
--enable_query_log
|
||||||
|
--enable_result_log
|
@@ -76,134 +76,78 @@ int spider_udf_set_copy_tables_param_default(
|
|||||||
|
|
||||||
#define SPIDER_PARAM_STR_LEN(name) name ## _length
|
#define SPIDER_PARAM_STR_LEN(name) name ## _length
|
||||||
#define SPIDER_PARAM_STR(title_name, param_name) \
|
#define SPIDER_PARAM_STR(title_name, param_name) \
|
||||||
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
|
if (!strncasecmp(parse.start_title, title_name, title_length)) \
|
||||||
{ \
|
{ \
|
||||||
DBUG_PRINT("info",("spider " title_name " start")); \
|
DBUG_PRINT("info",("spider " title_name " start")); \
|
||||||
if (!copy_tables->param_name) \
|
if (!copy_tables->param_name) \
|
||||||
{ \
|
{ \
|
||||||
if ((copy_tables->param_name = spider_get_string_between_quote( \
|
if ((copy_tables->param_name = spider_create_string(parse.start_value, \
|
||||||
start_ptr, TRUE, ¶m_string_parse))) \
|
value_length))) \
|
||||||
copy_tables->SPIDER_PARAM_STR_LEN(param_name) = \
|
copy_tables->SPIDER_PARAM_STR_LEN(param_name) = \
|
||||||
strlen(copy_tables->param_name); \
|
strlen(copy_tables->param_name); \
|
||||||
else { \
|
else { \
|
||||||
error_num = param_string_parse.print_param_error(); \
|
error_num= parse.fail(true); \
|
||||||
goto error; \
|
goto error; \
|
||||||
} \
|
} \
|
||||||
DBUG_PRINT("info",("spider " title_name "=%s", copy_tables->param_name)); \
|
DBUG_PRINT("info",("spider " title_name "=%s", copy_tables->param_name)); \
|
||||||
} \
|
} \
|
||||||
break; \
|
break; \
|
||||||
}
|
}
|
||||||
#define SPIDER_PARAM_HINT_WITH_MAX(title_name, param_name, check_length, max_size, min_val, max_val) \
|
|
||||||
if (!strncasecmp(tmp_ptr, title_name, check_length)) \
|
|
||||||
{ \
|
|
||||||
DBUG_PRINT("info",("spider " title_name " start")); \
|
|
||||||
DBUG_PRINT("info",("spider max_size=%d", max_size)); \
|
|
||||||
int hint_num = atoi(tmp_ptr + check_length) - 1; \
|
|
||||||
DBUG_PRINT("info",("spider hint_num=%d", hint_num)); \
|
|
||||||
DBUG_PRINT("info",("spider copy_tables->param_name=%x", \
|
|
||||||
copy_tables->param_name)); \
|
|
||||||
if (copy_tables->param_name) \
|
|
||||||
{ \
|
|
||||||
if (hint_num < 0 || hint_num >= max_size) \
|
|
||||||
{ \
|
|
||||||
error_num = param_string_parse.print_param_error(); \
|
|
||||||
goto error; \
|
|
||||||
} else if (copy_tables->param_name[hint_num] != -1) \
|
|
||||||
break; \
|
|
||||||
char *hint_str = spider_get_string_between_quote(start_ptr, FALSE); \
|
|
||||||
if (hint_str) \
|
|
||||||
{ \
|
|
||||||
copy_tables->param_name[hint_num] = atoi(hint_str); \
|
|
||||||
if (copy_tables->param_name[hint_num] < min_val) \
|
|
||||||
copy_tables->param_name[hint_num] = min_val; \
|
|
||||||
else if (copy_tables->param_name[hint_num] > max_val) \
|
|
||||||
copy_tables->param_name[hint_num] = max_val; \
|
|
||||||
} else { \
|
|
||||||
error_num = param_string_parse.print_param_error(); \
|
|
||||||
goto error; \
|
|
||||||
} \
|
|
||||||
DBUG_PRINT("info",("spider " title_name "[%d]=%d", hint_num, \
|
|
||||||
copy_tables->param_name[hint_num])); \
|
|
||||||
} else { \
|
|
||||||
error_num = param_string_parse.print_param_error(); \
|
|
||||||
goto error; \
|
|
||||||
} \
|
|
||||||
break; \
|
|
||||||
}
|
|
||||||
#define SPIDER_PARAM_INT_WITH_MAX(title_name, param_name, min_val, max_val) \
|
#define SPIDER_PARAM_INT_WITH_MAX(title_name, param_name, min_val, max_val) \
|
||||||
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
|
if (!strncasecmp(parse.start_title, title_name, title_length)) \
|
||||||
{ \
|
{ \
|
||||||
DBUG_PRINT("info",("spider " title_name " start")); \
|
DBUG_PRINT("info",("spider " title_name " start")); \
|
||||||
if (copy_tables->param_name == -1) \
|
if (copy_tables->param_name == -1) \
|
||||||
{ \
|
{ \
|
||||||
if ((tmp_ptr2 = spider_get_string_between_quote( \
|
copy_tables->param_name = atoi(parse.start_value); \
|
||||||
start_ptr, FALSE))) \
|
if (copy_tables->param_name < min_val) \
|
||||||
{ \
|
copy_tables->param_name = min_val; \
|
||||||
copy_tables->param_name = atoi(tmp_ptr2); \
|
else if (copy_tables->param_name > max_val) \
|
||||||
if (copy_tables->param_name < min_val) \
|
copy_tables->param_name = max_val; \
|
||||||
copy_tables->param_name = min_val; \
|
|
||||||
else if (copy_tables->param_name > max_val) \
|
|
||||||
copy_tables->param_name = max_val; \
|
|
||||||
param_string_parse.set_param_value(tmp_ptr2, \
|
|
||||||
tmp_ptr2 + \
|
|
||||||
strlen(tmp_ptr2) + 1); \
|
|
||||||
} else { \
|
|
||||||
error_num = param_string_parse.print_param_error(); \
|
|
||||||
goto error; \
|
|
||||||
} \
|
|
||||||
DBUG_PRINT("info",("spider " title_name "=%d", copy_tables->param_name)); \
|
DBUG_PRINT("info",("spider " title_name "=%d", copy_tables->param_name)); \
|
||||||
} \
|
} \
|
||||||
break; \
|
break; \
|
||||||
}
|
}
|
||||||
#define SPIDER_PARAM_INT(title_name, param_name, min_val) \
|
#define SPIDER_PARAM_INT(title_name, param_name, min_val) \
|
||||||
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
|
if (!strncasecmp(parse.start_title, title_name, title_length)) \
|
||||||
{ \
|
{ \
|
||||||
DBUG_PRINT("info",("spider " title_name " start")); \
|
DBUG_PRINT("info",("spider " title_name " start")); \
|
||||||
if (copy_tables->param_name == -1) \
|
if (copy_tables->param_name == -1) \
|
||||||
{ \
|
{ \
|
||||||
if ((tmp_ptr2 = spider_get_string_between_quote( \
|
copy_tables->param_name = atoi(parse.start_value); \
|
||||||
start_ptr, FALSE))) \
|
if (copy_tables->param_name < min_val) \
|
||||||
{ \
|
copy_tables->param_name = min_val; \
|
||||||
copy_tables->param_name = atoi(tmp_ptr2); \
|
|
||||||
if (copy_tables->param_name < min_val) \
|
|
||||||
copy_tables->param_name = min_val; \
|
|
||||||
param_string_parse.set_param_value(tmp_ptr2, \
|
|
||||||
tmp_ptr2 + \
|
|
||||||
strlen(tmp_ptr2) + 1); \
|
|
||||||
} else { \
|
|
||||||
error_num = param_string_parse.print_param_error(); \
|
|
||||||
goto error; \
|
|
||||||
} \
|
|
||||||
DBUG_PRINT("info",("spider " title_name "=%d", copy_tables->param_name)); \
|
DBUG_PRINT("info",("spider " title_name "=%d", copy_tables->param_name)); \
|
||||||
} \
|
} \
|
||||||
break; \
|
break; \
|
||||||
}
|
}
|
||||||
#define SPIDER_PARAM_LONGLONG(title_name, param_name, min_val) \
|
#define SPIDER_PARAM_LONGLONG(title_name, param_name, min_val) \
|
||||||
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
|
if (!strncasecmp(parse.start_title, title_name, title_length)) \
|
||||||
{ \
|
{ \
|
||||||
DBUG_PRINT("info",("spider " title_name " start")); \
|
DBUG_PRINT("info",("spider " title_name " start")); \
|
||||||
if (copy_tables->param_name == -1) \
|
if (copy_tables->param_name == -1) \
|
||||||
{ \
|
{ \
|
||||||
if ((tmp_ptr2 = spider_get_string_between_quote( \
|
copy_tables->param_name = \
|
||||||
start_ptr, FALSE))) \
|
my_strtoll10(parse.start_value, (char**) NULL, &error_num); \
|
||||||
{ \
|
if (copy_tables->param_name < min_val) \
|
||||||
copy_tables->param_name = \
|
copy_tables->param_name = min_val; \
|
||||||
my_strtoll10(tmp_ptr2, (char**) NULL, &error_num); \
|
|
||||||
if (copy_tables->param_name < min_val) \
|
|
||||||
copy_tables->param_name = min_val; \
|
|
||||||
param_string_parse.set_param_value(tmp_ptr2, \
|
|
||||||
tmp_ptr2 + \
|
|
||||||
strlen(tmp_ptr2) + 1); \
|
|
||||||
} else { \
|
|
||||||
error_num = param_string_parse.print_param_error(); \
|
|
||||||
goto error; \
|
|
||||||
} \
|
|
||||||
DBUG_PRINT("info",("spider " title_name "=%lld", \
|
DBUG_PRINT("info",("spider " title_name "=%lld", \
|
||||||
copy_tables->param_name)); \
|
copy_tables->param_name)); \
|
||||||
} \
|
} \
|
||||||
break; \
|
break; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void spider_minus_1(SPIDER_COPY_TABLES *copy_tables)
|
||||||
|
{
|
||||||
|
copy_tables->bulk_insert_interval = -1;
|
||||||
|
copy_tables->bulk_insert_rows = -1;
|
||||||
|
copy_tables->use_table_charset = -1;
|
||||||
|
copy_tables->use_transaction = -1;
|
||||||
|
#ifndef WITHOUT_SPIDER_BG_SEARCH
|
||||||
|
copy_tables->bg_mode = -1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
int spider_udf_parse_copy_tables_param(
|
int spider_udf_parse_copy_tables_param(
|
||||||
SPIDER_COPY_TABLES *copy_tables,
|
SPIDER_COPY_TABLES *copy_tables,
|
||||||
char *param,
|
char *param,
|
||||||
@@ -211,69 +155,40 @@ int spider_udf_parse_copy_tables_param(
|
|||||||
) {
|
) {
|
||||||
int error_num = 0;
|
int error_num = 0;
|
||||||
char *param_string = NULL;
|
char *param_string = NULL;
|
||||||
char *sprit_ptr;
|
char *start_param;
|
||||||
char *tmp_ptr, *tmp_ptr2, *start_ptr;
|
int title_length, value_length;
|
||||||
int title_length;
|
SPIDER_PARAM_STRING_PARSE parse;
|
||||||
SPIDER_PARAM_STRING_PARSE param_string_parse;
|
|
||||||
DBUG_ENTER("spider_udf_parse_copy_tables_param");
|
DBUG_ENTER("spider_udf_parse_copy_tables_param");
|
||||||
copy_tables->bulk_insert_interval = -1;
|
spider_minus_1(copy_tables);
|
||||||
copy_tables->bulk_insert_rows = -1;
|
|
||||||
copy_tables->use_table_charset = -1;
|
|
||||||
copy_tables->use_transaction = -1;
|
|
||||||
#ifndef WITHOUT_SPIDER_BG_SEARCH
|
|
||||||
copy_tables->bg_mode = -1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (param_length == 0)
|
if (param_length == 0)
|
||||||
goto set_default;
|
goto set_default;
|
||||||
DBUG_PRINT("info",("spider create param_string string"));
|
DBUG_PRINT("info",("spider create param_string string"));
|
||||||
if (
|
if (!(param_string = spider_create_string(param, param_length)))
|
||||||
!(param_string = spider_create_string(
|
{
|
||||||
param,
|
|
||||||
param_length))
|
|
||||||
) {
|
|
||||||
error_num = HA_ERR_OUT_OF_MEM;
|
error_num = HA_ERR_OUT_OF_MEM;
|
||||||
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
||||||
goto error_alloc_param_string;
|
goto error_alloc_param_string;
|
||||||
}
|
}
|
||||||
DBUG_PRINT("info",("spider param_string=%s", param_string));
|
DBUG_PRINT("info",("spider param_string=%s", param_string));
|
||||||
|
|
||||||
sprit_ptr = param_string;
|
start_param = param_string;
|
||||||
param_string_parse.init(param_string, ER_SPIDER_INVALID_UDF_PARAM_NUM);
|
parse.error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM;
|
||||||
while (sprit_ptr)
|
while (*start_param != '\0')
|
||||||
{
|
{
|
||||||
tmp_ptr = sprit_ptr;
|
if (parse.locate_param_def(start_param))
|
||||||
while (*tmp_ptr == ' ' || *tmp_ptr == '\r' ||
|
|
||||||
*tmp_ptr == '\n' || *tmp_ptr == '\t')
|
|
||||||
tmp_ptr++;
|
|
||||||
|
|
||||||
if (*tmp_ptr == '\0')
|
|
||||||
break;
|
|
||||||
|
|
||||||
title_length = 0;
|
|
||||||
start_ptr = tmp_ptr;
|
|
||||||
while (*start_ptr != ' ' && *start_ptr != '\'' &&
|
|
||||||
*start_ptr != '"' && *start_ptr != '\0' &&
|
|
||||||
*start_ptr != '\r' && *start_ptr != '\n' &&
|
|
||||||
*start_ptr != '\t')
|
|
||||||
{
|
|
||||||
title_length++;
|
|
||||||
start_ptr++;
|
|
||||||
}
|
|
||||||
param_string_parse.set_param_title(tmp_ptr, tmp_ptr + title_length);
|
|
||||||
if ((error_num = param_string_parse.get_next_parameter_head(
|
|
||||||
start_ptr, &sprit_ptr)))
|
|
||||||
{
|
{
|
||||||
|
error_num= parse.fail(false);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
/* Null the end of the parameter value. */
|
||||||
|
*parse.end_value= '\0';
|
||||||
|
value_length= (int) (parse.end_value - parse.start_value);
|
||||||
|
|
||||||
switch (title_length)
|
switch (title_length = (int) (parse.end_title - parse.start_title))
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
if (error_num)
|
goto error;
|
||||||
goto error;
|
|
||||||
continue;
|
|
||||||
case 3:
|
case 3:
|
||||||
#ifndef WITHOUT_SPIDER_BG_SEARCH
|
#ifndef WITHOUT_SPIDER_BG_SEARCH
|
||||||
SPIDER_PARAM_INT_WITH_MAX("bgm", bg_mode, 0, 1);
|
SPIDER_PARAM_INT_WITH_MAX("bgm", bg_mode, 0, 1);
|
||||||
@@ -283,55 +198,45 @@ int spider_udf_parse_copy_tables_param(
|
|||||||
SPIDER_PARAM_STR("dtb", database);
|
SPIDER_PARAM_STR("dtb", database);
|
||||||
SPIDER_PARAM_INT_WITH_MAX("utc", use_table_charset, 0, 1);
|
SPIDER_PARAM_INT_WITH_MAX("utc", use_table_charset, 0, 1);
|
||||||
SPIDER_PARAM_INT_WITH_MAX("utr", use_transaction, 0, 1);
|
SPIDER_PARAM_INT_WITH_MAX("utr", use_transaction, 0, 1);
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
#ifndef WITHOUT_SPIDER_BG_SEARCH
|
#ifndef WITHOUT_SPIDER_BG_SEARCH
|
||||||
case 7:
|
case 7:
|
||||||
SPIDER_PARAM_INT_WITH_MAX("bg_mode", bg_mode, 0, 1);
|
SPIDER_PARAM_INT_WITH_MAX("bg_mode", bg_mode, 0, 1);
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
#endif
|
#endif
|
||||||
case 8:
|
case 8:
|
||||||
SPIDER_PARAM_STR("database", database);
|
SPIDER_PARAM_STR("database", database);
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
case 15:
|
case 15:
|
||||||
SPIDER_PARAM_INT_WITH_MAX("use_transaction", use_transaction, 0, 1);
|
SPIDER_PARAM_INT_WITH_MAX("use_transaction", use_transaction, 0, 1);
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
case 16:
|
case 16:
|
||||||
SPIDER_PARAM_LONGLONG("bulk_insert_rows", bulk_insert_rows, 1);
|
SPIDER_PARAM_LONGLONG("bulk_insert_rows", bulk_insert_rows, 1);
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
case 17:
|
case 17:
|
||||||
SPIDER_PARAM_INT_WITH_MAX(
|
SPIDER_PARAM_INT_WITH_MAX(
|
||||||
"use_table_charset", use_table_charset, 0, 1);
|
"use_table_charset", use_table_charset, 0, 1);
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
case 20:
|
case 20:
|
||||||
SPIDER_PARAM_INT("bulk_insert_interval", bulk_insert_interval, 0);
|
SPIDER_PARAM_INT("bulk_insert_interval", bulk_insert_interval, 0);
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
default:
|
default:
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
/* Restore delim */
|
||||||
/* Verify that the remainder of the parameter value is whitespace */
|
*parse.end_value= parse.delim_value;
|
||||||
if ((error_num = param_string_parse.has_extra_parameter_values()))
|
|
||||||
goto error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
set_default:
|
set_default:
|
||||||
if ((error_num = spider_udf_set_copy_tables_param_default(
|
error_num = spider_udf_set_copy_tables_param_default(copy_tables);
|
||||||
copy_tables
|
|
||||||
)))
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (param_string)
|
|
||||||
spider_free(spider_current_trx, param_string, MYF(0));
|
|
||||||
DBUG_RETURN(0);
|
|
||||||
|
|
||||||
error:
|
error:
|
||||||
if (param_string)
|
if (param_string)
|
||||||
spider_free(spider_current_trx, param_string, MYF(0));
|
spider_free(spider_current_trx, param_string, MYF(0));
|
||||||
|
@@ -1035,17 +1035,16 @@ error:
|
|||||||
|
|
||||||
#define SPIDER_PARAM_STR_LEN(name) name ## _length
|
#define SPIDER_PARAM_STR_LEN(name) name ## _length
|
||||||
#define SPIDER_PARAM_STR(title_name, param_name) \
|
#define SPIDER_PARAM_STR(title_name, param_name) \
|
||||||
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
|
if (!strncasecmp(parse.start_title, title_name, title_length)) \
|
||||||
{ \
|
{ \
|
||||||
DBUG_PRINT("info",("spider " title_name " start")); \
|
DBUG_PRINT("info",("spider " title_name " start")); \
|
||||||
if (!direct_sql->param_name) \
|
if (!direct_sql->param_name) \
|
||||||
{ \
|
{ \
|
||||||
if ((direct_sql->param_name = spider_get_string_between_quote( \
|
if ((direct_sql->param_name = spider_create_string(parse.start_value, \
|
||||||
start_ptr, TRUE, ¶m_string_parse))) \
|
value_length))) \
|
||||||
direct_sql->SPIDER_PARAM_STR_LEN(param_name) = \
|
direct_sql->SPIDER_PARAM_STR_LEN(param_name) = strlen(direct_sql->param_name); \
|
||||||
strlen(direct_sql->param_name); \
|
|
||||||
else { \
|
else { \
|
||||||
error_num = param_string_parse.print_param_error(); \
|
error_num= parse.fail(true); \
|
||||||
goto error; \
|
goto error; \
|
||||||
} \
|
} \
|
||||||
DBUG_PRINT("info",("spider " title_name "=%s", direct_sql->param_name)); \
|
DBUG_PRINT("info",("spider " title_name "=%s", direct_sql->param_name)); \
|
||||||
@@ -1053,130 +1052,81 @@ error:
|
|||||||
break; \
|
break; \
|
||||||
}
|
}
|
||||||
#define SPIDER_PARAM_HINT_WITH_MAX(title_name, param_name, check_length, max_size, min_val, max_val) \
|
#define SPIDER_PARAM_HINT_WITH_MAX(title_name, param_name, check_length, max_size, min_val, max_val) \
|
||||||
if (!strncasecmp(tmp_ptr, title_name, check_length)) \
|
if (!strncasecmp(parse.start_title, title_name, check_length)) \
|
||||||
{ \
|
{ \
|
||||||
DBUG_PRINT("info",("spider " title_name " start")); \
|
DBUG_PRINT("info",("spider " title_name " start")); \
|
||||||
DBUG_PRINT("info",("spider max_size=%d", max_size)); \
|
DBUG_PRINT("info",("spider max_size=%d", max_size)); \
|
||||||
int hint_num = atoi(tmp_ptr + check_length) - 1; \
|
int hint_num = atoi(parse.start_title + check_length) - 1; \
|
||||||
DBUG_PRINT("info",("spider hint_num=%d", hint_num)); \
|
DBUG_PRINT("info",("spider hint_num=%d", hint_num)); \
|
||||||
DBUG_PRINT("info",("spider direct_sql->param_name=%p", \
|
DBUG_PRINT("info",("spider direct_sql->param_name=%p", \
|
||||||
direct_sql->param_name)); \
|
direct_sql->param_name)); \
|
||||||
if (direct_sql->param_name) \
|
if (direct_sql->param_name) \
|
||||||
{ \
|
{ \
|
||||||
if (hint_num < 0 || hint_num >= max_size) \
|
if (hint_num < 0 || hint_num >= max_size) \
|
||||||
{ \
|
{ \
|
||||||
error_num = param_string_parse.print_param_error(); \
|
error_num= parse.fail(true); \
|
||||||
goto error; \
|
goto error; \
|
||||||
} else if (direct_sql->param_name[hint_num] != -1) \
|
} else if (direct_sql->param_name[hint_num] != -1) \
|
||||||
break; \
|
break; \
|
||||||
char *hint_str = spider_get_string_between_quote(start_ptr, FALSE); \
|
direct_sql->param_name[hint_num] = atoi(parse.start_value); \
|
||||||
if (hint_str) \
|
if (direct_sql->param_name[hint_num] < min_val) \
|
||||||
{ \
|
direct_sql->param_name[hint_num] = min_val; \
|
||||||
direct_sql->param_name[hint_num] = atoi(hint_str); \
|
else if (direct_sql->param_name[hint_num] > max_val) \
|
||||||
if (direct_sql->param_name[hint_num] < min_val) \
|
direct_sql->param_name[hint_num] = max_val; \
|
||||||
direct_sql->param_name[hint_num] = min_val; \
|
|
||||||
else if (direct_sql->param_name[hint_num] > max_val) \
|
|
||||||
direct_sql->param_name[hint_num] = max_val; \
|
|
||||||
} else { \
|
|
||||||
error_num = param_string_parse.print_param_error(); \
|
|
||||||
goto error; \
|
|
||||||
} \
|
|
||||||
DBUG_PRINT("info",("spider " title_name "[%d]=%d", hint_num, \
|
DBUG_PRINT("info",("spider " title_name "[%d]=%d", hint_num, \
|
||||||
direct_sql->param_name[hint_num])); \
|
direct_sql->param_name[hint_num])); \
|
||||||
} else { \
|
} else { \
|
||||||
error_num = param_string_parse.print_param_error(); \
|
error_num= parse.fail(true); \
|
||||||
goto error; \
|
goto error; \
|
||||||
} \
|
} \
|
||||||
break; \
|
break; \
|
||||||
}
|
}
|
||||||
#define SPIDER_PARAM_INT_WITH_MAX(title_name, param_name, min_val, max_val) \
|
#define SPIDER_PARAM_INT_WITH_MAX(title_name, param_name, min_val, max_val) \
|
||||||
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
|
if (!strncasecmp(parse.start_title, title_name, title_length)) \
|
||||||
{ \
|
{ \
|
||||||
DBUG_PRINT("info",("spider " title_name " start")); \
|
DBUG_PRINT("info",("spider " title_name " start")); \
|
||||||
if (direct_sql->param_name == -1) \
|
if (direct_sql->param_name == -1) \
|
||||||
{ \
|
{ \
|
||||||
if ((tmp_ptr2 = spider_get_string_between_quote( \
|
direct_sql->param_name = atoi(parse.start_value); \
|
||||||
start_ptr, FALSE))) \
|
if (direct_sql->param_name < min_val) \
|
||||||
{ \
|
direct_sql->param_name = min_val; \
|
||||||
direct_sql->param_name = atoi(tmp_ptr2); \
|
else if (direct_sql->param_name > max_val) \
|
||||||
if (direct_sql->param_name < min_val) \
|
direct_sql->param_name = max_val; \
|
||||||
direct_sql->param_name = min_val; \
|
|
||||||
else if (direct_sql->param_name > max_val) \
|
|
||||||
direct_sql->param_name = max_val; \
|
|
||||||
param_string_parse.set_param_value(tmp_ptr2, \
|
|
||||||
tmp_ptr2 + \
|
|
||||||
strlen(tmp_ptr2) + 1); \
|
|
||||||
} else { \
|
|
||||||
error_num = param_string_parse.print_param_error(); \
|
|
||||||
goto error; \
|
|
||||||
} \
|
|
||||||
DBUG_PRINT("info",("spider " title_name "=%d", \
|
DBUG_PRINT("info",("spider " title_name "=%d", \
|
||||||
(int) direct_sql->param_name)); \
|
(int) direct_sql->param_name)); \
|
||||||
} \
|
} \
|
||||||
break; \
|
break; \
|
||||||
}
|
}
|
||||||
#define SPIDER_PARAM_INT(title_name, param_name, min_val) \
|
#define SPIDER_PARAM_INT(title_name, param_name, min_val) \
|
||||||
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
|
if (!strncasecmp(parse.start_title, title_name, title_length)) \
|
||||||
{ \
|
{ \
|
||||||
DBUG_PRINT("info",("spider " title_name " start")); \
|
DBUG_PRINT("info",("spider " title_name " start")); \
|
||||||
if (direct_sql->param_name == -1) \
|
if (direct_sql->param_name == -1) \
|
||||||
{ \
|
{ \
|
||||||
if ((tmp_ptr2 = spider_get_string_between_quote( \
|
direct_sql->param_name = atoi(parse.start_value); \
|
||||||
start_ptr, FALSE))) \
|
if (direct_sql->param_name < min_val) \
|
||||||
{ \
|
direct_sql->param_name = min_val; \
|
||||||
direct_sql->param_name = atoi(tmp_ptr2); \
|
|
||||||
if (direct_sql->param_name < min_val) \
|
|
||||||
direct_sql->param_name = min_val; \
|
|
||||||
param_string_parse.set_param_value(tmp_ptr2, \
|
|
||||||
tmp_ptr2 + \
|
|
||||||
strlen(tmp_ptr2) + 1); \
|
|
||||||
} else { \
|
|
||||||
error_num = param_string_parse.print_param_error(); \
|
|
||||||
goto error; \
|
|
||||||
} \
|
|
||||||
DBUG_PRINT("info",("spider " title_name "=%d", direct_sql->param_name)); \
|
DBUG_PRINT("info",("spider " title_name "=%d", direct_sql->param_name)); \
|
||||||
} \
|
} \
|
||||||
break; \
|
break; \
|
||||||
}
|
}
|
||||||
#define SPIDER_PARAM_LONGLONG(title_name, param_name, min_val) \
|
#define SPIDER_PARAM_LONGLONG(title_name, param_name, min_val) \
|
||||||
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
|
if (!strncasecmp(parse.start_title, title_name, title_length)) \
|
||||||
{ \
|
{ \
|
||||||
DBUG_PRINT("info",("spider " title_name " start")); \
|
DBUG_PRINT("info",("spider " title_name " start")); \
|
||||||
if (direct_sql->param_name == -1) \
|
if (direct_sql->param_name == -1) \
|
||||||
{ \
|
{ \
|
||||||
if ((tmp_ptr2 = spider_get_string_between_quote( \
|
direct_sql->param_name = my_strtoll10(parse.start_value, (char**) NULL, \
|
||||||
start_ptr, FALSE))) \
|
&error_num); \
|
||||||
{ \
|
if (direct_sql->param_name < min_val) \
|
||||||
direct_sql->param_name = \
|
direct_sql->param_name = min_val; \
|
||||||
my_strtoll10(tmp_ptr2, (char**) NULL, &error_num); \
|
DBUG_PRINT("info",("spider " title_name "=%lld", direct_sql->param_name)); \
|
||||||
if (direct_sql->param_name < min_val) \
|
|
||||||
direct_sql->param_name = min_val; \
|
|
||||||
param_string_parse.set_param_value(tmp_ptr2, \
|
|
||||||
tmp_ptr2 + \
|
|
||||||
strlen(tmp_ptr2) + 1); \
|
|
||||||
} else { \
|
|
||||||
error_num = param_string_parse.print_param_error(); \
|
|
||||||
goto error; \
|
|
||||||
} \
|
|
||||||
DBUG_PRINT("info",("spider " title_name "=%lld", \
|
|
||||||
direct_sql->param_name)); \
|
|
||||||
} \
|
} \
|
||||||
break; \
|
break; \
|
||||||
}
|
}
|
||||||
|
|
||||||
int spider_udf_parse_direct_sql_param(
|
static void spider_minus_1(SPIDER_DIRECT_SQL *direct_sql)
|
||||||
SPIDER_TRX *trx,
|
{
|
||||||
SPIDER_DIRECT_SQL *direct_sql,
|
|
||||||
const char *param,
|
|
||||||
int param_length
|
|
||||||
) {
|
|
||||||
int error_num = 0, roop_count;
|
|
||||||
char *param_string = NULL;
|
|
||||||
char *sprit_ptr;
|
|
||||||
char *tmp_ptr, *tmp_ptr2, *start_ptr;
|
|
||||||
int title_length;
|
|
||||||
SPIDER_PARAM_STRING_PARSE param_string_parse;
|
|
||||||
DBUG_ENTER("spider_udf_parse_direct_sql_param");
|
|
||||||
direct_sql->tgt_port = -1;
|
direct_sql->tgt_port = -1;
|
||||||
direct_sql->tgt_ssl_vsc = -1;
|
direct_sql->tgt_ssl_vsc = -1;
|
||||||
direct_sql->table_loop_mode = -1;
|
direct_sql->table_loop_mode = -1;
|
||||||
@@ -1194,59 +1144,53 @@ int spider_udf_parse_direct_sql_param(
|
|||||||
direct_sql->use_real_table = -1;
|
direct_sql->use_real_table = -1;
|
||||||
#endif
|
#endif
|
||||||
direct_sql->error_rw_mode = -1;
|
direct_sql->error_rw_mode = -1;
|
||||||
for (roop_count = 0; roop_count < direct_sql->table_count; roop_count++)
|
for (int i = 0; i < direct_sql->table_count; i++)
|
||||||
direct_sql->iop[roop_count] = -1;
|
direct_sql->iop[i] = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int spider_udf_parse_direct_sql_param(
|
||||||
|
SPIDER_TRX *trx,
|
||||||
|
SPIDER_DIRECT_SQL *direct_sql,
|
||||||
|
const char *param,
|
||||||
|
int param_length
|
||||||
|
) {
|
||||||
|
int error_num = 0;
|
||||||
|
char *param_string = NULL;
|
||||||
|
char *start_param;
|
||||||
|
int title_length, value_length;
|
||||||
|
SPIDER_PARAM_STRING_PARSE parse;
|
||||||
|
DBUG_ENTER("spider_udf_parse_direct_sql_param");
|
||||||
|
|
||||||
|
spider_minus_1(direct_sql);
|
||||||
if (param_length == 0)
|
if (param_length == 0)
|
||||||
goto set_default;
|
goto set_default;
|
||||||
DBUG_PRINT("info",("spider create param_string string"));
|
DBUG_PRINT("info",("spider create param_string string"));
|
||||||
if (
|
if (!(param_string = spider_create_string(param, param_length)))
|
||||||
!(param_string = spider_create_string(
|
{
|
||||||
param,
|
|
||||||
param_length))
|
|
||||||
) {
|
|
||||||
error_num = HA_ERR_OUT_OF_MEM;
|
error_num = HA_ERR_OUT_OF_MEM;
|
||||||
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
||||||
goto error_alloc_param_string;
|
goto error_alloc_param_string;
|
||||||
}
|
}
|
||||||
DBUG_PRINT("info",("spider param_string=%s", param_string));
|
DBUG_PRINT("info",("spider param_string=%s", param_string));
|
||||||
|
|
||||||
sprit_ptr = param_string;
|
start_param = param_string;
|
||||||
param_string_parse.init(param_string, ER_SPIDER_INVALID_UDF_PARAM_NUM);
|
parse.error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM;
|
||||||
while (sprit_ptr)
|
while (*start_param != '\0')
|
||||||
{
|
{
|
||||||
tmp_ptr = sprit_ptr;
|
if (parse.locate_param_def(start_param))
|
||||||
while (*tmp_ptr == ' ' || *tmp_ptr == '\r' ||
|
|
||||||
*tmp_ptr == '\n' || *tmp_ptr == '\t')
|
|
||||||
tmp_ptr++;
|
|
||||||
|
|
||||||
if (*tmp_ptr == '\0')
|
|
||||||
break;
|
|
||||||
|
|
||||||
title_length = 0;
|
|
||||||
start_ptr = tmp_ptr;
|
|
||||||
while (*start_ptr != ' ' && *start_ptr != '\'' &&
|
|
||||||
*start_ptr != '"' && *start_ptr != '\0' &&
|
|
||||||
*start_ptr != '\r' && *start_ptr != '\n' &&
|
|
||||||
*start_ptr != '\t')
|
|
||||||
{
|
|
||||||
title_length++;
|
|
||||||
start_ptr++;
|
|
||||||
}
|
|
||||||
param_string_parse.set_param_title(tmp_ptr, tmp_ptr + title_length);
|
|
||||||
if ((error_num = param_string_parse.get_next_parameter_head(
|
|
||||||
start_ptr, &sprit_ptr)))
|
|
||||||
{
|
{
|
||||||
|
error_num= parse.fail(false);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
/* Null the end of the parameter value. */
|
||||||
|
*parse.end_value= '\0';
|
||||||
|
value_length= (int) (parse.end_value - parse.start_value);
|
||||||
|
|
||||||
switch (title_length)
|
switch (title_length = (int) (parse.end_title - parse.start_title))
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
if (error_num)
|
goto error;
|
||||||
goto error;
|
|
||||||
continue;
|
|
||||||
case 3:
|
case 3:
|
||||||
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
|
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
|
||||||
SPIDER_PARAM_INT_WITH_MAX("acm", access_mode, 0, 2);
|
SPIDER_PARAM_INT_WITH_MAX("acm", access_mode, 0, 2);
|
||||||
@@ -1272,112 +1216,97 @@ int spider_udf_parse_direct_sql_param(
|
|||||||
SPIDER_PARAM_INT_WITH_MAX("urt", use_real_table, 0, 1);
|
SPIDER_PARAM_INT_WITH_MAX("urt", use_real_table, 0, 1);
|
||||||
#endif
|
#endif
|
||||||
SPIDER_PARAM_INT("wto", net_write_timeout, 0);
|
SPIDER_PARAM_INT("wto", net_write_timeout, 0);
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
case 4:
|
case 4:
|
||||||
SPIDER_PARAM_INT_WITH_MAX("erwm", error_rw_mode, 0, 1);
|
SPIDER_PARAM_INT_WITH_MAX("erwm", error_rw_mode, 0, 1);
|
||||||
SPIDER_PARAM_STR("host", tgt_host);
|
SPIDER_PARAM_STR("host", tgt_host);
|
||||||
SPIDER_PARAM_INT_WITH_MAX("port", tgt_port, 0, 65535);
|
SPIDER_PARAM_INT_WITH_MAX("port", tgt_port, 0, 65535);
|
||||||
SPIDER_PARAM_STR("user", tgt_username);
|
SPIDER_PARAM_STR("user", tgt_username);
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
case 6:
|
case 6:
|
||||||
SPIDER_PARAM_STR("server", server_name);
|
SPIDER_PARAM_STR("server", server_name);
|
||||||
SPIDER_PARAM_STR("socket", tgt_socket);
|
SPIDER_PARAM_STR("socket", tgt_socket);
|
||||||
SPIDER_PARAM_HINT_WITH_MAX("iop", iop, 3, direct_sql->table_count, 0, 2);
|
SPIDER_PARAM_HINT_WITH_MAX("iop", iop, 3, direct_sql->table_count, 0, 2);
|
||||||
SPIDER_PARAM_STR("ssl_ca", tgt_ssl_ca);
|
SPIDER_PARAM_STR("ssl_ca", tgt_ssl_ca);
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
case 7:
|
case 7:
|
||||||
SPIDER_PARAM_STR("wrapper", tgt_wrapper);
|
SPIDER_PARAM_STR("wrapper", tgt_wrapper);
|
||||||
SPIDER_PARAM_STR("ssl_key", tgt_ssl_key);
|
SPIDER_PARAM_STR("ssl_key", tgt_ssl_key);
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
case 8:
|
case 8:
|
||||||
SPIDER_PARAM_STR("database", tgt_default_db_name);
|
SPIDER_PARAM_STR("database", tgt_default_db_name);
|
||||||
SPIDER_PARAM_STR("password", tgt_password);
|
SPIDER_PARAM_STR("password", tgt_password);
|
||||||
SPIDER_PARAM_LONGLONG("priority", priority, 0);
|
SPIDER_PARAM_LONGLONG("priority", priority, 0);
|
||||||
SPIDER_PARAM_STR("ssl_cert", tgt_ssl_cert);
|
SPIDER_PARAM_STR("ssl_cert", tgt_ssl_cert);
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
case 10:
|
case 10:
|
||||||
SPIDER_PARAM_STR("ssl_cipher", tgt_ssl_cipher);
|
SPIDER_PARAM_STR("ssl_cipher", tgt_ssl_cipher);
|
||||||
SPIDER_PARAM_STR("ssl_capath", tgt_ssl_capath);
|
SPIDER_PARAM_STR("ssl_capath", tgt_ssl_capath);
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
case 11:
|
case 11:
|
||||||
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
|
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
|
||||||
SPIDER_PARAM_INT_WITH_MAX("access_mode", access_mode, 0, 2);
|
SPIDER_PARAM_INT_WITH_MAX("access_mode", access_mode, 0, 2);
|
||||||
#endif
|
#endif
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
case 12:
|
case 12:
|
||||||
SPIDER_PARAM_STR("default_file", tgt_default_file);
|
SPIDER_PARAM_STR("default_file", tgt_default_file);
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
case 13:
|
case 13:
|
||||||
SPIDER_PARAM_STR("default_group", tgt_default_group);
|
SPIDER_PARAM_STR("default_group", tgt_default_group);
|
||||||
SPIDER_PARAM_INT_WITH_MAX("error_rw_mode", error_rw_mode, 0, 1);
|
SPIDER_PARAM_INT_WITH_MAX("error_rw_mode", error_rw_mode, 0, 1);
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
case 14:
|
case 14:
|
||||||
#if MYSQL_VERSION_ID < 50500
|
#if MYSQL_VERSION_ID < 50500
|
||||||
#else
|
#else
|
||||||
SPIDER_PARAM_INT_WITH_MAX("use_real_table", use_real_table, 0, 1);
|
SPIDER_PARAM_INT_WITH_MAX("use_real_table", use_real_table, 0, 1);
|
||||||
#endif
|
#endif
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
case 15:
|
case 15:
|
||||||
SPIDER_PARAM_INT_WITH_MAX("table_loop_mode", table_loop_mode, 0, 2);
|
SPIDER_PARAM_INT_WITH_MAX("table_loop_mode", table_loop_mode, 0, 2);
|
||||||
SPIDER_PARAM_INT("connect_timeout", connect_timeout, 0);
|
SPIDER_PARAM_INT("connect_timeout", connect_timeout, 0);
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
case 16:
|
case 16:
|
||||||
SPIDER_PARAM_LONGLONG("bulk_insert_rows", bulk_insert_rows, 1);
|
SPIDER_PARAM_LONGLONG("bulk_insert_rows", bulk_insert_rows, 1);
|
||||||
SPIDER_PARAM_INT("net_read_timeout", net_read_timeout, 0);
|
SPIDER_PARAM_INT("net_read_timeout", net_read_timeout, 0);
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
case 17:
|
case 17:
|
||||||
SPIDER_PARAM_INT("net_write_timeout", net_write_timeout, 0);
|
SPIDER_PARAM_INT("net_write_timeout", net_write_timeout, 0);
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
case 18:
|
case 18:
|
||||||
SPIDER_PARAM_INT_WITH_MAX(
|
SPIDER_PARAM_INT_WITH_MAX(
|
||||||
"connection_channel", connection_channel, 0, 63);
|
"connection_channel", connection_channel, 0, 63);
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
case 22:
|
case 22:
|
||||||
SPIDER_PARAM_INT_WITH_MAX("ssl_verify_server_cert", tgt_ssl_vsc, 0, 1);
|
SPIDER_PARAM_INT_WITH_MAX("ssl_verify_server_cert", tgt_ssl_vsc, 0, 1);
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
default:
|
default:
|
||||||
error_num = param_string_parse.print_param_error();
|
error_num= parse.fail(true);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
/* Restore delim */
|
||||||
/* Verify that the remainder of the parameter value is whitespace */
|
*parse.end_value= parse.delim_value;
|
||||||
if ((error_num = param_string_parse.has_extra_parameter_values()))
|
|
||||||
goto error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
set_default:
|
set_default:
|
||||||
if ((error_num = spider_udf_set_direct_sql_param_default(
|
error_num = spider_udf_set_direct_sql_param_default(trx, direct_sql);
|
||||||
trx,
|
|
||||||
direct_sql
|
|
||||||
)))
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (param_string)
|
|
||||||
{
|
|
||||||
spider_free(spider_current_trx, param_string, MYF(0));
|
|
||||||
}
|
|
||||||
DBUG_RETURN(0);
|
|
||||||
|
|
||||||
error:
|
error:
|
||||||
if (param_string)
|
if (param_string)
|
||||||
{
|
|
||||||
spider_free(spider_current_trx, param_string, MYF(0));
|
spider_free(spider_current_trx, param_string, MYF(0));
|
||||||
}
|
|
||||||
error_alloc_param_string:
|
error_alloc_param_string:
|
||||||
DBUG_RETURN(error_num);
|
DBUG_RETURN(error_num);
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -30,281 +30,21 @@
|
|||||||
|
|
||||||
typedef struct st_spider_param_string_parse
|
typedef struct st_spider_param_string_parse
|
||||||
{
|
{
|
||||||
char *start_ptr; /* Pointer to the start of the parameter string */
|
char *start_title; /* Pointer to the start of the current parameter
|
||||||
char *end_ptr; /* Pointer to the end of the parameter string */
|
title */
|
||||||
char *start_title_ptr; /* Pointer to the start of the current parameter
|
char *end_title; /* Pointer to the end of the current
|
||||||
title */
|
parameter value */
|
||||||
char *end_title_ptr; /* Pointer to the end of the current parameter
|
char *start_value; /* Pointer to the start of the current parameter
|
||||||
title */
|
value */
|
||||||
char *start_value_ptr; /* Pointer to the start of the current parameter
|
char *end_value; /* Pointer to the end of the current parameter
|
||||||
value */
|
value */
|
||||||
char *end_value_ptr; /* Pointer to the end of the current parameter
|
char delim_value; /* Current parameter value's delimiter
|
||||||
value */
|
character, either a single or a double quote */
|
||||||
int error_num; /* Error code of the error message to print when
|
int error_num; /* Error code of the error message to print when
|
||||||
an error is detected */
|
an error is detected */
|
||||||
uint delim_title_len; /* Length of the paramater title's delimiter */
|
|
||||||
uint delim_value_len; /* Length of the paramater value's delimiter */
|
|
||||||
char delim_title; /* Current parameter title's delimiter character */
|
|
||||||
char delim_value; /* Current parameter value's delimiter character */
|
|
||||||
|
|
||||||
/**
|
int fail(bool restore_delim);
|
||||||
Initialize the parameter string parse information.
|
bool locate_param_def(char*& start_param);
|
||||||
|
|
||||||
@param param_string Pointer to the parameter string being parsed.
|
|
||||||
@param error_code Error code of the error message to print when
|
|
||||||
an error is detected.
|
|
||||||
*/
|
|
||||||
|
|
||||||
inline void init(char *param_string, int error_code)
|
|
||||||
{
|
|
||||||
start_ptr = param_string;
|
|
||||||
end_ptr = start_ptr + strlen(start_ptr);
|
|
||||||
|
|
||||||
init_param_title();
|
|
||||||
init_param_value();
|
|
||||||
|
|
||||||
error_num = error_code;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Initialize the current parameter title.
|
|
||||||
*/
|
|
||||||
|
|
||||||
inline void init_param_title()
|
|
||||||
{
|
|
||||||
start_title_ptr = end_title_ptr = NULL;
|
|
||||||
delim_title_len = 0;
|
|
||||||
delim_title = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Save pointers to the start and end positions of the current parameter
|
|
||||||
title in the parameter string. Also save the parameter title's
|
|
||||||
delimiter character.
|
|
||||||
|
|
||||||
@param start_value Pointer to the start position of the current
|
|
||||||
parameter title.
|
|
||||||
@param end_value Pointer to the end position of the current
|
|
||||||
parameter title.
|
|
||||||
*/
|
|
||||||
|
|
||||||
inline void set_param_title(char *start_title, char *end_title)
|
|
||||||
{
|
|
||||||
start_title_ptr = start_title;
|
|
||||||
end_title_ptr = end_title;
|
|
||||||
|
|
||||||
if (*start_title == '"' ||
|
|
||||||
*start_title == '\'')
|
|
||||||
{
|
|
||||||
delim_title = *start_title;
|
|
||||||
|
|
||||||
if (start_title >= start_ptr && *--start_title == '\\')
|
|
||||||
delim_title_len = 2;
|
|
||||||
else
|
|
||||||
delim_title_len = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Initialize the current parameter value.
|
|
||||||
*/
|
|
||||||
|
|
||||||
inline void init_param_value()
|
|
||||||
{
|
|
||||||
start_value_ptr = end_value_ptr = NULL;
|
|
||||||
delim_value_len = 0;
|
|
||||||
delim_value = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Save pointers to the start and end positions of the current parameter
|
|
||||||
value in the parameter string. Also save the parameter value's
|
|
||||||
delimiter character.
|
|
||||||
|
|
||||||
@param start_value Pointer to the start position of the current
|
|
||||||
parameter value.
|
|
||||||
@param end_value Pointer to the end position of the current
|
|
||||||
parameter value.
|
|
||||||
*/
|
|
||||||
|
|
||||||
inline void set_param_value(char *start_value, char *end_value)
|
|
||||||
{
|
|
||||||
start_value_ptr = start_value--;
|
|
||||||
end_value_ptr = end_value;
|
|
||||||
|
|
||||||
if (*start_value == '"' ||
|
|
||||||
*start_value == '\'')
|
|
||||||
{
|
|
||||||
delim_value = *start_value;
|
|
||||||
|
|
||||||
if (*--start_value == '\\')
|
|
||||||
delim_value_len = 2;
|
|
||||||
else
|
|
||||||
delim_value_len = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Determine whether the current parameter in the parameter string has
|
|
||||||
extra parameter values.
|
|
||||||
|
|
||||||
@return 0 Current parameter value in the parameter string
|
|
||||||
does not have extra parameter values.
|
|
||||||
<> 0 Error code indicating that the current parameter
|
|
||||||
value in the parameter string has extra
|
|
||||||
parameter values.
|
|
||||||
*/
|
|
||||||
|
|
||||||
inline int has_extra_parameter_values()
|
|
||||||
{
|
|
||||||
int error_num = 0;
|
|
||||||
DBUG_ENTER("has_extra_parameter_values");
|
|
||||||
|
|
||||||
if (end_value_ptr)
|
|
||||||
{
|
|
||||||
/* There is a current parameter value */
|
|
||||||
char *end_param_ptr = end_value_ptr;
|
|
||||||
|
|
||||||
while (end_param_ptr < end_ptr &&
|
|
||||||
(*end_param_ptr == ' ' || *end_param_ptr == '\r' ||
|
|
||||||
*end_param_ptr == '\n' || *end_param_ptr == '\t'))
|
|
||||||
end_param_ptr++;
|
|
||||||
|
|
||||||
if (end_param_ptr < end_ptr && *end_param_ptr != '\0')
|
|
||||||
{
|
|
||||||
/* Extra values in parameter definition */
|
|
||||||
error_num = print_param_error();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DBUG_RETURN(error_num);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline int get_next_parameter_head(char *st, char **nx)
|
|
||||||
{
|
|
||||||
DBUG_ENTER("get_next_parameter_head");
|
|
||||||
char *sq = strchr(st, '\'');
|
|
||||||
char *dq = strchr(st, '"');
|
|
||||||
if (!sq && !dq)
|
|
||||||
{
|
|
||||||
DBUG_RETURN(print_param_error());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dq && (!sq || sq > dq))
|
|
||||||
{
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
++dq;
|
|
||||||
if (*dq == '\\')
|
|
||||||
{
|
|
||||||
++dq;
|
|
||||||
}
|
|
||||||
else if (*dq == '"')
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (*dq == '\0')
|
|
||||||
{
|
|
||||||
DBUG_RETURN(print_param_error());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
++dq;
|
|
||||||
if (*dq == '\0')
|
|
||||||
{
|
|
||||||
*nx = dq;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (*dq == ',')
|
|
||||||
{
|
|
||||||
*dq = '\0';
|
|
||||||
*nx = dq + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (*dq != ' ' && *dq != '\r' && *dq != '\n' && *dq != '\t')
|
|
||||||
{
|
|
||||||
DBUG_RETURN(print_param_error());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else /* sq && (!dq || sq <= dq) */
|
|
||||||
{
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
++sq;
|
|
||||||
if (*sq == '\\')
|
|
||||||
{
|
|
||||||
++sq;
|
|
||||||
}
|
|
||||||
else if (*sq == '\'')
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (*sq == '\0')
|
|
||||||
{
|
|
||||||
DBUG_RETURN(print_param_error());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
++sq;
|
|
||||||
if (*sq == '\0')
|
|
||||||
{
|
|
||||||
*nx = sq;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (*sq == ',')
|
|
||||||
{
|
|
||||||
*sq = '\0';
|
|
||||||
*nx = sq + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (*sq != ' ' && *sq != '\r' && *sq != '\n' && *sq != '\t')
|
|
||||||
{
|
|
||||||
DBUG_RETURN(print_param_error());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
DBUG_RETURN(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Restore the current parameter's input delimiter characters in the
|
|
||||||
parameter string. They were NULLed during parameter parsing.
|
|
||||||
*/
|
|
||||||
|
|
||||||
inline void restore_delims()
|
|
||||||
{
|
|
||||||
char *end = end_title_ptr - 1;
|
|
||||||
|
|
||||||
switch (delim_title_len)
|
|
||||||
{
|
|
||||||
case 2:
|
|
||||||
*end++ = '\\';
|
|
||||||
/* Fall through */
|
|
||||||
case 1:
|
|
||||||
*end = delim_title;
|
|
||||||
}
|
|
||||||
|
|
||||||
end = end_value_ptr - 1;
|
|
||||||
switch (delim_value_len)
|
|
||||||
{
|
|
||||||
case 2:
|
|
||||||
*end++ = '\\';
|
|
||||||
/* Fall through */
|
|
||||||
case 1:
|
|
||||||
*end = delim_value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Print a parameter string error message.
|
|
||||||
|
|
||||||
@return Error code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int print_param_error();
|
|
||||||
} SPIDER_PARAM_STRING_PARSE;
|
} SPIDER_PARAM_STRING_PARSE;
|
||||||
|
|
||||||
uchar *spider_tbl_get_key(
|
uchar *spider_tbl_get_key(
|
||||||
@@ -344,19 +84,12 @@ void spider_free_tmp_share_alloc(
|
|||||||
SPIDER_SHARE *share
|
SPIDER_SHARE *share
|
||||||
);
|
);
|
||||||
|
|
||||||
char *spider_get_string_between_quote(
|
|
||||||
char *ptr,
|
|
||||||
bool alloc,
|
|
||||||
SPIDER_PARAM_STRING_PARSE *param_string_parse = NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
int spider_create_string_list(
|
int spider_create_string_list(
|
||||||
char ***string_list,
|
char ***string_list,
|
||||||
uint **string_length_list,
|
uint **string_length_list,
|
||||||
uint *list_length,
|
uint *list_length,
|
||||||
char *str,
|
char *str,
|
||||||
uint length,
|
uint length
|
||||||
SPIDER_PARAM_STRING_PARSE *param_string_parse
|
|
||||||
);
|
);
|
||||||
|
|
||||||
int spider_create_long_list(
|
int spider_create_long_list(
|
||||||
@@ -365,8 +98,7 @@ int spider_create_long_list(
|
|||||||
char *str,
|
char *str,
|
||||||
uint length,
|
uint length,
|
||||||
long min_val,
|
long min_val,
|
||||||
long max_val,
|
long max_val
|
||||||
SPIDER_PARAM_STRING_PARSE *param_string_parse
|
|
||||||
);
|
);
|
||||||
|
|
||||||
int spider_create_longlong_list(
|
int spider_create_longlong_list(
|
||||||
@@ -375,8 +107,7 @@ int spider_create_longlong_list(
|
|||||||
char *str,
|
char *str,
|
||||||
uint length,
|
uint length,
|
||||||
longlong min_val,
|
longlong min_val,
|
||||||
longlong max_val,
|
longlong max_val
|
||||||
SPIDER_PARAM_STRING_PARSE *param_string_parse
|
|
||||||
);
|
);
|
||||||
|
|
||||||
int spider_increase_string_list(
|
int spider_increase_string_list(
|
||||||
|
Reference in New Issue
Block a user