63
49
This is used to in group_concat() to register how many warnings we actually
64
50
got after the query has been executed.
66
void DRIZZLE_ERROR::set_msg(Session *session, const char *msg_arg)
53
void MYSQL_ERROR::set_msg(THD *thd, const char *msg_arg)
68
msg= session->warn_root.strdup_root(msg_arg);
55
msg= strdup_root(&thd->warn_root, msg_arg);
72
60
Reset all warnings for the thread
75
drizzle_reset_errors()
77
65
force Reset warnings even if it has been done before
80
68
Don't reset warnings if this has already been called for this query.
81
69
This may happen if one gets a warning during the parsing stage,
82
70
in which case push_warnings() has already called this function.
85
void drizzle_reset_errors(Session *session, bool force)
73
void mysql_reset_errors(THD *thd, bool force)
87
if (session->getQueryId() != session->getWarningQueryId() || force)
75
DBUG_ENTER("mysql_reset_errors");
76
if (thd->query_id != thd->warn_id || force)
89
session->setWarningQueryId(session->getQueryId());
90
session->warn_root.free_root(MYF(0));
91
memset(session->warn_count, 0, sizeof(session->warn_count));
78
thd->warn_id= thd->query_id;
79
free_root(&thd->warn_root,MYF(0));
80
bzero((char*) thd->warn_count, sizeof(thd->warn_count));
93
session->total_warn_count= 0;
94
session->warn_list.empty();
95
session->row_count= 1; // by default point to row 1
82
thd->total_warn_count= 0;
83
thd->warn_list.empty();
84
thd->row_count= 1; // by default point to row 1
102
91
Push the warning/error to error list if there is still room in the list
106
session Thread handle
107
96
level Severity of warning (note, warning, error ...)
109
98
msg Clear error message
112
pointer on DRIZZLE_ERROR object
101
pointer on MYSQL_ERROR object
115
DRIZZLE_ERROR *push_warning(Session *session, DRIZZLE_ERROR::enum_warning_level level,
116
uint32_t code, const char *msg)
104
MYSQL_ERROR *push_warning(THD *thd, MYSQL_ERROR::enum_warning_level level,
105
uint code, const char *msg)
118
DRIZZLE_ERROR *err= 0;
120
if (level == DRIZZLE_ERROR::WARN_LEVEL_NOTE &&
121
!(session->options & OPTION_SQL_NOTES))
124
if (session->getQueryId() != session->getWarningQueryId())
125
drizzle_reset_errors(session, 0);
126
session->got_warning= 1;
108
DBUG_ENTER("push_warning");
109
DBUG_PRINT("enter", ("code: %d, msg: %s", code, msg));
111
if (level == MYSQL_ERROR::WARN_LEVEL_NOTE &&
112
!(thd->options & OPTION_SQL_NOTES))
115
if (thd->query_id != thd->warn_id)
116
mysql_reset_errors(thd, 0);
128
119
/* Abort if we are using strict mode and we are not using IGNORE */
129
if ((int) level >= (int) DRIZZLE_ERROR::WARN_LEVEL_WARN &&
130
session->really_abort_on_warning())
120
if ((int) level >= (int) MYSQL_ERROR::WARN_LEVEL_WARN &&
121
thd->really_abort_on_warning())
132
123
/* Avoid my_message() calling push_warning */
133
bool no_warnings_for_error= session->no_warnings_for_error;
135
session->no_warnings_for_error= 1;
137
session->killed= Session::KILL_BAD_DATA;
124
bool no_warnings_for_error= thd->no_warnings_for_error;
126
thd->no_warnings_for_error= 1;
128
thd->killed= THD::KILL_BAD_DATA;
138
129
my_message(code, msg, MYF(0));
140
session->no_warnings_for_error= no_warnings_for_error;
131
thd->no_warnings_for_error= no_warnings_for_error;
141
132
/* Store error in error list (as my_message() didn't do it) */
142
level= DRIZZLE_ERROR::WARN_LEVEL_ERROR;
133
level= MYSQL_ERROR::WARN_LEVEL_ERROR;
145
if (session->handle_error(code, msg, level))
136
if (thd->handle_error(code, msg, level))
148
if (session->warn_list.elements < session->variables.max_error_count)
139
if (thd->warn_list.elements < thd->variables.max_error_count)
150
141
/* We have to use warn_root, as mem_root is freed after each query */
151
if ((err= new (&session->warn_root) DRIZZLE_ERROR(session, code, level, msg)))
152
session->warn_list.push_back(err, &session->warn_root);
142
if ((err= new (&thd->warn_root) MYSQL_ERROR(thd, code, level, msg)))
143
thd->warn_list.push_back(err, &thd->warn_root);
154
session->warn_count[(uint32_t) level]++;
155
session->total_warn_count++;
145
thd->warn_count[(uint) level]++;
146
thd->total_warn_count++;
163
154
push_warning_printf()
164
session Thread handle
165
156
level Severity of warning (note, warning, error ...)
166
157
code Error number
167
158
msg Clear error message
170
void push_warning_printf(Session *session, DRIZZLE_ERROR::enum_warning_level level,
171
uint32_t code, const char *format, ...)
161
void push_warning_printf(THD *thd, MYSQL_ERROR::enum_warning_level level,
162
uint code, const char *format, ...)
174
165
char warning[ERRMSGSIZE+20];
166
DBUG_ENTER("push_warning_printf");
167
DBUG_PRINT("enter",("warning: %u", code));
176
169
va_start(args,format);
177
vsnprintf(warning, sizeof(warning), format, args);
170
my_vsnprintf(warning, sizeof(warning), format, args);
179
push_warning(session, level, code, warning);
172
push_warning(thd, level, code, warning);
205
198
{ C_STRING_WITH_LEN("?") }
208
bool mysqld_show_warnings(Session *session,
209
bitset<DRIZZLE_ERROR::NUM_ERRORS> &levels_to_show)
201
bool mysqld_show_warnings(THD *thd, ulong levels_to_show)
211
203
List<Item> field_list;
204
DBUG_ENTER("mysqld_show_warnings");
213
206
field_list.push_back(new Item_empty_string("Level", 7));
214
field_list.push_back(new Item_return_int("Code",4, DRIZZLE_TYPE_LONG));
215
field_list.push_back(new Item_empty_string("Message",DRIZZLE_ERRMSG_SIZE));
217
if (session->client->sendFields(&field_list))
221
Select_Lex *sel= &session->lex->select_lex;
222
Select_Lex_Unit *unit= &session->lex->unit;
207
field_list.push_back(new Item_return_int("Code",4, MYSQL_TYPE_LONG));
208
field_list.push_back(new Item_empty_string("Message",MYSQL_ERRMSG_SIZE));
210
if (thd->protocol->send_fields(&field_list,
211
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF))
215
SELECT_LEX *sel= &thd->lex->select_lex;
216
SELECT_LEX_UNIT *unit= &thd->lex->unit;
218
Protocol *protocol=thd->protocol;
225
220
unit->set_limit(sel);
227
List_iterator_fast<DRIZZLE_ERROR> it(session->warn_list);
222
List_iterator_fast<MYSQL_ERROR> it(thd->warn_list);
228
223
while ((err= it++))
230
225
/* Skip levels that the user is not interested in */
231
if (! levels_to_show.test(err->level))
226
if (!(levels_to_show & ((ulong) 1 << err->level)))
233
228
if (++idx <= unit->offset_limit_cnt)
235
230
if (idx > unit->select_limit_cnt)
237
session->client->store(warning_level_names[err->level].str,
238
warning_level_names[err->level].length);
239
session->client->store((uint32_t) err->code);
240
session->client->store(err->msg, strlen(err->msg));
241
if (session->client->flush())
232
protocol->prepare_for_resend();
233
protocol->store(warning_level_names[err->level].str,
234
warning_level_names[err->level].length, system_charset_info);
235
protocol->store((uint32) err->code);
236
protocol->store(err->msg, strlen(err->msg), system_charset_info);
237
if (protocol->write())
248
} /* namespace drizzled */