61
65
drizzle_reset_errors()
63
67
force Reset warnings even if it has been done before
66
70
Don't reset warnings if this has already been called for this query.
67
71
This may happen if one gets a warning during the parsing stage,
68
72
in which case push_warnings() has already called this function.
71
void drizzle_reset_errors(THD *thd, bool force)
75
void drizzle_reset_errors(Session *session, bool force)
73
if (thd->query_id != thd->warn_id || force)
77
if (session->query_id != session->warn_id || force)
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));
79
session->warn_id= session->query_id;
80
free_root(&session->warn_root,MYF(0));
81
memset(session->warn_count, 0, sizeof(session->warn_count));
79
thd->total_warn_count= 0;
80
thd->warn_list.empty();
81
thd->row_count= 1; // by default point to row 1
83
session->total_warn_count= 0;
84
session->warn_list.empty();
85
session->row_count= 1; // by default point to row 1
88
92
Push the warning/error to error list if there is still room in the list
93
97
level Severity of warning (note, warning, error ...)
95
99
msg Clear error message
98
102
pointer on DRIZZLE_ERROR object
101
DRIZZLE_ERROR *push_warning(THD *thd, DRIZZLE_ERROR::enum_warning_level level,
102
uint code, const char *msg)
105
DRIZZLE_ERROR *push_warning(Session *session, DRIZZLE_ERROR::enum_warning_level level,
106
uint32_t code, const char *msg)
104
108
DRIZZLE_ERROR *err= 0;
106
110
if (level == DRIZZLE_ERROR::WARN_LEVEL_NOTE &&
107
!(thd->options & OPTION_SQL_NOTES))
111
!(session->options & OPTION_SQL_NOTES))
110
if (thd->query_id != thd->warn_id)
111
drizzle_reset_errors(thd, 0);
114
if (session->query_id != session->warn_id)
115
drizzle_reset_errors(session, 0);
116
session->got_warning= 1;
114
118
/* Abort if we are using strict mode and we are not using IGNORE */
115
119
if ((int) level >= (int) DRIZZLE_ERROR::WARN_LEVEL_WARN &&
116
thd->really_abort_on_warning())
120
session->really_abort_on_warning())
118
122
/* Avoid my_message() calling push_warning */
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;
123
bool no_warnings_for_error= session->no_warnings_for_error;
125
session->no_warnings_for_error= 1;
127
session->killed= Session::KILL_BAD_DATA;
124
128
my_message(code, msg, MYF(0));
126
thd->no_warnings_for_error= no_warnings_for_error;
130
session->no_warnings_for_error= no_warnings_for_error;
127
131
/* Store error in error list (as my_message() didn't do it) */
128
132
level= DRIZZLE_ERROR::WARN_LEVEL_ERROR;
131
if (thd->handle_error(code, msg, level))
135
if (session->handle_error(code, msg, level))
134
if (thd->warn_list.elements < thd->variables.max_error_count)
138
if (session->warn_list.elements < session->variables.max_error_count)
136
140
/* We have to use warn_root, as mem_root is freed after each query */
137
if ((err= new (&thd->warn_root) DRIZZLE_ERROR(thd, code, level, msg)))
138
thd->warn_list.push_back(err, &thd->warn_root);
141
if ((err= new (&session->warn_root) DRIZZLE_ERROR(session, code, level, msg)))
142
session->warn_list.push_back(err, &session->warn_root);
140
thd->warn_count[(uint) level]++;
141
thd->total_warn_count++;
144
session->warn_count[(uint) level]++;
145
session->total_warn_count++;
149
153
push_warning_printf()
154
session Thread handle
151
155
level Severity of warning (note, warning, error ...)
152
156
code Error number
153
157
msg Clear error message
156
void push_warning_printf(THD *thd, DRIZZLE_ERROR::enum_warning_level level,
157
uint code, const char *format, ...)
160
void push_warning_printf(Session *session, DRIZZLE_ERROR::enum_warning_level level,
161
uint32_t code, const char *format, ...)
160
164
char warning[ERRMSGSIZE+20];
162
166
va_start(args,format);
163
167
vsnprintf(warning, sizeof(warning), format, args);
165
push_warning(thd, level, code, warning);
169
push_warning(session, level, code, warning);
191
195
{ C_STRING_WITH_LEN("?") }
194
bool mysqld_show_warnings(THD *thd, uint32_t levels_to_show)
198
bool mysqld_show_warnings(Session *session, uint32_t levels_to_show)
196
200
List<Item> field_list;
198
202
field_list.push_back(new Item_empty_string("Level", 7));
199
203
field_list.push_back(new Item_return_int("Code",4, DRIZZLE_TYPE_LONG));
200
204
field_list.push_back(new Item_empty_string("Message",DRIZZLE_ERRMSG_SIZE));
202
if (thd->protocol->send_fields(&field_list,
206
if (session->protocol->send_fields(&field_list,
203
207
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF))
206
210
DRIZZLE_ERROR *err;
207
SELECT_LEX *sel= &thd->lex->select_lex;
208
SELECT_LEX_UNIT *unit= &thd->lex->unit;
211
SELECT_LEX *sel= &session->lex->select_lex;
212
SELECT_LEX_UNIT *unit= &session->lex->unit;
210
Protocol *protocol=thd->protocol;
214
Protocol *protocol=session->protocol;
212
216
unit->set_limit(sel);
214
List_iterator_fast<DRIZZLE_ERROR> it(thd->warn_list);
218
List_iterator_fast<DRIZZLE_ERROR> it(session->warn_list);
215
219
while ((err= it++))
217
221
/* Skip levels that the user is not interested in */