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(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")); \
|
||||
if (!copy_tables->param_name) \
|
||||
{ \
|
||||
if ((copy_tables->param_name = spider_get_string_between_quote( \
|
||||
start_ptr, TRUE, ¶m_string_parse))) \
|
||||
if ((copy_tables->param_name = spider_create_string(parse.start_value, \
|
||||
value_length))) \
|
||||
copy_tables->SPIDER_PARAM_STR_LEN(param_name) = \
|
||||
strlen(copy_tables->param_name); \
|
||||
else { \
|
||||
error_num = param_string_parse.print_param_error(); \
|
||||
error_num= parse.fail(true); \
|
||||
goto error; \
|
||||
} \
|
||||
DBUG_PRINT("info",("spider " title_name "=%s", copy_tables->param_name)); \
|
||||
} \
|
||||
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) \
|
||||
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
|
||||
if (!strncasecmp(parse.start_title, title_name, title_length)) \
|
||||
{ \
|
||||
DBUG_PRINT("info",("spider " title_name " start")); \
|
||||
if (copy_tables->param_name == -1) \
|
||||
{ \
|
||||
if ((tmp_ptr2 = spider_get_string_between_quote( \
|
||||
start_ptr, FALSE))) \
|
||||
{ \
|
||||
copy_tables->param_name = atoi(tmp_ptr2); \
|
||||
if (copy_tables->param_name < min_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; \
|
||||
} \
|
||||
copy_tables->param_name = atoi(parse.start_value); \
|
||||
if (copy_tables->param_name < min_val) \
|
||||
copy_tables->param_name = min_val; \
|
||||
else if (copy_tables->param_name > max_val) \
|
||||
copy_tables->param_name = max_val; \
|
||||
DBUG_PRINT("info",("spider " title_name "=%d", copy_tables->param_name)); \
|
||||
} \
|
||||
break; \
|
||||
}
|
||||
#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")); \
|
||||
if (copy_tables->param_name == -1) \
|
||||
{ \
|
||||
if ((tmp_ptr2 = spider_get_string_between_quote( \
|
||||
start_ptr, FALSE))) \
|
||||
{ \
|
||||
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; \
|
||||
} \
|
||||
copy_tables->param_name = atoi(parse.start_value); \
|
||||
if (copy_tables->param_name < min_val) \
|
||||
copy_tables->param_name = min_val; \
|
||||
DBUG_PRINT("info",("spider " title_name "=%d", copy_tables->param_name)); \
|
||||
} \
|
||||
break; \
|
||||
}
|
||||
#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")); \
|
||||
if (copy_tables->param_name == -1) \
|
||||
{ \
|
||||
if ((tmp_ptr2 = spider_get_string_between_quote( \
|
||||
start_ptr, FALSE))) \
|
||||
{ \
|
||||
copy_tables->param_name = \
|
||||
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; \
|
||||
} \
|
||||
copy_tables->param_name = \
|
||||
my_strtoll10(parse.start_value, (char**) NULL, &error_num); \
|
||||
if (copy_tables->param_name < min_val) \
|
||||
copy_tables->param_name = min_val; \
|
||||
DBUG_PRINT("info",("spider " title_name "=%lld", \
|
||||
copy_tables->param_name)); \
|
||||
copy_tables->param_name)); \
|
||||
} \
|
||||
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(
|
||||
SPIDER_COPY_TABLES *copy_tables,
|
||||
char *param,
|
||||
@@ -211,69 +155,40 @@ int spider_udf_parse_copy_tables_param(
|
||||
) {
|
||||
int error_num = 0;
|
||||
char *param_string = NULL;
|
||||
char *sprit_ptr;
|
||||
char *tmp_ptr, *tmp_ptr2, *start_ptr;
|
||||
int title_length;
|
||||
SPIDER_PARAM_STRING_PARSE param_string_parse;
|
||||
char *start_param;
|
||||
int title_length, value_length;
|
||||
SPIDER_PARAM_STRING_PARSE parse;
|
||||
DBUG_ENTER("spider_udf_parse_copy_tables_param");
|
||||
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
|
||||
|
||||
spider_minus_1(copy_tables);
|
||||
if (param_length == 0)
|
||||
goto set_default;
|
||||
DBUG_PRINT("info",("spider create param_string string"));
|
||||
if (
|
||||
!(param_string = spider_create_string(
|
||||
param,
|
||||
param_length))
|
||||
) {
|
||||
if (!(param_string = spider_create_string(param, param_length)))
|
||||
{
|
||||
error_num = HA_ERR_OUT_OF_MEM;
|
||||
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
||||
goto error_alloc_param_string;
|
||||
}
|
||||
DBUG_PRINT("info",("spider param_string=%s", param_string));
|
||||
|
||||
sprit_ptr = param_string;
|
||||
param_string_parse.init(param_string, ER_SPIDER_INVALID_UDF_PARAM_NUM);
|
||||
while (sprit_ptr)
|
||||
start_param = param_string;
|
||||
parse.error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM;
|
||||
while (*start_param != '\0')
|
||||
{
|
||||
tmp_ptr = sprit_ptr;
|
||||
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)))
|
||||
if (parse.locate_param_def(start_param))
|
||||
{
|
||||
error_num= parse.fail(false);
|
||||
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:
|
||||
error_num = param_string_parse.print_param_error();
|
||||
if (error_num)
|
||||
goto error;
|
||||
continue;
|
||||
error_num= parse.fail(true);
|
||||
goto error;
|
||||
case 3:
|
||||
#ifndef WITHOUT_SPIDER_BG_SEARCH
|
||||
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_INT_WITH_MAX("utc", use_table_charset, 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;
|
||||
#ifndef WITHOUT_SPIDER_BG_SEARCH
|
||||
case 7:
|
||||
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;
|
||||
#endif
|
||||
case 8:
|
||||
SPIDER_PARAM_STR("database", database);
|
||||
error_num = param_string_parse.print_param_error();
|
||||
error_num= parse.fail(true);
|
||||
goto error;
|
||||
case 15:
|
||||
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;
|
||||
case 16:
|
||||
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;
|
||||
case 17:
|
||||
SPIDER_PARAM_INT_WITH_MAX(
|
||||
"use_table_charset", use_table_charset, 0, 1);
|
||||
error_num = param_string_parse.print_param_error();
|
||||
error_num= parse.fail(true);
|
||||
goto error;
|
||||
case 20:
|
||||
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;
|
||||
default:
|
||||
error_num = param_string_parse.print_param_error();
|
||||
error_num= parse.fail(true);
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Verify that the remainder of the parameter value is whitespace */
|
||||
if ((error_num = param_string_parse.has_extra_parameter_values()))
|
||||
goto error;
|
||||
/* Restore delim */
|
||||
*parse.end_value= parse.delim_value;
|
||||
}
|
||||
|
||||
set_default:
|
||||
if ((error_num = spider_udf_set_copy_tables_param_default(
|
||||
copy_tables
|
||||
)))
|
||||
goto error;
|
||||
|
||||
if (param_string)
|
||||
spider_free(spider_current_trx, param_string, MYF(0));
|
||||
DBUG_RETURN(0);
|
||||
|
||||
error_num = spider_udf_set_copy_tables_param_default(copy_tables);
|
||||
error:
|
||||
if (param_string)
|
||||
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(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")); \
|
||||
if (!direct_sql->param_name) \
|
||||
{ \
|
||||
if ((direct_sql->param_name = spider_get_string_between_quote( \
|
||||
start_ptr, TRUE, ¶m_string_parse))) \
|
||||
direct_sql->SPIDER_PARAM_STR_LEN(param_name) = \
|
||||
strlen(direct_sql->param_name); \
|
||||
if ((direct_sql->param_name = spider_create_string(parse.start_value, \
|
||||
value_length))) \
|
||||
direct_sql->SPIDER_PARAM_STR_LEN(param_name) = strlen(direct_sql->param_name); \
|
||||
else { \
|
||||
error_num = param_string_parse.print_param_error(); \
|
||||
error_num= parse.fail(true); \
|
||||
goto error; \
|
||||
} \
|
||||
DBUG_PRINT("info",("spider " title_name "=%s", direct_sql->param_name)); \
|
||||
@@ -1053,130 +1052,81 @@ error:
|
||||
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)) \
|
||||
if (!strncasecmp(parse.start_title, 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; \
|
||||
int hint_num = atoi(parse.start_title + check_length) - 1; \
|
||||
DBUG_PRINT("info",("spider hint_num=%d", hint_num)); \
|
||||
DBUG_PRINT("info",("spider direct_sql->param_name=%p", \
|
||||
direct_sql->param_name)); \
|
||||
direct_sql->param_name)); \
|
||||
if (direct_sql->param_name) \
|
||||
{ \
|
||||
if (hint_num < 0 || hint_num >= max_size) \
|
||||
{ \
|
||||
error_num = param_string_parse.print_param_error(); \
|
||||
error_num= parse.fail(true); \
|
||||
goto error; \
|
||||
} else if (direct_sql->param_name[hint_num] != -1) \
|
||||
break; \
|
||||
char *hint_str = spider_get_string_between_quote(start_ptr, FALSE); \
|
||||
if (hint_str) \
|
||||
{ \
|
||||
direct_sql->param_name[hint_num] = atoi(hint_str); \
|
||||
if (direct_sql->param_name[hint_num] < min_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; \
|
||||
} \
|
||||
direct_sql->param_name[hint_num] = atoi(parse.start_value); \
|
||||
if (direct_sql->param_name[hint_num] < min_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; \
|
||||
DBUG_PRINT("info",("spider " title_name "[%d]=%d", hint_num, \
|
||||
direct_sql->param_name[hint_num])); \
|
||||
direct_sql->param_name[hint_num])); \
|
||||
} else { \
|
||||
error_num = param_string_parse.print_param_error(); \
|
||||
error_num= parse.fail(true); \
|
||||
goto error; \
|
||||
} \
|
||||
break; \
|
||||
}
|
||||
#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")); \
|
||||
if (direct_sql->param_name == -1) \
|
||||
{ \
|
||||
if ((tmp_ptr2 = spider_get_string_between_quote( \
|
||||
start_ptr, FALSE))) \
|
||||
{ \
|
||||
direct_sql->param_name = atoi(tmp_ptr2); \
|
||||
if (direct_sql->param_name < min_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; \
|
||||
} \
|
||||
direct_sql->param_name = atoi(parse.start_value); \
|
||||
if (direct_sql->param_name < min_val) \
|
||||
direct_sql->param_name = min_val; \
|
||||
else if (direct_sql->param_name > max_val) \
|
||||
direct_sql->param_name = max_val; \
|
||||
DBUG_PRINT("info",("spider " title_name "=%d", \
|
||||
(int) direct_sql->param_name)); \
|
||||
(int) direct_sql->param_name)); \
|
||||
} \
|
||||
break; \
|
||||
}
|
||||
#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")); \
|
||||
if (direct_sql->param_name == -1) \
|
||||
{ \
|
||||
if ((tmp_ptr2 = spider_get_string_between_quote( \
|
||||
start_ptr, FALSE))) \
|
||||
{ \
|
||||
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; \
|
||||
} \
|
||||
direct_sql->param_name = atoi(parse.start_value); \
|
||||
if (direct_sql->param_name < min_val) \
|
||||
direct_sql->param_name = min_val; \
|
||||
DBUG_PRINT("info",("spider " title_name "=%d", direct_sql->param_name)); \
|
||||
} \
|
||||
break; \
|
||||
}
|
||||
#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")); \
|
||||
if (direct_sql->param_name == -1) \
|
||||
{ \
|
||||
if ((tmp_ptr2 = spider_get_string_between_quote( \
|
||||
start_ptr, FALSE))) \
|
||||
{ \
|
||||
direct_sql->param_name = \
|
||||
my_strtoll10(tmp_ptr2, (char**) NULL, &error_num); \
|
||||
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)); \
|
||||
direct_sql->param_name = my_strtoll10(parse.start_value, (char**) NULL, \
|
||||
&error_num); \
|
||||
if (direct_sql->param_name < min_val) \
|
||||
direct_sql->param_name = min_val; \
|
||||
DBUG_PRINT("info",("spider " title_name "=%lld", direct_sql->param_name)); \
|
||||
} \
|
||||
break; \
|
||||
}
|
||||
|
||||
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, 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");
|
||||
static void spider_minus_1(SPIDER_DIRECT_SQL *direct_sql)
|
||||
{
|
||||
direct_sql->tgt_port = -1;
|
||||
direct_sql->tgt_ssl_vsc = -1;
|
||||
direct_sql->table_loop_mode = -1;
|
||||
@@ -1194,59 +1144,53 @@ int spider_udf_parse_direct_sql_param(
|
||||
direct_sql->use_real_table = -1;
|
||||
#endif
|
||||
direct_sql->error_rw_mode = -1;
|
||||
for (roop_count = 0; roop_count < direct_sql->table_count; roop_count++)
|
||||
direct_sql->iop[roop_count] = -1;
|
||||
for (int i = 0; i < direct_sql->table_count; i++)
|
||||
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)
|
||||
goto set_default;
|
||||
DBUG_PRINT("info",("spider create param_string string"));
|
||||
if (
|
||||
!(param_string = spider_create_string(
|
||||
param,
|
||||
param_length))
|
||||
) {
|
||||
if (!(param_string = spider_create_string(param, param_length)))
|
||||
{
|
||||
error_num = HA_ERR_OUT_OF_MEM;
|
||||
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
|
||||
goto error_alloc_param_string;
|
||||
}
|
||||
DBUG_PRINT("info",("spider param_string=%s", param_string));
|
||||
|
||||
sprit_ptr = param_string;
|
||||
param_string_parse.init(param_string, ER_SPIDER_INVALID_UDF_PARAM_NUM);
|
||||
while (sprit_ptr)
|
||||
start_param = param_string;
|
||||
parse.error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM;
|
||||
while (*start_param != '\0')
|
||||
{
|
||||
tmp_ptr = sprit_ptr;
|
||||
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)))
|
||||
if (parse.locate_param_def(start_param))
|
||||
{
|
||||
error_num= parse.fail(false);
|
||||
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:
|
||||
error_num = param_string_parse.print_param_error();
|
||||
if (error_num)
|
||||
goto error;
|
||||
continue;
|
||||
error_num= parse.fail(true);
|
||||
goto error;
|
||||
case 3:
|
||||
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
|
||||
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);
|
||||
#endif
|
||||
SPIDER_PARAM_INT("wto", net_write_timeout, 0);
|
||||
error_num = param_string_parse.print_param_error();
|
||||
error_num= parse.fail(true);
|
||||
goto error;
|
||||
case 4:
|
||||
SPIDER_PARAM_INT_WITH_MAX("erwm", error_rw_mode, 0, 1);
|
||||
SPIDER_PARAM_STR("host", tgt_host);
|
||||
SPIDER_PARAM_INT_WITH_MAX("port", tgt_port, 0, 65535);
|
||||
SPIDER_PARAM_STR("user", tgt_username);
|
||||
error_num = param_string_parse.print_param_error();
|
||||
error_num= parse.fail(true);
|
||||
goto error;
|
||||
case 6:
|
||||
SPIDER_PARAM_STR("server", server_name);
|
||||
SPIDER_PARAM_STR("socket", tgt_socket);
|
||||
SPIDER_PARAM_HINT_WITH_MAX("iop", iop, 3, direct_sql->table_count, 0, 2);
|
||||
SPIDER_PARAM_STR("ssl_ca", tgt_ssl_ca);
|
||||
error_num = param_string_parse.print_param_error();
|
||||
error_num= parse.fail(true);
|
||||
goto error;
|
||||
case 7:
|
||||
SPIDER_PARAM_STR("wrapper", tgt_wrapper);
|
||||
SPIDER_PARAM_STR("ssl_key", tgt_ssl_key);
|
||||
error_num = param_string_parse.print_param_error();
|
||||
error_num= parse.fail(true);
|
||||
goto error;
|
||||
case 8:
|
||||
SPIDER_PARAM_STR("database", tgt_default_db_name);
|
||||
SPIDER_PARAM_STR("password", tgt_password);
|
||||
SPIDER_PARAM_LONGLONG("priority", priority, 0);
|
||||
SPIDER_PARAM_STR("ssl_cert", tgt_ssl_cert);
|
||||
error_num = param_string_parse.print_param_error();
|
||||
error_num= parse.fail(true);
|
||||
goto error;
|
||||
case 10:
|
||||
SPIDER_PARAM_STR("ssl_cipher", tgt_ssl_cipher);
|
||||
SPIDER_PARAM_STR("ssl_capath", tgt_ssl_capath);
|
||||
error_num = param_string_parse.print_param_error();
|
||||
error_num= parse.fail(true);
|
||||
goto error;
|
||||
case 11:
|
||||
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
|
||||
SPIDER_PARAM_INT_WITH_MAX("access_mode", access_mode, 0, 2);
|
||||
#endif
|
||||
error_num = param_string_parse.print_param_error();
|
||||
error_num= parse.fail(true);
|
||||
goto error;
|
||||
case 12:
|
||||
SPIDER_PARAM_STR("default_file", tgt_default_file);
|
||||
error_num = param_string_parse.print_param_error();
|
||||
error_num= parse.fail(true);
|
||||
goto error;
|
||||
case 13:
|
||||
SPIDER_PARAM_STR("default_group", tgt_default_group);
|
||||
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;
|
||||
case 14:
|
||||
#if MYSQL_VERSION_ID < 50500
|
||||
#else
|
||||
SPIDER_PARAM_INT_WITH_MAX("use_real_table", use_real_table, 0, 1);
|
||||
#endif
|
||||
error_num = param_string_parse.print_param_error();
|
||||
error_num= parse.fail(true);
|
||||
goto error;
|
||||
case 15:
|
||||
SPIDER_PARAM_INT_WITH_MAX("table_loop_mode", table_loop_mode, 0, 2);
|
||||
SPIDER_PARAM_INT("connect_timeout", connect_timeout, 0);
|
||||
error_num = param_string_parse.print_param_error();
|
||||
error_num= parse.fail(true);
|
||||
goto error;
|
||||
case 16:
|
||||
SPIDER_PARAM_LONGLONG("bulk_insert_rows", bulk_insert_rows, 1);
|
||||
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;
|
||||
case 17:
|
||||
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;
|
||||
case 18:
|
||||
SPIDER_PARAM_INT_WITH_MAX(
|
||||
"connection_channel", connection_channel, 0, 63);
|
||||
error_num = param_string_parse.print_param_error();
|
||||
error_num= parse.fail(true);
|
||||
goto error;
|
||||
case 22:
|
||||
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;
|
||||
default:
|
||||
error_num = param_string_parse.print_param_error();
|
||||
error_num= parse.fail(true);
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Verify that the remainder of the parameter value is whitespace */
|
||||
if ((error_num = param_string_parse.has_extra_parameter_values()))
|
||||
goto error;
|
||||
/* Restore delim */
|
||||
*parse.end_value= parse.delim_value;
|
||||
}
|
||||
|
||||
set_default:
|
||||
if ((error_num = spider_udf_set_direct_sql_param_default(
|
||||
trx,
|
||||
direct_sql
|
||||
)))
|
||||
goto error;
|
||||
|
||||
if (param_string)
|
||||
{
|
||||
spider_free(spider_current_trx, param_string, MYF(0));
|
||||
}
|
||||
DBUG_RETURN(0);
|
||||
|
||||
error_num = spider_udf_set_direct_sql_param_default(trx, direct_sql);
|
||||
error:
|
||||
if (param_string)
|
||||
{
|
||||
spider_free(spider_current_trx, param_string, MYF(0));
|
||||
}
|
||||
error_alloc_param_string:
|
||||
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
|
||||
{
|
||||
char *start_ptr; /* Pointer to the start of the parameter string */
|
||||
char *end_ptr; /* Pointer to the end of the parameter string */
|
||||
char *start_title_ptr; /* Pointer to the start of the current parameter
|
||||
title */
|
||||
char *end_title_ptr; /* Pointer to the end of the current parameter
|
||||
title */
|
||||
char *start_value_ptr; /* Pointer to the start of the current parameter
|
||||
value */
|
||||
char *end_value_ptr; /* Pointer to the end of the current parameter
|
||||
value */
|
||||
int error_num; /* Error code of the error message to print when
|
||||
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 */
|
||||
char *start_title; /* Pointer to the start of the current parameter
|
||||
title */
|
||||
char *end_title; /* Pointer to the end of the current
|
||||
parameter value */
|
||||
char *start_value; /* Pointer to the start of the current parameter
|
||||
value */
|
||||
char *end_value; /* Pointer to the end of the current parameter
|
||||
value */
|
||||
char delim_value; /* Current parameter value's delimiter
|
||||
character, either a single or a double quote */
|
||||
int error_num; /* Error code of the error message to print when
|
||||
an error is detected */
|
||||
|
||||
/**
|
||||
Initialize the parameter string parse information.
|
||||
|
||||
@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();
|
||||
int fail(bool restore_delim);
|
||||
bool locate_param_def(char*& start_param);
|
||||
} SPIDER_PARAM_STRING_PARSE;
|
||||
|
||||
uchar *spider_tbl_get_key(
|
||||
@@ -344,19 +84,12 @@ void spider_free_tmp_share_alloc(
|
||||
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(
|
||||
char ***string_list,
|
||||
uint **string_length_list,
|
||||
uint *list_length,
|
||||
char *str,
|
||||
uint length,
|
||||
SPIDER_PARAM_STRING_PARSE *param_string_parse
|
||||
uint length
|
||||
);
|
||||
|
||||
int spider_create_long_list(
|
||||
@@ -365,8 +98,7 @@ int spider_create_long_list(
|
||||
char *str,
|
||||
uint length,
|
||||
long min_val,
|
||||
long max_val,
|
||||
SPIDER_PARAM_STRING_PARSE *param_string_parse
|
||||
long max_val
|
||||
);
|
||||
|
||||
int spider_create_longlong_list(
|
||||
@@ -375,8 +107,7 @@ int spider_create_longlong_list(
|
||||
char *str,
|
||||
uint length,
|
||||
longlong min_val,
|
||||
longlong max_val,
|
||||
SPIDER_PARAM_STRING_PARSE *param_string_parse
|
||||
longlong max_val
|
||||
);
|
||||
|
||||
int spider_increase_string_list(
|
||||
|
Reference in New Issue
Block a user