Commit 370b310b authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.5 into 10.6

parents b6cfb296 4d53a758
...@@ -396,7 +396,9 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create) ...@@ -396,7 +396,9 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create)
bool result= TRUE; bool result= TRUE;
String stmt_query; String stmt_query;
bool lock_upgrade_done= FALSE; bool lock_upgrade_done= FALSE;
bool backup_of_table_list_done= 0;;
MDL_ticket *mdl_ticket= NULL; MDL_ticket *mdl_ticket= NULL;
MDL_request mdl_request_for_trn;
Query_tables_list backup; Query_tables_list backup;
DBUG_ENTER("mysql_create_or_drop_trigger"); DBUG_ENTER("mysql_create_or_drop_trigger");
...@@ -446,6 +448,16 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create) ...@@ -446,6 +448,16 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create)
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
/* Protect against concurrent create/drop */
MDL_REQUEST_INIT(&mdl_request_for_trn, MDL_key::TABLE,
create ? tables->db.str : thd->lex->spname->m_db.str,
thd->lex->spname->m_name.str,
MDL_EXCLUSIVE, MDL_EXPLICIT);
if (thd->mdl_context.acquire_lock(&mdl_request_for_trn,
thd->variables.lock_wait_timeout))
goto end;
if (!create) if (!create)
{ {
bool if_exists= thd->lex->if_exists(); bool if_exists= thd->lex->if_exists();
...@@ -454,6 +466,7 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create) ...@@ -454,6 +466,7 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create)
Protect the query table list from the temporary and potentially Protect the query table list from the temporary and potentially
destructive changes necessary to open the trigger's table. destructive changes necessary to open the trigger's table.
*/ */
backup_of_table_list_done= 1;
thd->lex->reset_n_backup_query_tables_list(&backup); thd->lex->reset_n_backup_query_tables_list(&backup);
/* /*
Restore Query_tables_list::sql_command, which was Restore Query_tables_list::sql_command, which was
...@@ -623,7 +636,7 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create) ...@@ -623,7 +636,7 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create)
mdl_ticket->downgrade_lock(MDL_SHARED_NO_READ_WRITE); mdl_ticket->downgrade_lock(MDL_SHARED_NO_READ_WRITE);
/* Restore the query table list. Used only for drop trigger. */ /* Restore the query table list. Used only for drop trigger. */
if (!create) if (backup_of_table_list_done)
thd->lex->restore_backup_query_tables_list(&backup); thd->lex->restore_backup_query_tables_list(&backup);
if (!result) if (!result)
...@@ -635,6 +648,9 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create) ...@@ -635,6 +648,9 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create)
thd->lex->spname->m_name.str, static_cast<uint>(thd->lex->spname->m_name.length)); thd->lex->spname->m_name.str, static_cast<uint>(thd->lex->spname->m_name.length));
} }
if (mdl_request_for_trn.ticket)
thd->mdl_context.release_lock(mdl_request_for_trn.ticket);
DBUG_RETURN(result); DBUG_RETURN(result);
#ifdef WITH_WSREP #ifdef WITH_WSREP
wsrep_error_label: wsrep_error_label:
......
...@@ -2619,7 +2619,8 @@ void test_d2f(const char *s, int ex) ...@@ -2619,7 +2619,8 @@ void test_d2f(const char *s, int ex)
void test_d2b2d(const char *str, int p, int s, const char *orig, int ex) void test_d2b2d(const char *str, int p, int s, const char *orig, int ex)
{ {
char s1[100], buf[100], *end; char s1[100], *end;
uchar buf[100];
int res, i, size=decimal_bin_size(p, s); int res, i, size=decimal_bin_size(p, s);
sprintf(s1, "'%s'", str); sprintf(s1, "'%s'", str);
...@@ -2937,27 +2938,27 @@ int main() ...@@ -2937,27 +2938,27 @@ int main()
test_f2d(1234500009876.5, 0); test_f2d(1234500009876.5, 0);
printf("==== ulonglong2decimal ====\n"); printf("==== ulonglong2decimal ====\n");
test_ull2d(ULL(12345), "12345", 0); test_ull2d(12345ULL, "12345", 0);
test_ull2d(ULL(0), "0", 0); test_ull2d(0ULL, "0", 0);
test_ull2d(ULL(18446744073709551615), "18446744073709551615", 0); test_ull2d(18446744073709551615ULL, "18446744073709551615", 0);
printf("==== decimal2ulonglong ====\n"); printf("==== decimal2ulonglong ====\n");
test_d2ull("12345", "12345", 0); test_d2ull("12345", "12345", 0);
test_d2ull("0", "0", 0); test_d2ull("0", "0", 0);
test_d2ull("18446744073709551615", "18446744073709551615", 0); test_d2ull("18446744073709551615", "18446744073709551615", 0);
test_d2ull("18446744073709551616", "18446744073", 2); test_d2ull("18446744073709551616", "18446744073709551615", 2);
test_d2ull("-1", "0", 2); test_d2ull("-1", "0", 2);
test_d2ull("1.23", "1", 1); test_d2ull("1.23", "1", 1);
test_d2ull("9999999999999999999999999.000", "9999999999999999", 2); test_d2ull("9999999999999999999999999.000", "18446744073709551615", 2);
printf("==== longlong2decimal ====\n"); printf("==== longlong2decimal ====\n");
test_ll2d(LL(-12345), "-12345", 0); test_ll2d(-12345LL, "-12345", 0);
test_ll2d(LL(-1), "-1", 0); test_ll2d(-1LL, "-1", 0);
test_ll2d(LL(-9223372036854775807), "-9223372036854775807", 0); test_ll2d(-9223372036854775807LL, "-9223372036854775807", 0);
test_ll2d(ULL(9223372036854775808), "-9223372036854775808", 0); test_ll2d(9223372036854775808ULL, "-9223372036854775808", 0);
printf("==== decimal2longlong ====\n"); printf("==== decimal2longlong ====\n");
test_d2ll("18446744073709551615", "18446744073", 2); test_d2ll("18446744073709551615", "9223372036854775807", 2);
test_d2ll("-1", "-1", 0); test_d2ll("-1", "-1", 0);
test_d2ll("-1.23", "-1", 1); test_d2ll("-1.23", "-1", 1);
test_d2ll("-9223372036854775807", "-9223372036854775807", 0); test_d2ll("-9223372036854775807", "-9223372036854775807", 0);
...@@ -3131,12 +3132,12 @@ int main() ...@@ -3131,12 +3132,12 @@ int main()
printf("==== decimal2string ====\n"); printf("==== decimal2string ====\n");
test_pr("123.123", 0, 0, 0, "123.123", 0); test_pr("123.123", 0, 0, 0, "123.123", 0);
test_pr("123.123", 7, 3, '0', "123.123", 0); test_pr("123.123", 7, 3, '0', "0123.123", 0);
test_pr("123.123", 9, 3, '0', "00123.123", 0); test_pr("123.123", 9, 3, '0', "000123.123", 0);
test_pr("123.123", 9, 4, '0', "0123.1230", 0); test_pr("123.123", 9, 4, '0', "00123.1230", 0);
test_pr("123.123", 9, 5, '0', "123.12300", 0); test_pr("123.123", 9, 5, '0', "0123.12300", 0);
test_pr("123.123", 9, 2, '0', "000123.12", 1); test_pr("123.123", 9, 2, '0', "0000123.12", 1);
test_pr("123.123", 9, 6, '0', "23.123000", 2); test_pr("123.123", 8, 6, '0', "23.123000", 2);
printf("==== decimal_shift ====\n"); printf("==== decimal_shift ====\n");
test_sh("123.123", 1, "1231.23", 0); test_sh("123.123", 1, "1231.23", 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment