~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
1802.10.2 by Monty Taylor
Update all of the copyright headers to include the correct address.
14
   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA */
1 by brian
clean slate
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
2173.2.1 by Monty Taylor
Fixes incorrect usage of include
44
#include <config.h>
1241.9.62 by Monty Taylor
Removed plugin/myisam/myisam.h from session.h
45
1502.3.1 by iwamatsu at nigauri
Add cstdio include to files needing it. Fixes the build on some debian
46
#include <cstdio>
1241.9.62 by Monty Taylor
Removed plugin/myisam/myisam.h from session.h
47
#include <stdarg.h>
48
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.
49
#include <drizzled/session.h>
50
#include <drizzled/sql_base.h>
675 by Brian Aker
Cleanup around item includes.
51
#include <drizzled/item/empty_string.h>
642.1.17 by Lee
header file clean up
52
#include <drizzled/item/return_int.h>
971.6.1 by Eric Day
Renamed Protocol to Client, cleaned up some unnecessary methods along the way.
53
#include <drizzled/plugin/client.h>
2234.1.4 by Olaf van der Spek
Refactor includes
54
#include <drizzled/sql_lex.h>
2241.3.2 by Olaf van der Spek
Refactor Session::variables
55
#include <drizzled/system_variables.h>
2241.3.10 by Olaf van der Spek
Move warn_list from Session to diagnostics_area
56
#include <drizzled/diagnostics_area.h>
1 by brian
clean slate
57
1130.3.6 by Monty Taylor
Removed use of using namespace std; from a header.
58
using namespace std;
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
59
2241.3.2 by Olaf van der Spek
Refactor Session::variables
60
namespace drizzled {
971.3.65 by Eric Day
Namespace cleanup for Protocol and Listen.
61
1 by brian
clean slate
62
/*
63
  Store a new message in an error object
64
65
  This is used to in group_concat() to register how many warnings we actually
66
  got after the query has been executed.
67
*/
520.1.22 by Brian Aker
Second pass of thd cleanup
68
void DRIZZLE_ERROR::set_msg(Session *session, const char *msg_arg)
1 by brian
clean slate
69
{
1487 by Brian Aker
More updates for memory::Root
70
  msg= session->warn_root.strdup_root(msg_arg);
1 by brian
clean slate
71
}
72
73
/*
74
  Reset all warnings for the thread
75
76
  SYNOPSIS
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
77
    drizzle_reset_errors()
520.1.22 by Brian Aker
Second pass of thd cleanup
78
    session			Thread handle
1 by brian
clean slate
79
    force               Reset warnings even if it has been done before
80
81
  IMPLEMENTATION
82
    Don't reset warnings if this has already been called for this query.
83
    This may happen if one gets a warning during the parsing stage,
84
    in which case push_warnings() has already called this function.
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
85
*/
1 by brian
clean slate
86
520.1.22 by Brian Aker
Second pass of thd cleanup
87
void drizzle_reset_errors(Session *session, bool force)
1 by brian
clean slate
88
{
1273.1.1 by Jay Pipes
* Changes Session::warn_id to Session::warn_query_id
89
  if (session->getQueryId() != session->getWarningQueryId() || force)
1 by brian
clean slate
90
  {
1273.1.1 by Jay Pipes
* Changes Session::warn_id to Session::warn_query_id
91
    session->setWarningQueryId(session->getQueryId());
1487 by Brian Aker
More updates for memory::Root
92
    session->warn_root.free_root(MYF(0));
520.1.22 by Brian Aker
Second pass of thd cleanup
93
    memset(session->warn_count, 0, sizeof(session->warn_count));
1 by brian
clean slate
94
    if (force)
520.1.22 by Brian Aker
Second pass of thd cleanup
95
      session->total_warn_count= 0;
2241.3.10 by Olaf van der Spek
Move warn_list from Session to diagnostics_area
96
    session->main_da().m_warn_list.clear();
520.1.22 by Brian Aker
Second pass of thd cleanup
97
    session->row_count= 1; // by default point to row 1
1 by brian
clean slate
98
  }
99
}
100
101
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
102
/*
1 by brian
clean slate
103
  Push the warning/error to error list if there is still room in the list
104
105
  SYNOPSIS
106
    push_warning()
520.1.22 by Brian Aker
Second pass of thd cleanup
107
    session			Thread handle
1 by brian
clean slate
108
    level		Severity of warning (note, warning, error ...)
109
    code		Error number
110
    msg			Clear error message
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
111
1 by brian
clean slate
112
  RETURN
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
113
    pointer on DRIZZLE_ERROR object
1 by brian
clean slate
114
*/
115
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
116
DRIZZLE_ERROR *push_warning(Session *session, DRIZZLE_ERROR::enum_warning_level level,
2087.3.1 by Brian Aker
Entire convert over to time_t.
117
                            drizzled::error_t code, const char *msg)
1 by brian
clean slate
118
{
2087.3.1 by Brian Aker
Entire convert over to time_t.
119
  if (level == DRIZZLE_ERROR::WARN_LEVEL_NOTE && !(session->options & OPTION_SQL_NOTES))
120
  {
121
    return NULL;
122
  }
1 by brian
clean slate
123
1273.1.1 by Jay Pipes
* Changes Session::warn_id to Session::warn_query_id
124
  if (session->getQueryId() != session->getWarningQueryId())
520.1.22 by Brian Aker
Second pass of thd cleanup
125
    drizzle_reset_errors(session, 0);
126
  session->got_warning= 1;
1 by brian
clean slate
127
128
  /* Abort if we are using strict mode and we are not using IGNORE */
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
129
  if ((int) level >= (int) DRIZZLE_ERROR::WARN_LEVEL_WARN &&
2114.5.2 by Brian Aker
Just remove second ecapsulated method call.
130
      session->abortOnWarning())
1 by brian
clean slate
131
  {
132
    /* Avoid my_message() calling push_warning */
520.1.22 by Brian Aker
Second pass of thd cleanup
133
    bool no_warnings_for_error= session->no_warnings_for_error;
134
135
    session->no_warnings_for_error= 1;
136
1910.2.8 by Brian Aker
Enapsulate Kill.
137
    session->setKilled(Session::KILL_BAD_DATA);
1 by brian
clean slate
138
    my_message(code, msg, MYF(0));
139
520.1.22 by Brian Aker
Second pass of thd cleanup
140
    session->no_warnings_for_error= no_warnings_for_error;
1 by brian
clean slate
141
    /* Store error in error list (as my_message() didn't do it) */
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
142
    level= DRIZZLE_ERROR::WARN_LEVEL_ERROR;
1 by brian
clean slate
143
  }
144
2241.2.15 by Olaf van der Spek
Refactor
145
  DRIZZLE_ERROR *err= NULL;
2241.3.10 by Olaf van der Spek
Move warn_list from Session to diagnostics_area
146
  if (session->main_da().m_warn_list.size() < session->variables.max_error_count)
1 by brian
clean slate
147
  {
148
    /* We have to use warn_root, as mem_root is freed after each query */
2241.2.15 by Olaf van der Spek
Refactor
149
    err= new (&session->warn_root) DRIZZLE_ERROR(session, code, level, msg);
2241.3.10 by Olaf van der Spek
Move warn_list from Session to diagnostics_area
150
    session->main_da().m_warn_list.push_back(err, &session->warn_root);
1 by brian
clean slate
151
  }
895 by Brian Aker
Completion (?) of uint conversion.
152
  session->warn_count[(uint32_t) level]++;
520.1.22 by Brian Aker
Second pass of thd cleanup
153
  session->total_warn_count++;
2087.3.1 by Brian Aker
Entire convert over to time_t.
154
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,
2087.3.1 by Brian Aker
Entire convert over to time_t.
170
			 drizzled::error_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);
1 by brian
clean slate
179
}
180
181
182
/*
183
  Send all notes, errors or warnings to the client in a result set
184
185
  SYNOPSIS
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
186
    show_warnings()
520.1.22 by Brian Aker
Second pass of thd cleanup
187
    session			Thread handler
1 by brian
clean slate
188
    levels_to_show	Bitmap for which levels to show
189
190
  DESCRIPTION
191
    Takes into account the current LIMIT
192
193
  RETURN VALUES
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
194
    false ok
195
    true  Error sending data to client
1 by brian
clean slate
196
*/
197
198
const LEX_STRING warning_level_names[]=
199
{
200
  { C_STRING_WITH_LEN("Note") },
201
  { C_STRING_WITH_LEN("Warning") },
202
  { C_STRING_WITH_LEN("Error") },
203
  { C_STRING_WITH_LEN("?") }
204
};
205
2026.2.1 by Monty Taylor
Renamed things prefixed mysql_ or mysqld_
206
bool show_warnings(Session *session,
207
                   bitset<DRIZZLE_ERROR::NUM_ERRORS> &levels_to_show)
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
208
{
1 by brian
clean slate
209
  List<Item> field_list;
210
211
  field_list.push_back(new Item_empty_string("Level", 7));
212.2.2 by Patrick Galbraith
Renamed FIELD_TYPE to DRIZZLE_TYPE
212
  field_list.push_back(new Item_return_int("Code",4, DRIZZLE_TYPE_LONG));
261.4.1 by Felipe
- Renamed MYSQL_ERROR to DRIZZLE_ERROR.
213
  field_list.push_back(new Item_empty_string("Message",DRIZZLE_ERRMSG_SIZE));
1 by brian
clean slate
214
2318.3.8 by Olaf van der Spek
Refactor
215
  session->getClient()->sendFields(field_list);
1 by brian
clean slate
216
2227.4.8 by Olaf van der Spek
Session::lex()
217
  Select_Lex *sel= &session->lex().select_lex;
218
  Select_Lex_Unit *unit= &session->lex().unit;
1 by brian
clean slate
219
  ha_rows idx= 0;
220
221
  unit->set_limit(sel);
222
2241.3.10 by Olaf van der Spek
Move warn_list from Session to diagnostics_area
223
  List<DRIZZLE_ERROR>::iterator it(session->main_da().m_warn_list.begin());
2241.2.15 by Olaf van der Spek
Refactor
224
  while (DRIZZLE_ERROR* err= it++)
1 by brian
clean slate
225
  {
226
    /* 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
227
    if (! levels_to_show.test(err->level))
1 by brian
clean slate
228
      continue;
229
    if (++idx <= unit->offset_limit_cnt)
230
      continue;
231
    if (idx > unit->select_limit_cnt)
232
      break;
2015.3.1 by Brian Aker
Encapsulate client call. Also remove the need to call current_session when
233
    session->getClient()->store(warning_level_names[err->level].str,
234
                                warning_level_names[err->level].length);
235
    session->getClient()->store((uint32_t) err->code);
236
    session->getClient()->store(err->msg, strlen(err->msg));
237
    if (session->getClient()->flush())
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
238
      return(true);
1 by brian
clean slate
239
  }
836 by Brian Aker
Fixed session call from function to method.
240
  session->my_eof();
51.1.51 by Jay Pipes
Removed/replaced DBUG symbols and standardized TRUE/FALSE
241
  return(false);
1 by brian
clean slate
242
}
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
243
244
} /* namespace drizzled */