mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Merge 192.168.0.7:mysql/mysql-5.0-maint
into pilot.(none):/data/msvensson/mysql/mysql-5.0-maint client/mysqltest.c: Auto merged mysql-test/mysql-test-run.pl: Auto merged mysql-test/r/mysqltest.result: Auto merged mysql-test/r/sp.result: Auto merged mysql-test/t/mysqltest.test: Auto merged mysql-test/t/sp.test: Auto merged
This commit is contained in:
@ -235,7 +235,7 @@ struct st_connection
|
|||||||
#endif /*EMBEDDED_LIBRARY*/
|
#endif /*EMBEDDED_LIBRARY*/
|
||||||
};
|
};
|
||||||
struct st_connection connections[128];
|
struct st_connection connections[128];
|
||||||
struct st_connection* cur_con, *next_con, *connections_end;
|
struct st_connection* cur_con= NULL, *next_con, *connections_end;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
List of commands in mysqltest
|
List of commands in mysqltest
|
||||||
@ -499,11 +499,11 @@ void handle_no_error(struct st_command*);
|
|||||||
pthread_attr_t cn_thd_attrib;
|
pthread_attr_t cn_thd_attrib;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
send_one_query executes query in separate thread what is
|
send_one_query executes query in separate thread, which is
|
||||||
necessary in embedded library to run 'send' in proper way.
|
necessary in embedded library to run 'send' in proper way.
|
||||||
This implementation doesn't handle errors returned
|
This implementation doesn't handle errors returned
|
||||||
by mysql_send_query. It's technically possible, though
|
by mysql_send_query. It's technically possible, though
|
||||||
i don't see where it is needed.
|
I don't see where it is needed.
|
||||||
*/
|
*/
|
||||||
pthread_handler_t send_one_query(void *arg)
|
pthread_handler_t send_one_query(void *arg)
|
||||||
{
|
{
|
||||||
@ -604,6 +604,77 @@ void do_eval(DYNAMIC_STRING *query_eval, const char *query,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Show any warnings just before the error. Since the last error
|
||||||
|
is added to the warning stack, only print @@warning_count-1 warnings.
|
||||||
|
|
||||||
|
NOTE! This function should be safe to call when an error
|
||||||
|
has occured and this any further errors will be ignored(although logged)
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
show_warnings_before_error
|
||||||
|
mysql - connection to use
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void show_warnings_before_error(MYSQL* mysql)
|
||||||
|
{
|
||||||
|
MYSQL_RES* res;
|
||||||
|
const char* query= "SHOW WARNINGS";
|
||||||
|
DBUG_ENTER("show_warnings_before_error");
|
||||||
|
|
||||||
|
if (!mysql)
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
|
|
||||||
|
if (mysql_query(mysql, query))
|
||||||
|
{
|
||||||
|
log_msg("Error running query '%s': %d %s",
|
||||||
|
query, mysql_errno(mysql), mysql_error(mysql));
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((res= mysql_store_result(mysql)) == NULL)
|
||||||
|
{
|
||||||
|
/* No result set returned */
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mysql_num_rows(res) <= 1)
|
||||||
|
{
|
||||||
|
/* Don't display the last row, it's "last error" */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MYSQL_ROW row;
|
||||||
|
unsigned int row_num= 0;
|
||||||
|
unsigned int num_fields= mysql_num_fields(res);
|
||||||
|
|
||||||
|
fprintf(stderr, "\nWarnings from just before the error:\n");
|
||||||
|
while ((row= mysql_fetch_row(res)))
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
unsigned long *lengths= mysql_fetch_lengths(res);
|
||||||
|
|
||||||
|
if (++row_num >= mysql_num_rows(res))
|
||||||
|
{
|
||||||
|
/* Don't display the last row, it's "last error" */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i= 0; i < num_fields; i++)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%.*s ", lengths[i],
|
||||||
|
row[i] ? row[i] : "NULL");
|
||||||
|
}
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mysql_free_result(res);
|
||||||
|
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
enum arg_type
|
enum arg_type
|
||||||
{
|
{
|
||||||
ARG_STRING,
|
ARG_STRING,
|
||||||
@ -903,6 +974,13 @@ void die(const char *fmt, ...)
|
|||||||
if (result_file_name && ds_warning_messages.length)
|
if (result_file_name && ds_warning_messages.length)
|
||||||
dump_warning_messages();
|
dump_warning_messages();
|
||||||
|
|
||||||
|
/*
|
||||||
|
Help debugging by displaying any warnings that might have
|
||||||
|
been produced prior to the error
|
||||||
|
*/
|
||||||
|
if (cur_con)
|
||||||
|
show_warnings_before_error(&cur_con->mysql);
|
||||||
|
|
||||||
cleanup_and_exit(1);
|
cleanup_and_exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1006,11 +1084,10 @@ void warning_msg(const char *fmt, ...)
|
|||||||
void log_msg(const char *fmt, ...)
|
void log_msg(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
char buff[512];
|
char buff[1024];
|
||||||
size_t len;
|
size_t len;
|
||||||
DBUG_ENTER("log_msg");
|
DBUG_ENTER("log_msg");
|
||||||
|
|
||||||
memset(buff, 0, sizeof(buff));
|
|
||||||
va_start(args, fmt);
|
va_start(args, fmt);
|
||||||
len= my_vsnprintf(buff, sizeof(buff)-1, fmt, args);
|
len= my_vsnprintf(buff, sizeof(buff)-1, fmt, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
@ -1777,40 +1854,22 @@ void var_query_set(VAR *var, const char *query, const char** query_end)
|
|||||||
die("Query '%s' didn't return a result set", ds_query.str);
|
die("Query '%s' didn't return a result set", ds_query.str);
|
||||||
dynstr_free(&ds_query);
|
dynstr_free(&ds_query);
|
||||||
|
|
||||||
if ((row = mysql_fetch_row(res)) && row[0])
|
if ((row= mysql_fetch_row(res)) && row[0])
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
Concatenate all row results with tab in between to allow us to work
|
Concatenate all fields in the first row with tab in between
|
||||||
with results from many columns (for example from SHOW VARIABLES)
|
and assign that string to the $variable
|
||||||
*/
|
*/
|
||||||
DYNAMIC_STRING result;
|
DYNAMIC_STRING result;
|
||||||
uint i;
|
uint i;
|
||||||
ulong *lengths;
|
ulong *lengths;
|
||||||
#ifdef NOT_YET
|
|
||||||
MYSQL_FIELD *fields= mysql_fetch_fields(res);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
init_dynamic_string(&result, "", 2048, 2048);
|
init_dynamic_string(&result, "", 512, 512);
|
||||||
lengths= mysql_fetch_lengths(res);
|
lengths= mysql_fetch_lengths(res);
|
||||||
for (i=0; i < mysql_num_fields(res); i++)
|
for (i= 0; i < mysql_num_fields(res); i++)
|
||||||
{
|
{
|
||||||
if (row[0])
|
if (row[i])
|
||||||
{
|
{
|
||||||
#ifdef NOT_YET
|
|
||||||
/* Add to <var_name>_<col_name> */
|
|
||||||
uint j;
|
|
||||||
char var_col_name[MAX_VAR_NAME_LENGTH];
|
|
||||||
uint length= snprintf(var_col_name, MAX_VAR_NAME_LENGTH,
|
|
||||||
"$%s_%s", var->name, fields[i].name);
|
|
||||||
/* Convert characters not allowed in variable names to '_' */
|
|
||||||
for (j= 1; j < length; j++)
|
|
||||||
{
|
|
||||||
if (!my_isvar(charset_info,var_col_name[j]))
|
|
||||||
var_col_name[j]= '_';
|
|
||||||
}
|
|
||||||
var_set(var_col_name, var_col_name + length,
|
|
||||||
row[i], row[i] + lengths[i]);
|
|
||||||
#endif
|
|
||||||
/* Add column to tab separated string */
|
/* Add column to tab separated string */
|
||||||
dynstr_append_mem(&result, row[i], lengths[i]);
|
dynstr_append_mem(&result, row[i], lengths[i]);
|
||||||
}
|
}
|
||||||
@ -2287,7 +2346,7 @@ void do_exec(struct st_command *command)
|
|||||||
|
|
||||||
if (command->abort_on_error)
|
if (command->abort_on_error)
|
||||||
{
|
{
|
||||||
log_msg("exec of '%s failed, error: %d, status: %d, errno: %d",
|
log_msg("exec of '%s' failed, error: %d, status: %d, errno: %d",
|
||||||
ds_cmd.str, error, status, errno);
|
ds_cmd.str, error, status, errno);
|
||||||
die("command \"%s\" failed", command->first_argument);
|
die("command \"%s\" failed", command->first_argument);
|
||||||
}
|
}
|
||||||
@ -4068,7 +4127,7 @@ void do_connect(struct st_command *command)
|
|||||||
mysql_options(&con_slot->mysql, MYSQL_SET_CHARSET_NAME,
|
mysql_options(&con_slot->mysql, MYSQL_SET_CHARSET_NAME,
|
||||||
charset_info->csname);
|
charset_info->csname);
|
||||||
if (opt_charsets_dir)
|
if (opt_charsets_dir)
|
||||||
mysql_options(&cur_con->mysql, MYSQL_SET_CHARSET_DIR,
|
mysql_options(&con_slot->mysql, MYSQL_SET_CHARSET_DIR,
|
||||||
opt_charsets_dir);
|
opt_charsets_dir);
|
||||||
|
|
||||||
#ifdef HAVE_OPENSSL
|
#ifdef HAVE_OPENSSL
|
||||||
@ -6495,7 +6554,6 @@ int main(int argc, char **argv)
|
|||||||
connections_end= connections +
|
connections_end= connections +
|
||||||
(sizeof(connections)/sizeof(struct st_connection)) - 1;
|
(sizeof(connections)/sizeof(struct st_connection)) - 1;
|
||||||
next_con= connections + 1;
|
next_con= connections + 1;
|
||||||
cur_con= connections;
|
|
||||||
|
|
||||||
#ifdef EMBEDDED_LIBRARY
|
#ifdef EMBEDDED_LIBRARY
|
||||||
/* set appropriate stack for the 'query' threads */
|
/* set appropriate stack for the 'query' threads */
|
||||||
@ -6571,6 +6629,7 @@ int main(int argc, char **argv)
|
|||||||
if (cursor_protocol_enabled)
|
if (cursor_protocol_enabled)
|
||||||
ps_protocol_enabled= 1;
|
ps_protocol_enabled= 1;
|
||||||
|
|
||||||
|
cur_con= connections;
|
||||||
if (!( mysql_init(&cur_con->mysql)))
|
if (!( mysql_init(&cur_con->mysql)))
|
||||||
die("Failed in mysql_init()");
|
die("Failed in mysql_init()");
|
||||||
if (opt_compress)
|
if (opt_compress)
|
||||||
|
@ -280,6 +280,18 @@ let $B = changed value of B;
|
|||||||
var2: content of variable 1
|
var2: content of variable 1
|
||||||
var3: content of variable 1 content of variable 1
|
var3: content of variable 1 content of variable 1
|
||||||
length of var3 is longer than 0
|
length of var3 is longer than 0
|
||||||
|
var1
|
||||||
|
hi 1 hi there
|
||||||
|
var2
|
||||||
|
2
|
||||||
|
var2 again
|
||||||
|
2
|
||||||
|
var3 two columns with same name
|
||||||
|
1 2 3
|
||||||
|
var4 from query that returns NULL
|
||||||
|
var5 from query that returns no row
|
||||||
|
failing query in let
|
||||||
|
mysqltest: At line 1: Error running query 'failing query': 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'failing query' at line 1
|
||||||
mysqltest: At line 1: Missing required argument 'filename' to command 'source'
|
mysqltest: At line 1: Missing required argument 'filename' to command 'source'
|
||||||
mysqltest: At line 1: Could not open file ./non_existingFile
|
mysqltest: At line 1: Could not open file ./non_existingFile
|
||||||
mysqltest: In included file "MYSQLTEST_VARDIR/tmp/recursive.sql": At line 1: Source directives are nesting too deep
|
mysqltest: In included file "MYSQLTEST_VARDIR/tmp/recursive.sql": At line 1: Source directives are nesting too deep
|
||||||
|
@ -741,38 +741,40 @@ if (`select length("$var3") > 0`)
|
|||||||
# Test to assign let from query
|
# Test to assign let from query
|
||||||
# let $<var_name>=`<query>`;
|
# let $<var_name>=`<query>`;
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
--disable_parsing
|
|
||||||
echo var1;
|
echo var1;
|
||||||
let $var1= `select "hi" as "Col", 1 as "Column1", "hi there" as Col3`;
|
let $var1= `select "hi" as "Col", 1 as "Column1", "hi there" as Col3`;
|
||||||
echo $var1;
|
echo $var1;
|
||||||
echo $var1_Col;
|
|
||||||
echo $var1_Column1;
|
|
||||||
echo $var1_Col3;
|
|
||||||
|
|
||||||
echo var2;
|
echo var2;
|
||||||
let $var2= `select 2 as "Column num 2"`;
|
let $var2= `select 2 as "Column num 2"`;
|
||||||
echo $var2;
|
echo $var2;
|
||||||
echo $var2_Column num 2;
|
|
||||||
echo $var2_Column;
|
|
||||||
|
|
||||||
echo var2 again;
|
echo var2 again;
|
||||||
let $var2= `select 2 as "Column num 2"`;
|
let $var2= `select 2 as "Column num 2"`;
|
||||||
echo $var2;
|
echo $var2;
|
||||||
echo $var2_Column num 2;
|
|
||||||
echo $var2_Column_num_2;
|
|
||||||
echo $var2_Column;
|
|
||||||
|
|
||||||
echo var3 two columns with same name;
|
echo var3 two columns with same name;
|
||||||
let $var3= `select 1 as "Col", 2 as "Col", 3 as "var3"`;
|
let $var3= `select 1 as "Col", 2 as "Col", 3 as "var3"`;
|
||||||
echo $var3;
|
echo $var3;
|
||||||
echo $var3_Col;
|
|
||||||
echo $var3_Col;
|
|
||||||
echo $var3_var3;
|
|
||||||
|
|
||||||
#echo failing query in let;
|
echo var4 from query that returns NULL;
|
||||||
#--error 1
|
let $var4= `select NULL`;
|
||||||
#--exec echo "let $var2= `failing query;`" | $MYSQL_TEST 2>&1
|
|
||||||
--enable_parsing
|
echo var5 from query that returns no row;
|
||||||
|
let $var5= `SHOW VARIABLES LIKE "nonexisting_variable"`;
|
||||||
|
|
||||||
|
echo failing query in let;
|
||||||
|
--write_file $MYSQLTEST_VARDIR/tmp/let.sql
|
||||||
|
let $var2= `failing query`;
|
||||||
|
echo $var2;
|
||||||
|
EOF
|
||||||
|
|
||||||
|
--error 1
|
||||||
|
--exec $MYSQL_TEST < $MYSQLTEST_VARDIR/tmp/let.sql 2>&1
|
||||||
|
|
||||||
|
remove_file $MYSQLTEST_VARDIR/tmp/let.sql;
|
||||||
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
# Test source command
|
# Test source command
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user