~drizzle-trunk/drizzle/development

1 by brian
clean slate
1
/* Copyright (C) 1995-2002 MySQL AB
2
3
   This program is free software; you can redistribute it and/or modify
4
   it under the terms of the GNU General Public License as published by
5
   the Free Software Foundation; version 2 of the License.
6
7
   This program is distributed in the hope that it will be useful,
8
   but WITHOUT ANY WARRANTY; without even the implied warranty of
9
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10
   GNU General Public License for more details.
11
12
   You should have received a copy of the GNU General Public License
13
   along with this program; if not, write to the Free Software
14
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA */
15
16
/**********************************************************************
17
This file contains the implementation of error and warnings related
18
19
  - Whenever an error or warning occurred, it pushes it to a warning list
20
    that the user can retrieve with SHOW WARNINGS or SHOW ERRORS.
21
22
  - For each statement, we return the number of warnings generated from this
23
    command.  Note that this can be different from @@warning_count as
24
    we reset the warning list only for questions that uses a table.
25
    This is done to allow on to do:
26
    INSERT ...;
27
    SELECT @@warning_count;
28
    SHOW WARNINGS;
29
    (If we would reset after each command, we could not retrieve the number
30
     of warnings)
31
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
32
  - When client requests the information using SHOW command, then
33
    server processes from this list and returns back in the form of
1 by brian
clean slate
34
    resultset.
35
36
    Supported syntaxes:
37
38
    SHOW [COUNT(*)] ERRORS [LIMIT [offset,] rows]
39
    SHOW [COUNT(*)] WARNINGS [LIMIT [offset,] rows]
40
    SELECT @@warning_count, @@error_count;
41
42
***********************************************************************/
43
243.1.17 by Jay Pipes
FINAL PHASE removal of mysql_priv.h (Bye, bye my friend.)
44
#include <drizzled/server_includes.h>
584.1.15 by Monty Taylor
The mega-patch from hell. Renamed sql_class to session (since that's what it is) and removed it and field and table from common_includes.
45
#include <drizzled/session.h>
46
#include <drizzled/sql_base.h>
675 by Brian Aker
Cleanup around item includes.
47
#include <drizzled/item/empty_string.h>
642.1.17 by Lee
header file clean up
48
#include <drizzled/item/return_int.h>
1 by brian
clean slate
49
50
/*
51
  Store a new message in an error object
52
53
  This is used to in group_concat() to register how many warnings we actually
54
  got after the query has been executed.
55
*/
520.1.22 by Brian Aker
Second pass of thd cleanup
56
void DRIZZLE_ERROR::set_msg(Session *session, const char *msg_arg)
1 by brian
clean slate
57
{
520.1.22 by Brian Aker
Second pass of thd cleanup
58
  msg= strdup_root(&session->warn_root, msg_arg);
1 by brian
clean slate
59
}
60
61
/*
62
  Reset all warnings for the thread
63
64
  SYNOPSIS
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
65
    drizzle_reset_errors()
520.1.22 by Brian Aker
Second pass of thd cleanup
66
    session			Thread handle
1 by brian
clean slate
67
    force               Reset warnings even if it has been done before
68
69
  IMPLEMENTATION
70
    Don't reset warnings if this has already been called for this query.
71
    This may happen if one gets a warning during the parsing stage,
72
    in which case push_warnings() has already called this function.
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
73
*/
1 by brian
clean slate
74
520.1.22 by Brian Aker
Second pass of thd cleanup
75
void drizzle_reset_errors(Session *session, bool force)
1 by brian
clean slate
76
{
520.1.22 by Brian Aker
Second pass of thd cleanup
77
  if (session->query_id != session->warn_id || force)
1 by brian
clean slate
78
  {
520.1.22 by Brian Aker
Second pass of thd cleanup
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));
1 by brian
clean slate
82
    if (force)
520.1.22 by Brian Aker
Second pass of thd cleanup
83
      session->total_warn_count= 0;
84
    session->warn_list.empty();
85
    session->row_count= 1; // by default point to row 1
1 by brian
clean slate
86
  }
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
87
  return;
1 by brian
clean slate
88
}
89
90
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
91
/*
1 by brian
clean slate
92
  Push the warning/error to error list if there is still room in the list
93
94
  SYNOPSIS
95
    push_warning()
520.1.22 by Brian Aker
Second pass of thd cleanup
96
    session			Thread handle
1 by brian
clean slate
97
    level		Severity of warning (note, warning, error ...)
98
    code		Error number
99
    msg			Clear error message
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
100
1 by brian
clean slate
101
  RETURN
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
102
    pointer on DRIZZLE_ERROR object
1 by brian
clean slate
103
*/
104
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
105
DRIZZLE_ERROR *push_warning(Session *session, DRIZZLE_ERROR::enum_warning_level level,
482 by Brian Aker
Remove uint.
106
                          uint32_t code, const char *msg)
1 by brian
clean slate
107
{
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
108
  DRIZZLE_ERROR *err= 0;
1 by brian
clean slate
109
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
110
  if (level == DRIZZLE_ERROR::WARN_LEVEL_NOTE &&
520.1.22 by Brian Aker
Second pass of thd cleanup
111
      !(session->options & OPTION_SQL_NOTES))
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
112
    return(0);
1 by brian
clean slate
113
520.1.22 by Brian Aker
Second pass of thd cleanup
114
  if (session->query_id != session->warn_id)
115
    drizzle_reset_errors(session, 0);
116
  session->got_warning= 1;
1 by brian
clean slate
117
118
  /* Abort if we are using strict mode and we are not using IGNORE */
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
119
  if ((int) level >= (int) DRIZZLE_ERROR::WARN_LEVEL_WARN &&
520.1.22 by Brian Aker
Second pass of thd cleanup
120
      session->really_abort_on_warning())
1 by brian
clean slate
121
  {
122
    /* Avoid my_message() calling push_warning */
520.1.22 by Brian Aker
Second pass of thd cleanup
123
    bool no_warnings_for_error= session->no_warnings_for_error;
124
125
    session->no_warnings_for_error= 1;
126
127
    session->killed= Session::KILL_BAD_DATA;
1 by brian
clean slate
128
    my_message(code, msg, MYF(0));
129
520.1.22 by Brian Aker
Second pass of thd cleanup
130
    session->no_warnings_for_error= no_warnings_for_error;
1 by brian
clean slate
131
    /* Store error in error list (as my_message() didn't do it) */
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
132
    level= DRIZZLE_ERROR::WARN_LEVEL_ERROR;
1 by brian
clean slate
133
  }
134
520.1.22 by Brian Aker
Second pass of thd cleanup
135
  if (session->handle_error(code, msg, level))
1019.1.6 by Brian Aker
A number of random cleanups.
136
    return NULL;
1 by brian
clean slate
137
520.1.22 by Brian Aker
Second pass of thd cleanup
138
  if (session->warn_list.elements < session->variables.max_error_count)
1 by brian
clean slate
139
  {
140
    /* We have to use warn_root, as mem_root is freed after each query */
520.1.22 by Brian Aker
Second pass of thd cleanup
141
    if ((err= new (&session->warn_root) DRIZZLE_ERROR(session, code, level, msg)))
142
      session->warn_list.push_back(err, &session->warn_root);
1 by brian
clean slate
143
  }
895 by Brian Aker
Completion (?) of uint conversion.
144
  session->warn_count[(uint32_t) level]++;
520.1.22 by Brian Aker
Second pass of thd cleanup
145
  session->total_warn_count++;
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
146
  return(err);
1 by brian
clean slate
147
}
148
149
/*
150
  Push the warning/error to error list if there is still room in the list
151
152
  SYNOPSIS
153
    push_warning_printf()
520.1.22 by Brian Aker
Second pass of thd cleanup
154
    session			Thread handle
1 by brian
clean slate
155
    level		Severity of warning (note, warning, error ...)
156
    code		Error number
157
    msg			Clear error message
158
*/
159
520.1.22 by Brian Aker
Second pass of thd cleanup
160
void push_warning_printf(Session *session, DRIZZLE_ERROR::enum_warning_level level,
482 by Brian Aker
Remove uint.
161
			 uint32_t code, const char *format, ...)
1 by brian
clean slate
162
{
163
  va_list args;
164
  char    warning[ERRMSGSIZE+20];
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
165
1 by brian
clean slate
166
  va_start(args,format);
77.1.18 by Monty Taylor
Removed my_vsnprintf and my_snprintf.
167
  vsnprintf(warning, sizeof(warning), format, args);
1 by brian
clean slate
168
  va_end(args);
520.1.22 by Brian Aker
Second pass of thd cleanup
169
  push_warning(session, level, code, warning);
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
170
  return;
1 by brian
clean slate
171
}
172
173
174
/*
175
  Send all notes, errors or warnings to the client in a result set
176
177
  SYNOPSIS
178
    mysqld_show_warnings()
520.1.22 by Brian Aker
Second pass of thd cleanup
179
    session			Thread handler
1 by brian
clean slate
180
    levels_to_show	Bitmap for which levels to show
181
182
  DESCRIPTION
183
    Takes into account the current LIMIT
184
185
  RETURN VALUES
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
186
    false ok
187
    true  Error sending data to client
1 by brian
clean slate
188
*/
189
190
const LEX_STRING warning_level_names[]=
191
{
192
  { C_STRING_WITH_LEN("Note") },
193
  { C_STRING_WITH_LEN("Warning") },
194
  { C_STRING_WITH_LEN("Error") },
195
  { C_STRING_WITH_LEN("?") }
196
};
197
520.1.22 by Brian Aker
Second pass of thd cleanup
198
bool mysqld_show_warnings(Session *session, uint32_t levels_to_show)
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
199
{
1 by brian
clean slate
200
  List<Item> field_list;
201
202
  field_list.push_back(new Item_empty_string("Level", 7));
212.2.2 by Patrick Galbraith
Renamed FIELD_TYPE to DRIZZLE_TYPE
203
  field_list.push_back(new Item_return_int("Code",4, DRIZZLE_TYPE_LONG));
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
204
  field_list.push_back(new Item_empty_string("Message",DRIZZLE_ERRMSG_SIZE));
1 by brian
clean slate
205
971.3.19 by Eric Day
Finished first pass at Protocol cleanup, still some things to remove but they are a bit more involved.
206
  if (session->protocol->sendFields(&field_list,
207
                                  Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF))
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
208
    return(true);
1 by brian
clean slate
209
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
210
  DRIZZLE_ERROR *err;
846 by Brian Aker
Removing on typedeffed class.
211
  Select_Lex *sel= &session->lex->select_lex;
848 by Brian Aker
typdef class removal (just... use the name of the class).
212
  Select_Lex_Unit *unit= &session->lex->unit;
1 by brian
clean slate
213
  ha_rows idx= 0;
520.1.22 by Brian Aker
Second pass of thd cleanup
214
  Protocol *protocol=session->protocol;
1 by brian
clean slate
215
216
  unit->set_limit(sel);
217
520.1.22 by Brian Aker
Second pass of thd cleanup
218
  List_iterator_fast<DRIZZLE_ERROR> it(session->warn_list);
1 by brian
clean slate
219
  while ((err= it++))
220
  {
221
    /* Skip levels that the user is not interested in */
222
    if (!(levels_to_show & ((ulong) 1 << err->level)))
223
      continue;
224
    if (++idx <= unit->offset_limit_cnt)
225
      continue;
226
    if (idx > unit->select_limit_cnt)
227
      break;
971.3.19 by Eric Day
Finished first pass at Protocol cleanup, still some things to remove but they are a bit more involved.
228
    protocol->prepareForResend();
1 by brian
clean slate
229
    protocol->store(warning_level_names[err->level].str,
1054.2.9 by Monty Taylor
Removed CHARSET_INFO stuff from protocol plugin interface - it makes no sense.
230
		    warning_level_names[err->level].length);
205 by Brian Aker
uint32 -> uin32_t
231
    protocol->store((uint32_t) err->code);
1054.2.9 by Monty Taylor
Removed CHARSET_INFO stuff from protocol plugin interface - it makes no sense.
232
    protocol->store(err->msg, strlen(err->msg));
1 by brian
clean slate
233
    if (protocol->write())
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
234
      return(true);
1 by brian
clean slate
235
  }
836 by Brian Aker
Fixed session call from function to method.
236
  session->my_eof();
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
237
  return(false);
1 by brian
clean slate
238
}