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