1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

Merge 10.5 into 10.6

This commit is contained in:
Marko Mäkelä
2021-05-12 07:47:51 +03:00
2 changed files with 35 additions and 18 deletions

View File

@ -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)
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)
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 @@ end:
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 @@ end:
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:

View File

@ -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()
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()
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);