summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Mathew <jacob.mathew@mariadb.com>2018-04-13 17:51:51 -0700
committerJacob Mathew <jacob.mathew@mariadb.com>2018-04-24 19:41:04 -0700
commitc10da98b629aa3f107c2c9713d2e1e02c2bc8d6c (patch)
tree604a5bce3b28871d384dfde650b8eb2afa58a930
parenta1a966fc0e084494da0f4ff88d41908e094865b9 (diff)
downloadmariadb-git-bb-10.3-MDEV-15698.tar.gz
MDEV-15698: Spider ignores syntax errors in connection string in COMMENT fieldbb-10.3-MDEV-15698
When a comma separator is missing between COMMENT fields, Spider ignores the parameter values that are beyond the last expected parameter value. There are also some error messages that Spider does generate on COMMENT fields that are incorrectly formed. I have introduced additional infrastructure in Spider to fix these problems. Author: Jacob Mathew. Reviewer: Kentoku Shiba.
-rw-r--r--storage/spider/spd_copy_tables.cc84
-rw-r--r--storage/spider/spd_direct_sql.cc116
-rw-r--r--storage/spider/spd_table.cc245
-rw-r--r--storage/spider/spd_table.h216
4 files changed, 419 insertions, 242 deletions
diff --git a/storage/spider/spd_copy_tables.cc b/storage/spider/spd_copy_tables.cc
index 97ad1c70631..82c0c490147 100644
--- a/storage/spider/spd_copy_tables.cc
+++ b/storage/spider/spd_copy_tables.cc
@@ -87,13 +87,12 @@ int spider_udf_set_copy_tables_param_default(
if (!copy_tables->param_name) \
{ \
if ((copy_tables->param_name = spider_get_string_between_quote( \
- start_ptr, TRUE))) \
+ start_ptr, TRUE, &param_string_parse))) \
copy_tables->SPIDER_PARAM_STR_LEN(param_name) = \
strlen(copy_tables->param_name); \
- else { \
- error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, \
- MYF(0), tmp_ptr); \
+ else \
+ { \
+ error_num = param_string_parse.print_param_error(); \
goto error; \
} \
DBUG_PRINT("info",("spider " title_name "=%s", copy_tables->param_name)); \
@@ -113,9 +112,7 @@ int spider_udf_set_copy_tables_param_default(
{ \
if (hint_num < 0 || hint_num >= max_size) \
{ \
- error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, \
- MYF(0), tmp_ptr); \
+ error_num = param_string_parse.print_param_error(); \
goto error; \
} else if (copy_tables->param_name[hint_num] != -1) \
break; \
@@ -128,17 +125,13 @@ int spider_udf_set_copy_tables_param_default(
else if (copy_tables->param_name[hint_num] > max_val) \
copy_tables->param_name[hint_num] = max_val; \
} else { \
- error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, \
- MYF(0), tmp_ptr); \
+ 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 = ER_SPIDER_INVALID_UDF_PARAM_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, \
- MYF(0), tmp_ptr); \
+ error_num = param_string_parse.print_param_error(); \
goto error; \
} \
break; \
@@ -157,10 +150,11 @@ int spider_udf_set_copy_tables_param_default(
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 = ER_SPIDER_INVALID_UDF_PARAM_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, \
- MYF(0), tmp_ptr); \
+ error_num = param_string_parse.print_param_error(); \
goto error; \
} \
DBUG_PRINT("info",("spider " title_name "=%d", copy_tables->param_name)); \
@@ -179,10 +173,11 @@ int spider_udf_set_copy_tables_param_default(
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 = ER_SPIDER_INVALID_UDF_PARAM_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, \
- MYF(0), tmp_ptr); \
+ error_num = param_string_parse.print_param_error(); \
goto error; \
} \
DBUG_PRINT("info",("spider " title_name "=%d", copy_tables->param_name)); \
@@ -202,10 +197,11 @@ int spider_udf_set_copy_tables_param_default(
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 = ER_SPIDER_INVALID_UDF_PARAM_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR, \
- MYF(0), tmp_ptr); \
+ error_num = param_string_parse.print_param_error(); \
goto error; \
} \
DBUG_PRINT("info",("spider " title_name "=%lld", \
@@ -224,6 +220,7 @@ int spider_udf_parse_copy_tables_param(
char *sprit_ptr[2];
char *tmp_ptr, *tmp_ptr2, *start_ptr;
int title_length;
+ SPIDER_PARAM_STRING_PARSE param_string_parse;
DBUG_ENTER("spider_udf_parse_copy_tables_param");
copy_tables->bulk_insert_interval = -1;
copy_tables->bulk_insert_rows = -1;
@@ -248,6 +245,7 @@ int spider_udf_parse_copy_tables_param(
DBUG_PRINT("info",("spider param_string=%s", param_string));
sprit_ptr[0] = param_string;
+ param_string_parse.init(param_string, ER_SPIDER_INVALID_UDF_PARAM_NUM);
while (sprit_ptr[0])
{
if ((sprit_ptr[1] = strchr(sprit_ptr[0], ',')))
@@ -274,10 +272,14 @@ int spider_udf_parse_copy_tables_param(
title_length++;
start_ptr++;
}
+ param_string_parse.set_param_title(tmp_ptr, tmp_ptr + title_length);
switch (title_length)
{
case 0:
+ error_num = param_string_parse.print_param_error();
+ if (error_num)
+ goto error;
continue;
case 3:
#ifndef WITHOUT_SPIDER_BG_SEARCH
@@ -288,55 +290,43 @@ 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 = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
goto error;
#ifndef WITHOUT_SPIDER_BG_SEARCH
case 7:
SPIDER_PARAM_INT_WITH_MAX("bg_mode", bg_mode, 0, 1);
- error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
goto error;
#endif
case 8:
SPIDER_PARAM_STR("database", database);
- error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
goto error;
case 15:
SPIDER_PARAM_INT_WITH_MAX("use_transaction", use_transaction, 0, 1);
- error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
goto error;
case 16:
SPIDER_PARAM_LONGLONG("bulk_insert_rows", bulk_insert_rows, 1);
- error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
goto error;
case 17:
SPIDER_PARAM_INT_WITH_MAX(
"use_table_charset", use_table_charset, 0, 1);
- error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
goto error;
case 20:
SPIDER_PARAM_INT("bulk_insert_interval", bulk_insert_interval, 0);
- error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
goto error;
default:
- error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
goto error;
}
+
+ /* Verify that the remainder of the parameter value is whitespace */
+ if ((error_num = param_string_parse.has_extra_parameter_values()))
+ goto error;
}
set_default:
diff --git a/storage/spider/spd_direct_sql.cc b/storage/spider/spd_direct_sql.cc
index 4d69d9af615..de355c1068d 100644
--- a/storage/spider/spd_direct_sql.cc
+++ b/storage/spider/spd_direct_sql.cc
@@ -973,13 +973,12 @@ error:
if (!direct_sql->param_name) \
{ \
if ((direct_sql->param_name = spider_get_string_between_quote( \
- start_ptr, TRUE))) \
+ start_ptr, TRUE, &param_string_parse))) \
direct_sql->SPIDER_PARAM_STR_LEN(param_name) = \
strlen(direct_sql->param_name); \
- else { \
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \
- MYF(0), tmp_ptr); \
+ else \
+ { \
+ error_num = param_string_parse.print_param_error(); \
goto error; \
} \
DBUG_PRINT("info",("spider " title_name "=%s", direct_sql->param_name)); \
@@ -999,9 +998,7 @@ error:
{ \
if (hint_num < 0 || hint_num >= max_size) \
{ \
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \
- MYF(0), tmp_ptr); \
+ error_num = param_string_parse.print_param_error(); \
goto error; \
} else if (direct_sql->param_name[hint_num] != -1) \
break; \
@@ -1014,17 +1011,13 @@ error:
else if (direct_sql->param_name[hint_num] > max_val) \
direct_sql->param_name[hint_num] = max_val; \
} else { \
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \
- MYF(0), tmp_ptr); \
+ error_num = param_string_parse.print_param_error(); \
goto error; \
} \
DBUG_PRINT("info",("spider " title_name "[%d]=%d", hint_num, \
direct_sql->param_name[hint_num])); \
} else { \
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \
- MYF(0), tmp_ptr); \
+ error_num = param_string_parse.print_param_error(); \
goto error; \
} \
break; \
@@ -1043,10 +1036,11 @@ error:
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 = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \
- MYF(0), tmp_ptr); \
+ error_num = param_string_parse.print_param_error(); \
goto error; \
} \
DBUG_PRINT("info",("spider " title_name "=%d", \
@@ -1066,10 +1060,11 @@ error:
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 = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \
- MYF(0), tmp_ptr); \
+ error_num = param_string_parse.print_param_error(); \
goto error; \
} \
DBUG_PRINT("info",("spider " title_name "=%d", direct_sql->param_name)); \
@@ -1089,10 +1084,11 @@ error:
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 = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \
- MYF(0), tmp_ptr); \
+ error_num = param_string_parse.print_param_error(); \
goto error; \
} \
DBUG_PRINT("info",("spider " title_name "=%lld", \
@@ -1112,6 +1108,7 @@ int spider_udf_parse_direct_sql_param(
char *sprit_ptr[2];
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_ssl_vsc = -1;
@@ -1148,6 +1145,7 @@ int spider_udf_parse_direct_sql_param(
DBUG_PRINT("info",("spider param_string=%s", param_string));
sprit_ptr[0] = param_string;
+ param_string_parse.init(param_string, ER_SPIDER_INVALID_UDF_PARAM_NUM);
while (sprit_ptr[0])
{
if ((sprit_ptr[1] = strchr(sprit_ptr[0], ',')))
@@ -1174,10 +1172,14 @@ int spider_udf_parse_direct_sql_param(
title_length++;
start_ptr++;
}
+ param_string_parse.set_param_title(tmp_ptr, tmp_ptr + title_length);
switch (title_length)
{
case 0:
+ error_num = param_string_parse.print_param_error();
+ if (error_num)
+ goto error;
continue;
case 3:
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
@@ -1203,120 +1205,92 @@ 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 = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
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 = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
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 = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
goto error;
case 7:
SPIDER_PARAM_STR("wrapper", tgt_wrapper);
SPIDER_PARAM_STR("ssl_key", tgt_ssl_key);
- error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
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 = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
goto error;
case 10:
SPIDER_PARAM_STR("ssl_cipher", tgt_ssl_cipher);
SPIDER_PARAM_STR("ssl_capath", tgt_ssl_capath);
- error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
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 = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
goto error;
case 12:
SPIDER_PARAM_STR("default_file", tgt_default_file);
- error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
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 = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
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 = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
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 = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
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 = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
goto error;
case 17:
SPIDER_PARAM_INT("net_write_timeout", net_write_timeout, 0);
- error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
goto error;
case 18:
SPIDER_PARAM_INT_WITH_MAX(
"connection_channel", connection_channel, 0, 63);
- error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
goto error;
case 22:
SPIDER_PARAM_INT_WITH_MAX("ssl_verify_server_cert", tgt_ssl_vsc, 0, 1);
- error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
goto error;
default:
- error_num = ER_SPIDER_INVALID_UDF_PARAM_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
- MYF(0), tmp_ptr);
+ error_num = param_string_parse.print_param_error();
goto error;
}
+
+ /* Verify that the remainder of the parameter value is whitespace */
+ if ((error_num = param_string_parse.has_extra_parameter_values()))
+ goto error;
}
set_default:
diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc
index 76032ca80f0..80b02bafa64 100644
--- a/storage/spider/spd_table.cc
+++ b/storage/spider/spd_table.cc
@@ -1048,7 +1048,8 @@ void spider_free_tmp_share_alloc(
char *spider_get_string_between_quote(
char *ptr,
- bool alloc
+ bool alloc,
+ SPIDER_PARAM_STRING_PARSE *param_string_parse
) {
char *start_ptr, *end_ptr, *tmp_ptr, *esc_ptr;
bool find_flg = FALSE, esc_flg = FALSE;
@@ -1139,6 +1140,10 @@ char *spider_get_string_between_quote(
strcpy(esc_ptr, esc_ptr + 1);
}
}
+
+ if (param_string_parse)
+ param_string_parse->set_param_value(start_ptr, start_ptr + strlen(start_ptr) + 1);
+
if (alloc)
{
DBUG_RETURN(
@@ -1156,7 +1161,8 @@ int spider_create_string_list(
uint **string_length_list,
uint *list_length,
char *str,
- uint length
+ uint length,
+ SPIDER_PARAM_STRING_PARSE *param_string_parse
) {
int roop_count;
char *tmp_ptr, *tmp_ptr2, *tmp_ptr3, *esc_ptr;
@@ -1164,6 +1170,7 @@ int spider_create_string_list(
DBUG_ENTER("spider_create_string_list");
*list_length = 0;
+ param_string_parse->init_param_value();
if (!str)
{
*string_list = NULL;
@@ -1274,6 +1281,10 @@ int spider_create_string_list(
my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM);
DBUG_RETURN(HA_ERR_OUT_OF_MEM);
}
+
+ param_string_parse->set_param_value(tmp_ptr3,
+ tmp_ptr3 + strlen(tmp_ptr3) + 1);
+
DBUG_PRINT("info",("spider string_list[%d]=%s", roop_count,
(*string_list)[roop_count]));
@@ -1286,13 +1297,15 @@ int spider_create_long_list(
char *str,
uint length,
long min_val,
- long max_val
+ long max_val,
+ SPIDER_PARAM_STRING_PARSE *param_string_parse
) {
int roop_count;
char *tmp_ptr;
DBUG_ENTER("spider_create_long_list");
*list_length = 0;
+ param_string_parse->init_param_value();
if (!str)
{
*long_list = NULL;
@@ -1348,6 +1361,9 @@ int spider_create_long_list(
(*long_list)[roop_count] = max_val;
}
+ param_string_parse->set_param_value(tmp_ptr,
+ tmp_ptr + strlen(tmp_ptr) + 1);
+
#ifndef DBUG_OFF
for (roop_count = 0; roop_count < (int) *list_length; roop_count++)
{
@@ -1365,13 +1381,15 @@ int spider_create_longlong_list(
char *str,
uint length,
longlong min_val,
- longlong max_val
+ longlong max_val,
+ SPIDER_PARAM_STRING_PARSE *param_string_parse
) {
int error_num, roop_count;
char *tmp_ptr;
DBUG_ENTER("spider_create_longlong_list");
*list_length = 0;
+ param_string_parse->init_param_value();
if (!str)
{
*longlong_list = NULL;
@@ -1428,6 +1446,9 @@ int spider_create_longlong_list(
(*longlong_list)[roop_count] = max_val;
}
+ param_string_parse->set_param_value(tmp_ptr,
+ tmp_ptr + strlen(tmp_ptr) + 1);
+
#ifndef DBUG_OFF
for (roop_count = 0; roop_count < (int) *list_length; roop_count++)
{
@@ -1667,6 +1688,38 @@ static int spider_set_ll_value(
DBUG_RETURN(error_num);
}
+/**
+ Print a parameter string error message.
+
+ @return Error code.
+*/
+
+int st_spider_param_string_parse::print_param_error()
+{
+ if (start_title_ptr)
+ {
+ /* Restore the input delimiter characters */
+ restore_delims();
+
+ /* Print the error message */
+ switch (error_num)
+ {
+ case ER_SPIDER_INVALID_UDF_PARAM_NUM:
+ my_printf_error(error_num, ER_SPIDER_INVALID_UDF_PARAM_STR,
+ MYF(0), start_title_ptr);
+ break;
+ case ER_SPIDER_INVALID_CONNECT_INFO_NUM:
+ default:
+ my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
+ MYF(0), start_title_ptr);
+ }
+
+ return error_num;
+ }
+ else
+ return 0;
+}
+
#define SPIDER_PARAM_STR_LEN(name) name ## _length
#define SPIDER_PARAM_STR(title_name, param_name) \
if (!strncasecmp(tmp_ptr, title_name, title_length)) \
@@ -1675,12 +1728,11 @@ static int spider_set_ll_value(
if (!share->param_name) \
{ \
if ((share->param_name = spider_get_string_between_quote( \
- start_ptr, TRUE))) \
+ start_ptr, TRUE, &connect_string_parse))) \
share->SPIDER_PARAM_STR_LEN(param_name) = strlen(share->param_name); \
- else { \
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \
- MYF(0), tmp_ptr); \
+ else \
+ { \
+ error_num = connect_string_parse.print_param_error(); \
goto error; \
} \
DBUG_PRINT("info",("spider " title_name "=%s", share->param_name)); \
@@ -1704,12 +1756,11 @@ static int spider_set_ll_value(
&share->SPIDER_PARAM_STR_LENS(param_name), \
&share->SPIDER_PARAM_STR_LEN(param_name), \
tmp_ptr2, \
- share->SPIDER_PARAM_STR_CHARLEN(param_name)))) \
+ share->SPIDER_PARAM_STR_CHARLEN(param_name), \
+ &connect_string_parse))) \
goto error; \
} else { \
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \
- MYF(0), tmp_ptr); \
+ error_num = connect_string_parse.print_param_error(); \
goto error; \
} \
} \
@@ -1727,9 +1778,7 @@ static int spider_set_ll_value(
{ \
if (hint_num < 0 || hint_num >= max_size) \
{ \
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \
- MYF(0), tmp_ptr); \
+ error_num = connect_string_parse.print_param_error(); \
goto error; \
} else if (share->param_name[hint_num].length() > 0) \
break; \
@@ -1740,9 +1789,7 @@ static int spider_set_ll_value(
DBUG_PRINT("info",("spider " title_name "[%d]=%s", hint_num, \
share->param_name[hint_num].ptr())); \
} else { \
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \
- MYF(0), tmp_ptr); \
+ error_num = connect_string_parse.print_param_error(); \
goto error; \
} \
break; \
@@ -1759,9 +1806,7 @@ static int spider_set_ll_value(
{ \
if (hint_num < 0 || hint_num >= max_size) \
{ \
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \
- MYF(0), tmp_ptr); \
+ error_num = connect_string_parse.print_param_error(); \
goto error; \
} else if (share->param_name[hint_num] != -1) \
break; \
@@ -1772,9 +1817,7 @@ static int spider_set_ll_value(
DBUG_PRINT("info",("spider " title_name "[%d]=%lld", hint_num, \
share->param_name[hint_num])); \
} else { \
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \
- MYF(0), tmp_ptr); \
+ error_num = connect_string_parse.print_param_error(); \
goto error; \
} \
break; \
@@ -1795,12 +1838,11 @@ static int spider_set_ll_value(
&share->SPIDER_PARAM_LONG_LEN(param_name), \
tmp_ptr2, \
strlen(tmp_ptr2), \
- min_val, max_val))) \
+ min_val, max_val, \
+ &connect_string_parse))) \
goto error; \
} else { \
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \
- MYF(0), tmp_ptr); \
+ error_num = connect_string_parse.print_param_error(); \
goto error; \
} \
} \
@@ -1822,12 +1864,11 @@ static int spider_set_ll_value(
&share->SPIDER_PARAM_LONGLONG_LEN(param_name), \
tmp_ptr2, \
strlen(tmp_ptr2), \
- min_val, max_val))) \
+ min_val, max_val, \
+ &connect_string_parse))) \
goto error; \
} else { \
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \
- MYF(0), tmp_ptr); \
+ error_num = connect_string_parse.print_param_error(); \
goto error; \
} \
} \
@@ -1847,10 +1888,11 @@ static int spider_set_ll_value(
share->param_name = min_val; \
else if (share->param_name > max_val) \
share->param_name = max_val; \
+ connect_string_parse.set_param_value(tmp_ptr2, \
+ tmp_ptr2 + \
+ strlen(tmp_ptr2) + 1); \
} else { \
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \
- MYF(0), tmp_ptr); \
+ error_num = connect_string_parse.print_param_error(); \
goto error; \
} \
DBUG_PRINT("info",("spider " title_name "=%d", share->param_name)); \
@@ -1869,10 +1911,11 @@ static int spider_set_ll_value(
share->param_name = atoi(tmp_ptr2); \
if (share->param_name < min_val) \
share->param_name = min_val; \
+ connect_string_parse.set_param_value(tmp_ptr2, \
+ tmp_ptr2 + \
+ strlen(tmp_ptr2) + 1); \
} else { \
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \
- MYF(0), tmp_ptr); \
+ error_num = connect_string_parse.print_param_error(); \
goto error; \
} \
DBUG_PRINT("info",("spider " title_name "=%d", share->param_name)); \
@@ -1891,10 +1934,11 @@ static int spider_set_ll_value(
share->param_name = my_atof(tmp_ptr2); \
if (share->param_name < min_val) \
share->param_name = min_val; \
+ connect_string_parse.set_param_value(tmp_ptr2, \
+ tmp_ptr2 + \
+ strlen(tmp_ptr2) + 1); \
} else { \
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \
- MYF(0), tmp_ptr); \
+ error_num = connect_string_parse.print_param_error(); \
goto error; \
} \
DBUG_PRINT("info",("spider " title_name "=%f", share->param_name)); \
@@ -1913,10 +1957,11 @@ static int spider_set_ll_value(
share->param_name = my_strtoll10(tmp_ptr2, (char**) NULL, &error_num); \
if (share->param_name < min_val) \
share->param_name = min_val; \
+ connect_string_parse.set_param_value(tmp_ptr2, \
+ tmp_ptr2 + \
+ strlen(tmp_ptr2) + 1); \
} else { \
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; \
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, \
- MYF(0), tmp_ptr); \
+ error_num = connect_string_parse.print_param_error(); \
goto error; \
} \
DBUG_PRINT("info",("spider " title_name "=%lld", share->param_name)); \
@@ -1938,6 +1983,7 @@ int spider_parse_connect_info(
char *tmp_ptr, *tmp_ptr2, *start_ptr;
int roop_count;
int title_length;
+ SPIDER_PARAM_STRING_PARSE connect_string_parse;
SPIDER_ALTER_TABLE *share_alter;
#ifdef WITH_PARTITION_STORAGE_ENGINE
partition_element *part_elem;
@@ -2126,6 +2172,7 @@ int spider_parse_connect_info(
}
sprit_ptr[0] = connect_string;
+ connect_string_parse.init(connect_string, ER_SPIDER_INVALID_CONNECT_INFO_NUM);
while (sprit_ptr[0])
{
if ((sprit_ptr[1] = strchr(sprit_ptr[0], ',')))
@@ -2152,10 +2199,14 @@ int spider_parse_connect_info(
title_length++;
start_ptr++;
}
+ connect_string_parse.set_param_title(tmp_ptr, tmp_ptr + title_length);
switch (title_length)
{
case 0:
+ error_num = connect_string_parse.print_param_error();
+ if (error_num)
+ goto error;
continue;
case 3:
SPIDER_PARAM_LONG_LIST_WITH_MAX("abl", access_balances, 0,
@@ -2296,23 +2347,17 @@ int spider_parse_connect_info(
#endif
SPIDER_PARAM_INT_WITH_MAX("upu", use_pushdown_udf, 0, 1);
SPIDER_PARAM_INT_WITH_MAX("utc", use_table_charset, 0, 1);
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
case 4:
SPIDER_PARAM_STR_LIST("host", tgt_hosts);
SPIDER_PARAM_STR_LIST("user", tgt_usernames);
SPIDER_PARAM_LONG_LIST_WITH_MAX("port", tgt_ports, 0, 65535);
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
case 5:
SPIDER_PARAM_STR_LIST("table", tgt_table_names);
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
case 6:
SPIDER_PARAM_STR_LIST("server", server_names);
@@ -2322,17 +2367,13 @@ int spider_parse_connect_info(
SPIDER_PARAM_STR_LIST("ssl_ca", tgt_ssl_cas);
SPIDER_PARAM_NUMHINT("skc", static_key_cardinality, 3,
(int) table_share->keys, spider_set_ll_value);
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
case 7:
SPIDER_PARAM_STR_LIST("wrapper", tgt_wrappers);
SPIDER_PARAM_STR_LIST("ssl_key", tgt_ssl_keys);
SPIDER_PARAM_STR_LIST("pk_name", tgt_pk_names);
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
case 8:
SPIDER_PARAM_STR_LIST("database", tgt_dbs);
@@ -2352,18 +2393,14 @@ int spider_parse_connect_info(
#endif
SPIDER_PARAM_STR_LIST("ssl_cert", tgt_ssl_certs);
SPIDER_PARAM_INT_WITH_MAX("bka_mode", bka_mode, 0, 2);
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
case 9:
SPIDER_PARAM_INT("max_order", max_order, 0);
SPIDER_PARAM_INT("bulk_size", bulk_size, 0);
SPIDER_PARAM_DOUBLE("scan_rate", scan_rate, 0);
SPIDER_PARAM_DOUBLE("read_rate", read_rate, 0);
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
case 10:
SPIDER_PARAM_DOUBLE("crd_weight", crd_weight, 1);
@@ -2373,9 +2410,7 @@ int spider_parse_connect_info(
SPIDER_PARAM_STR_LIST("ssl_capath", tgt_ssl_capaths);
SPIDER_PARAM_STR("bka_engine", bka_engine);
SPIDER_PARAM_LONGLONG("first_read", first_read, 0);
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
case 11:
SPIDER_PARAM_INT_WITH_MAX("query_cache", query_cache, 0, 2);
@@ -2389,9 +2424,7 @@ int spider_parse_connect_info(
SPIDER_PARAM_LONG_LIST_WITH_MAX("use_hs_read", use_hs_reads, 0, 1);
#endif
SPIDER_PARAM_INT_WITH_MAX("casual_read", casual_read, 0, 63);
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
case 12:
SPIDER_PARAM_DOUBLE("sts_interval", sts_interval, 0);
@@ -2404,9 +2437,7 @@ int spider_parse_connect_info(
SPIDER_PARAM_LONG_LIST_WITH_MAX(
"hs_read_port", hs_read_ports, 0, 65535);
#endif
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
case 13:
SPIDER_PARAM_STR_LIST("default_group", tgt_default_groups);
@@ -2415,9 +2446,7 @@ int spider_parse_connect_info(
"hs_write_port", hs_write_ports, 0, 65535);
#endif
SPIDER_PARAM_STR_LIST("sequence_name", tgt_sequence_names);
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
case 14:
SPIDER_PARAM_LONGLONG("internal_limit", internal_limit, 0);
@@ -2434,9 +2463,7 @@ int spider_parse_connect_info(
SPIDER_PARAM_STR_LIST("static_link_id", static_link_ids);
SPIDER_PARAM_INT_WITH_MAX("store_last_crd", store_last_crd, 0, 1);
SPIDER_PARAM_INT_WITH_MAX("store_last_sts", store_last_sts, 0, 1);
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
case 15:
SPIDER_PARAM_LONGLONG("internal_offset", internal_offset, 0);
@@ -2456,9 +2483,7 @@ int spider_parse_connect_info(
SPIDER_PARAM_LONG_LIST_WITH_MAX("connect_timeout", connect_timeouts,
0, 2147483647);
SPIDER_PARAM_INT_WITH_MAX("error_read_mode", error_read_mode, 0, 1);
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
case 16:
SPIDER_PARAM_INT_WITH_MAX(
@@ -2490,9 +2515,7 @@ int spider_parse_connect_info(
#endif
SPIDER_PARAM_INT_WITH_MAX(
"query_cache_sync", query_cache_sync, 0, 3);
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
case 17:
SPIDER_PARAM_INT_WITH_MAX(
@@ -2512,9 +2535,7 @@ int spider_parse_connect_info(
SPIDER_PARAM_INT_WITH_MAX(
"force_bulk_update", force_bulk_update, 0, 1);
#endif
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
case 18:
SPIDER_PARAM_INT_WITH_MAX(
@@ -2527,9 +2548,7 @@ int spider_parse_connect_info(
#endif
SPIDER_PARAM_LONGLONG(
"direct_order_limit", direct_order_limit, 0);
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
case 19:
SPIDER_PARAM_INT("init_sql_alloc_size", init_sql_alloc_size, 0);
@@ -2544,9 +2563,7 @@ int spider_parse_connect_info(
"load_crd_at_startup", load_crd_at_startup, 0, 1);
SPIDER_PARAM_INT_WITH_MAX(
"load_sts_at_startup", load_sts_at_startup, 0, 1);
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
case 20:
SPIDER_PARAM_LONGLONG_LIST_WITH_MAX(
@@ -2555,16 +2572,12 @@ int spider_parse_connect_info(
"delete_all_rows_type", delete_all_rows_type, 0, 1);
SPIDER_PARAM_INT_WITH_MAX(
"skip_parallel_search", skip_parallel_search, 0, 3);
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
case 21:
SPIDER_PARAM_LONGLONG(
"semi_split_read_limit", semi_split_read_limit, 0);
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
case 22:
SPIDER_PARAM_LONG_LIST_WITH_MAX(
@@ -2577,46 +2590,38 @@ int spider_parse_connect_info(
"skip_default_condition", skip_default_condition, 0, 1);
SPIDER_PARAM_LONGLONG(
"static_mean_rec_length", static_mean_rec_length, 0);
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
case 23:
SPIDER_PARAM_INT_WITH_MAX(
"internal_optimize_local", internal_optimize_local, 0, 1);
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
case 25:
SPIDER_PARAM_LONGLONG("static_records_for_status",
static_records_for_status, 0);
SPIDER_PARAM_NUMHINT("static_key_cardinality", static_key_cardinality,
3, (int) table_share->keys, spider_set_ll_value);
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
case 26:
SPIDER_PARAM_INT_WITH_MAX(
"semi_table_lock_connection", semi_table_lock_conn, 0, 1);
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
case 32:
SPIDER_PARAM_LONG_LIST_WITH_MAX("monitoring_binlog_pos_at_failing",
monitoring_binlog_pos_at_failing, 0, 2);
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
default:
- error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM;
- my_printf_error(error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR,
- MYF(0), tmp_ptr);
+ error_num = connect_string_parse.print_param_error();
goto error;
}
+
+ /* Verify that the remainder of the parameter value is whitespace */
+ if ((error_num = connect_string_parse.has_extra_parameter_values()))
+ goto error;
}
}
diff --git a/storage/spider/spd_table.h b/storage/spider/spd_table.h
index 7165c4504f8..43958ca6e78 100644
--- a/storage/spider/spd_table.h
+++ b/storage/spider/spd_table.h
@@ -13,6 +13,210 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+/*
+ Structure used to manage Spider parameter string parsing. Types of
+ parameters include:
+ - connection strings
+ - UDF parameters
+
+ A parameter string consists of one or more parameter definitions using
+ the following syntax:
+ <parameter title> <parameter value>
+ A comma is the separator character between multiple parameter definitions.
+ Parameter titles must not be quoted. Parameter values must be quoted with
+ single or double quotes.
+*/
+
+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 */
+
+ /**
+ 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);
+ }
+
+ /**
+ 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;
+
uchar *spider_tbl_get_key(
SPIDER_SHARE *share,
size_t *length,
@@ -60,7 +264,8 @@ void spider_free_tmp_share_alloc(
char *spider_get_string_between_quote(
char *ptr,
- bool alloc
+ bool alloc,
+ SPIDER_PARAM_STRING_PARSE *param_string_parse = NULL
);
int spider_create_string_list(
@@ -68,7 +273,8 @@ int spider_create_string_list(
uint **string_length_list,
uint *list_length,
char *str,
- uint length
+ uint length,
+ SPIDER_PARAM_STRING_PARSE *param_string_parse
);
int spider_create_long_list(
@@ -77,7 +283,8 @@ int spider_create_long_list(
char *str,
uint length,
long min_val,
- long max_val
+ long max_val,
+ SPIDER_PARAM_STRING_PARSE *param_string_parse
);
int spider_create_longlong_list(
@@ -86,7 +293,8 @@ int spider_create_longlong_list(
char *str,
uint length,
longlong min_val,
- longlong max_val
+ longlong max_val,
+ SPIDER_PARAM_STRING_PARSE *param_string_parse
);
int spider_increase_string_list(