75
61
drizzle_reset_errors()
77
63
force Reset warnings even if it has been done before
80
66
Don't reset warnings if this has already been called for this query.
81
67
This may happen if one gets a warning during the parsing stage,
82
68
in which case push_warnings() has already called this function.
85
void drizzle_reset_errors(Session *session, bool force)
71
void drizzle_reset_errors(THD *thd, bool force)
87
if (session->getQueryId() != session->getWarningQueryId() || force)
73
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));
75
thd->warn_id= thd->query_id;
76
free_root(&thd->warn_root,MYF(0));
77
memset(thd->warn_count, 0, 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
79
thd->total_warn_count= 0;
80
thd->warn_list.empty();
81
thd->row_count= 1; // by default point to row 1
102
88
Push the warning/error to error list if there is still room in the list
106
session Thread handle
107
93
level Severity of warning (note, warning, error ...)
109
95
msg Clear error message
112
98
pointer on DRIZZLE_ERROR object
115
DRIZZLE_ERROR *push_warning(Session *session, DRIZZLE_ERROR::enum_warning_level level,
116
uint32_t code, const char *msg)
101
DRIZZLE_ERROR *push_warning(THD *thd, DRIZZLE_ERROR::enum_warning_level level,
102
uint code, const char *msg)
118
104
DRIZZLE_ERROR *err= 0;
120
106
if (level == DRIZZLE_ERROR::WARN_LEVEL_NOTE &&
121
!(session->options & OPTION_SQL_NOTES))
107
!(thd->options & OPTION_SQL_NOTES))
124
if (session->getQueryId() != session->getWarningQueryId())
125
drizzle_reset_errors(session, 0);
126
session->got_warning= 1;
110
if (thd->query_id != thd->warn_id)
111
drizzle_reset_errors(thd, 0);
128
114
/* Abort if we are using strict mode and we are not using IGNORE */
129
115
if ((int) level >= (int) DRIZZLE_ERROR::WARN_LEVEL_WARN &&
130
session->really_abort_on_warning())
116
thd->really_abort_on_warning())
132
118
/* 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->setKilled(Session::KILL_BAD_DATA);
119
bool no_warnings_for_error= thd->no_warnings_for_error;
121
thd->no_warnings_for_error= 1;
123
thd->killed= THD::KILL_BAD_DATA;
138
124
my_message(code, msg, MYF(0));
140
session->no_warnings_for_error= no_warnings_for_error;
126
thd->no_warnings_for_error= no_warnings_for_error;
141
127
/* Store error in error list (as my_message() didn't do it) */
142
128
level= DRIZZLE_ERROR::WARN_LEVEL_ERROR;
145
if (session->handle_error(code, msg, level))
131
if (thd->handle_error(code, msg, level))
148
if (session->warn_list.elements < session->variables.max_error_count)
134
if (thd->warn_list.elements < thd->variables.max_error_count)
150
136
/* 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);
137
if ((err= new (&thd->warn_root) DRIZZLE_ERROR(thd, code, level, msg)))
138
thd->warn_list.push_back(err, &thd->warn_root);
154
session->warn_count[(uint32_t) level]++;
155
session->total_warn_count++;
140
thd->warn_count[(uint) level]++;
141
thd->total_warn_count++;
163
149
push_warning_printf()
164
session Thread handle
165
151
level Severity of warning (note, warning, error ...)
166
152
code Error number
167
153
msg Clear error message
170
void push_warning_printf(Session *session, DRIZZLE_ERROR::enum_warning_level level,
171
uint32_t code, const char *format, ...)
156
void push_warning_printf(THD *thd, DRIZZLE_ERROR::enum_warning_level level,
157
uint code, const char *format, ...)
174
160
char warning[ERRMSGSIZE+20];
176
162
va_start(args,format);
177
163
vsnprintf(warning, sizeof(warning), format, args);
179
push_warning(session, level, code, warning);
165
push_warning(thd, level, code, warning);
205
191
{ C_STRING_WITH_LEN("?") }
208
bool mysqld_show_warnings(Session *session,
209
bitset<DRIZZLE_ERROR::NUM_ERRORS> &levels_to_show)
194
bool mysqld_show_warnings(THD *thd, uint32_t levels_to_show)
211
196
List<Item> field_list;
213
198
field_list.push_back(new Item_empty_string("Level", 7));
214
199
field_list.push_back(new Item_return_int("Code",4, DRIZZLE_TYPE_LONG));
215
200
field_list.push_back(new Item_empty_string("Message",DRIZZLE_ERRMSG_SIZE));
217
if (session->client->sendFields(&field_list))
202
if (thd->protocol->send_fields(&field_list,
203
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF))
220
206
DRIZZLE_ERROR *err;
221
Select_Lex *sel= &session->lex->select_lex;
222
Select_Lex_Unit *unit= &session->lex->unit;
207
SELECT_LEX *sel= &thd->lex->select_lex;
208
SELECT_LEX_UNIT *unit= &thd->lex->unit;
210
Protocol *protocol=thd->protocol;
225
212
unit->set_limit(sel);
227
List_iterator_fast<DRIZZLE_ERROR> it(session->warn_list);
214
List_iterator_fast<DRIZZLE_ERROR> it(thd->warn_list);
228
215
while ((err= it++))
230
217
/* Skip levels that the user is not interested in */
231
if (! levels_to_show.test(err->level))
218
if (!(levels_to_show & ((ulong) 1 << err->level)))
233
220
if (++idx <= unit->offset_limit_cnt)
235
222
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())
224
protocol->prepare_for_resend();
225
protocol->store(warning_level_names[err->level].str,
226
warning_level_names[err->level].length, system_charset_info);
227
protocol->store((uint32_t) err->code);
228
protocol->store(err->msg, strlen(err->msg), system_charset_info);
229
if (protocol->write())
248
} /* namespace drizzled */