~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>
971.6.1 by Eric Day
Renamed Protocol to Client, cleaned up some unnecessary methods along the way.
49
#include <drizzled/plugin/client.h>
1 by brian
clean slate
50
1130.3.6 by Monty Taylor
Removed use of using namespace std; from a header.
51
using namespace std;
971.3.65 by Eric Day
Namespace cleanup for Protocol and Listen.
52
using namespace drizzled;
53
1 by brian
clean slate
54
/*
55
  Store a new message in an error object
56
57
  This is used to in group_concat() to register how many warnings we actually
58
  got after the query has been executed.
59
*/
520.1.22 by Brian Aker
Second pass of thd cleanup
60
void DRIZZLE_ERROR::set_msg(Session *session, const char *msg_arg)
1 by brian
clean slate
61
{
520.1.22 by Brian Aker
Second pass of thd cleanup
62
  msg= strdup_root(&session->warn_root, msg_arg);
1 by brian
clean slate
63
}
64
65
/*
66
  Reset all warnings for the thread
67
68
  SYNOPSIS
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
69
    drizzle_reset_errors()
520.1.22 by Brian Aker
Second pass of thd cleanup
70
    session			Thread handle
1 by brian
clean slate
71
    force               Reset warnings even if it has been done before
72
73
  IMPLEMENTATION
74
    Don't reset warnings if this has already been called for this query.
75
    This may happen if one gets a warning during the parsing stage,
76
    in which case push_warnings() has already called this function.
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
77
*/
1 by brian
clean slate
78
520.1.22 by Brian Aker
Second pass of thd cleanup
79
void drizzle_reset_errors(Session *session, bool force)
1 by brian
clean slate
80
{
520.1.22 by Brian Aker
Second pass of thd cleanup
81
  if (session->query_id != session->warn_id || force)
1 by brian
clean slate
82
  {
520.1.22 by Brian Aker
Second pass of thd cleanup
83
    session->warn_id= session->query_id;
84
    free_root(&session->warn_root,MYF(0));
85
    memset(session->warn_count, 0, sizeof(session->warn_count));
1 by brian
clean slate
86
    if (force)
520.1.22 by Brian Aker
Second pass of thd cleanup
87
      session->total_warn_count= 0;
88
    session->warn_list.empty();
89
    session->row_count= 1; // by default point to row 1
1 by brian
clean slate
90
  }
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
91
  return;
1 by brian
clean slate
92
}
93
94
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
95
/*
1 by brian
clean slate
96
  Push the warning/error to error list if there is still room in the list
97
98
  SYNOPSIS
99
    push_warning()
520.1.22 by Brian Aker
Second pass of thd cleanup
100
    session			Thread handle
1 by brian
clean slate
101
    level		Severity of warning (note, warning, error ...)
102
    code		Error number
103
    msg			Clear error message
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
104
1 by brian
clean slate
105
  RETURN
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
106
    pointer on DRIZZLE_ERROR object
1 by brian
clean slate
107
*/
108
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
109
DRIZZLE_ERROR *push_warning(Session *session, DRIZZLE_ERROR::enum_warning_level level,
482 by Brian Aker
Remove uint.
110
                          uint32_t code, const char *msg)
1 by brian
clean slate
111
{
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
112
  DRIZZLE_ERROR *err= 0;
1 by brian
clean slate
113
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
114
  if (level == DRIZZLE_ERROR::WARN_LEVEL_NOTE &&
520.1.22 by Brian Aker
Second pass of thd cleanup
115
      !(session->options & OPTION_SQL_NOTES))
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
116
    return(0);
1 by brian
clean slate
117
520.1.22 by Brian Aker
Second pass of thd cleanup
118
  if (session->query_id != session->warn_id)
119
    drizzle_reset_errors(session, 0);
120
  session->got_warning= 1;
1 by brian
clean slate
121
122
  /* Abort if we are using strict mode and we are not using IGNORE */
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
123
  if ((int) level >= (int) DRIZZLE_ERROR::WARN_LEVEL_WARN &&
520.1.22 by Brian Aker
Second pass of thd cleanup
124
      session->really_abort_on_warning())
1 by brian
clean slate
125
  {
126
    /* Avoid my_message() calling push_warning */
520.1.22 by Brian Aker
Second pass of thd cleanup
127
    bool no_warnings_for_error= session->no_warnings_for_error;
128
129
    session->no_warnings_for_error= 1;
130
131
    session->killed= Session::KILL_BAD_DATA;
1 by brian
clean slate
132
    my_message(code, msg, MYF(0));
133
520.1.22 by Brian Aker
Second pass of thd cleanup
134
    session->no_warnings_for_error= no_warnings_for_error;
1 by brian
clean slate
135
    /* Store error in error list (as my_message() didn't do it) */
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
136
    level= DRIZZLE_ERROR::WARN_LEVEL_ERROR;
1 by brian
clean slate
137
  }
138
520.1.22 by Brian Aker
Second pass of thd cleanup
139
  if (session->handle_error(code, msg, level))
1019.1.6 by Brian Aker
A number of random cleanups.
140
    return NULL;
1 by brian
clean slate
141
520.1.22 by Brian Aker
Second pass of thd cleanup
142
  if (session->warn_list.elements < session->variables.max_error_count)
1 by brian
clean slate
143
  {
144
    /* 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
145
    if ((err= new (&session->warn_root) DRIZZLE_ERROR(session, code, level, msg)))
146
      session->warn_list.push_back(err, &session->warn_root);
1 by brian
clean slate
147
  }
895 by Brian Aker
Completion (?) of uint conversion.
148
  session->warn_count[(uint32_t) level]++;
520.1.22 by Brian Aker
Second pass of thd cleanup
149
  session->total_warn_count++;
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
150
  return(err);
1 by brian
clean slate
151
}
152
153
/*
154
  Push the warning/error to error list if there is still room in the list
155
156
  SYNOPSIS
157
    push_warning_printf()
520.1.22 by Brian Aker
Second pass of thd cleanup
158
    session			Thread handle
1 by brian
clean slate
159
    level		Severity of warning (note, warning, error ...)
160
    code		Error number
161
    msg			Clear error message
162
*/
163
520.1.22 by Brian Aker
Second pass of thd cleanup
164
void push_warning_printf(Session *session, DRIZZLE_ERROR::enum_warning_level level,
482 by Brian Aker
Remove uint.
165
			 uint32_t code, const char *format, ...)
1 by brian
clean slate
166
{
167
  va_list args;
168
  char    warning[ERRMSGSIZE+20];
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
169
1 by brian
clean slate
170
  va_start(args,format);
77.1.18 by Monty Taylor
Removed my_vsnprintf and my_snprintf.
171
  vsnprintf(warning, sizeof(warning), format, args);
1 by brian
clean slate
172
  va_end(args);
520.1.22 by Brian Aker
Second pass of thd cleanup
173
  push_warning(session, level, code, warning);
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
174
  return;
1 by brian
clean slate
175
}
176
177
178
/*
179
  Send all notes, errors or warnings to the client in a result set
180
181
  SYNOPSIS
182
    mysqld_show_warnings()
520.1.22 by Brian Aker
Second pass of thd cleanup
183
    session			Thread handler
1 by brian
clean slate
184
    levels_to_show	Bitmap for which levels to show
185
186
  DESCRIPTION
187
    Takes into account the current LIMIT
188
189
  RETURN VALUES
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
190
    false ok
191
    true  Error sending data to client
1 by brian
clean slate
192
*/
193
194
const LEX_STRING warning_level_names[]=
195
{
196
  { C_STRING_WITH_LEN("Note") },
197
  { C_STRING_WITH_LEN("Warning") },
198
  { C_STRING_WITH_LEN("Error") },
199
  { C_STRING_WITH_LEN("?") }
200
};
201
1100.3.35 by Padraig O'Sullivan
Updated mysql_show_warnings to take a std::bitset instead of a uint32_t to
202
bool mysqld_show_warnings(Session *session,
203
                          bitset<DRIZZLE_ERROR::NUM_ERRORS> &levels_to_show)
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
204
{
1 by brian
clean slate
205
  List<Item> field_list;
206
207
  field_list.push_back(new Item_empty_string("Level", 7));
212.2.2 by Patrick Galbraith
Renamed FIELD_TYPE to DRIZZLE_TYPE
208
  field_list.push_back(new Item_return_int("Code",4, DRIZZLE_TYPE_LONG));
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
209
  field_list.push_back(new Item_empty_string("Message",DRIZZLE_ERRMSG_SIZE));
1 by brian
clean slate
210
971.6.1 by Eric Day
Renamed Protocol to Client, cleaned up some unnecessary methods along the way.
211
  if (session->client->sendFields(&field_list))
971.3.63 by Eric Day
Removed protocol field flags.
212
    return true;
1 by brian
clean slate
213
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
214
  DRIZZLE_ERROR *err;
846 by Brian Aker
Removing on typedeffed class.
215
  Select_Lex *sel= &session->lex->select_lex;
848 by Brian Aker
typdef class removal (just... use the name of the class).
216
  Select_Lex_Unit *unit= &session->lex->unit;
1 by brian
clean slate
217
  ha_rows idx= 0;
218
219
  unit->set_limit(sel);
220
520.1.22 by Brian Aker
Second pass of thd cleanup
221
  List_iterator_fast<DRIZZLE_ERROR> it(session->warn_list);
1 by brian
clean slate
222
  while ((err= it++))
223
  {
224
    /* Skip levels that the user is not interested in */
1100.3.35 by Padraig O'Sullivan
Updated mysql_show_warnings to take a std::bitset instead of a uint32_t to
225
    if (! levels_to_show.test(err->level))
1 by brian
clean slate
226
      continue;
227
    if (++idx <= unit->offset_limit_cnt)
228
      continue;
229
    if (idx > unit->select_limit_cnt)
230
      break;
971.6.1 by Eric Day
Renamed Protocol to Client, cleaned up some unnecessary methods along the way.
231
    session->client->store(warning_level_names[err->level].str,
232
		           warning_level_names[err->level].length);
233
    session->client->store((uint32_t) err->code);
234
    session->client->store(err->msg, strlen(err->msg));
235
    if (session->client->flush())
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
236
      return(true);
1 by brian
clean slate
237
  }
836 by Brian Aker
Fixed session call from function to method.
238
  session->my_eof();
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
239
  return(false);
1 by brian
clean slate
240
}