17 #include "my_config.h"
18 #include <gtest/gtest.h>
20 #include "test_utils.h"
23 #include "sql_get_diagnostics.h"
25 namespace get_diagnostics_unittest {
33 virtual void SetUp() { initializer.SetUp(); }
34 virtual void TearDown() { initializer.TearDown(); }
36 THD *thd() {
return initializer.thd(); }
52 LEX_STRING var_name1= {C_STRING_WITH_LEN(
"var1")};
53 LEX_STRING var_name2= {C_STRING_WITH_LEN(
"var2")};
65 return new (thd->mem_root)
Item_int(m_value);
88 while ((diag_info_item= it++))
90 if ((rv=
evaluate(thd, diag_info_item, da)))
99 fail(
"MockDiagInfo destructor invoked.");
115 MEM_ROOT *mem_root= thd()->mem_root;
120 EXPECT_FALSE(items.push_back(diag_info_item));
125 EXPECT_FALSE(items.push_back(diag_info_item));
132 EXPECT_FALSE(cmd->
execute(thd()));
133 EXPECT_TRUE(thd()->get_stmt_da()->
is_ok());
137 EXPECT_FALSE(var->fix_fields(thd(), &var));
138 EXPECT_EQ(1, var->val_int());
142 EXPECT_FALSE(var->fix_fields(thd(), &var));
143 EXPECT_EQ(2, var->val_int());
149 typedef GetDiagnosticsTest GetDiagnosticsTestDeathTest;
151 #if GTEST_HAS_DEATH_TEST && !defined(DBUG_OFF)
152 TEST_F(GetDiagnosticsTestDeathTest, DieWhenUnsettableItem)
157 MockDiagInfoItem *diag_info_item;
159 MEM_ROOT *mem_root= thd()->mem_root;
161 ::testing::FLAGS_gtest_death_test_style=
"threadsafe";
165 diag_info_item=
new (mem_root) MockDiagInfoItem(var, 1);
166 EXPECT_FALSE(items.push_back(diag_info_item));
169 info=
new (mem_root) MockDiagInfo(&items);
173 EXPECT_DEATH(cmd->
execute(thd()),
".*Assertion.*srp.*");
175 #endif // GTEST_HAS_DEATH_TEST && !defined(DBUG_OFF)
182 : m_fatal_error(fatal_error)
188 myf flag= m_fatal_error ? MYF(ME_FATALERROR) : MYF(0);
189 my_message_sql(ER_UNKNOWN_ERROR,
"Unknown error", flag);
190 return thd->is_error();
199 TEST_F(GetDiagnosticsTest, Error)
202 MockDiagInfoError *info;
203 MEM_ROOT *mem_root= thd()->mem_root;
206 push_warning_printf(thd(), Sql_condition::WARN_LEVEL_WARN,
207 WARN_DATA_TRUNCATED,
"Data truncated");
211 thd()->reset_for_next_command();
214 info=
new (mem_root) MockDiagInfoError(
false);
218 initializer.set_expected_error(ER_UNKNOWN_ERROR);
221 EXPECT_FALSE(cmd->
execute(thd()));
222 EXPECT_TRUE(thd()->get_stmt_da()->
is_ok());
225 EXPECT_EQ(1
U, thd()->get_stmt_da()->statement_warn_count());
228 EXPECT_EQ(1
U, thd()->get_stmt_da()->error_count());
231 EXPECT_EQ(2
U, thd()->get_stmt_da()->warn_count());
236 TEST_F(GetDiagnosticsTest, FatalError)
239 MockDiagInfoError *info;
240 MEM_ROOT *mem_root= thd()->mem_root;
243 push_warning_printf(thd(), Sql_condition::WARN_LEVEL_WARN,
244 WARN_DATA_TRUNCATED,
"Data truncated");
248 thd()->reset_for_next_command();
251 info=
new (mem_root) MockDiagInfoError(
true);
255 initializer.set_expected_error(ER_UNKNOWN_ERROR);
258 EXPECT_TRUE(cmd->
execute(thd()));
259 EXPECT_TRUE(thd()->get_stmt_da()->is_error());
262 EXPECT_EQ(0
U, thd()->get_stmt_da()->error_count());
265 EXPECT_EQ(1
U, thd()->get_stmt_da()->warn_count());
270 TEST_F(GetDiagnosticsTest, StatementInformation)
277 MEM_ROOT *mem_root= thd()->mem_root;
280 thd()->raise_warning(ER_UNKNOWN_ERROR);
282 thd()->set_row_count_func(5
U);
286 diag_info_item=
new (mem_root)
288 EXPECT_FALSE(items.push_back(diag_info_item));
292 diag_info_item=
new (mem_root)
294 EXPECT_FALSE(items.push_back(diag_info_item));
301 EXPECT_FALSE(cmd->
execute(thd()));
302 EXPECT_TRUE(thd()->get_stmt_da()->
is_ok());
306 EXPECT_FALSE(var->fix_fields(thd(), &var));
307 EXPECT_EQ(1
U, var->val_uint());
311 EXPECT_FALSE(var->fix_fields(thd(), &var));
312 EXPECT_EQ(5
U, var->val_int());
317 TEST_F(GetDiagnosticsTest, ConditionInformation)
325 MEM_ROOT *mem_root= thd()->mem_root;
328 my_message_sql(ER_UNKNOWN_ERROR,
"Unknown error", MYF(0));
332 thd()->reset_for_next_command();
336 diag_info_item=
new (mem_root)
338 EXPECT_FALSE(items.push_back(diag_info_item));
342 diag_info_item=
new (mem_root)
344 EXPECT_FALSE(items.push_back(diag_info_item));
354 EXPECT_FALSE(cmd->
execute(thd()));
355 EXPECT_TRUE(thd()->get_stmt_da()->
is_ok());
359 EXPECT_FALSE(var->fix_fields(thd(), &var));
360 EXPECT_EQ(ulonglong (ER_UNKNOWN_ERROR), var->val_uint());
364 EXPECT_FALSE(var->fix_fields(thd(), &var));
365 EXPECT_EQ(&str, var->val_str(&str));
366 EXPECT_STREQ(
"Unknown error", str.c_ptr_safe());
370 Item *get_cond_info_item(THD *thd,
380 LEX_STRING var_name= {C_STRING_WITH_LEN(
"get_cond_info_item")};
383 thd->reset_for_next_command();
388 EXPECT_FALSE(items.push_back(diag_info_item));
398 EXPECT_FALSE(cmd->
execute(thd));
399 EXPECT_TRUE(thd->get_stmt_da()->is_ok());
403 EXPECT_FALSE(var->fix_fields(thd, &var));
411 TEST_F(GetDiagnosticsTest, ConditionInformationClassOrigin)
417 push_warning_printf(thd(), Sql_condition::WARN_LEVEL_WARN,
418 ER_XAER_NOTA,
"Unknown XID");
421 push_warning_printf(thd(), Sql_condition::WARN_LEVEL_WARN,
422 ER_UNKNOWN_ERROR,
"Unknown error");
425 var= get_cond_info_item(thd(), 1, Condition_information_item::CLASS_ORIGIN);
426 EXPECT_EQ(&str, var->val_str(&str));
427 EXPECT_STREQ(
"MySQL", str.c_ptr_safe());
430 var= get_cond_info_item(thd(), 1, Condition_information_item::SUBCLASS_ORIGIN);
431 EXPECT_EQ(&str, var->val_str(&str));
432 EXPECT_STREQ(
"MySQL", str.c_ptr_safe());
435 var= get_cond_info_item(thd(), 2, Condition_information_item::CLASS_ORIGIN);
436 EXPECT_EQ(&str, var->val_str(&str));
437 EXPECT_STREQ(
"ISO 9075", str.c_ptr_safe());
440 var= get_cond_info_item(thd(), 2, Condition_information_item::SUBCLASS_ORIGIN);
441 EXPECT_EQ(&str, var->val_str(&str));
442 EXPECT_STREQ(
"ISO 9075", str.c_ptr_safe());