1 /*
2 Copyright 2002-2007 MySQL AB, 2008 Sun Microsystems
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of version 2 of the GNU General Public License as
6 published by the Free Software Foundation.
7
8 There are special exceptions to the terms and conditions of the GPL
9 as it is applied to this software. View the full text of the
10 exception in file EXCEPTIONS-CONNECTOR-J in the directory of this
11 software distribution.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
22
23
24 */
25 package com.mysql.jdbc;
26
27 import java.lang.reflect.Constructor;
28 import java.lang.reflect.Method;
29 import java.net.BindException;
30 import java.sql.DataTruncation;
31 import java.sql.SQLException;
32 import java.sql.SQLWarning;
33 import java.util.HashMap;
34 import java.util.Hashtable;
35 import java.util.Iterator;
36 import java.util.Map;
37 import java.util.TreeMap;
38
39 import com.mysql.jdbc.exceptions.MySQLDataException;
40 import com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException;
41 import com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException;
42 import com.mysql.jdbc.exceptions.MySQLSyntaxErrorException;
43 import com.mysql.jdbc.exceptions.MySQLTransactionRollbackException;
44 import com.mysql.jdbc.exceptions.MySQLTransientConnectionException;
45
46 /**
47 * SQLError is a utility class that maps MySQL error codes to X/Open error codes
48 * as is required by the JDBC spec.
49 *
50 * @author Mark Matthews <mmatthew_at_worldserver.com>
51 * @version $Id: SQLError.java 5122 2006-04-03 15:37:11 +0000 (Mon, 03 Apr 2006)
52 * mmatthews $
53 */
54 public class SQLError {
55 static final int ER_WARNING_NOT_COMPLETE_ROLLBACK = 1196;
56
57 private static Map mysqlToSql99State;
58
59 private static Map mysqlToSqlState;
60
61 public static final String SQL_STATE_BASE_TABLE_NOT_FOUND = "S0002"; //$NON-NLS-1$
62
63 public static final String SQL_STATE_BASE_TABLE_OR_VIEW_ALREADY_EXISTS = "S0001"; //$NON-NLS-1$
64
65 public static final String SQL_STATE_BASE_TABLE_OR_VIEW_NOT_FOUND = "42S02"; //$NON-NLS-1$
66
67 public static final String SQL_STATE_COLUMN_ALREADY_EXISTS = "S0021"; //$NON-NLS-1$
68
69 public static final String SQL_STATE_COLUMN_NOT_FOUND = "S0022"; //$NON-NLS-1$
70
71 public static final String SQL_STATE_COMMUNICATION_LINK_FAILURE = "08S01"; //$NON-NLS-1$
72
73 public static final String SQL_STATE_CONNECTION_FAIL_DURING_TX = "08007"; //$NON-NLS-1$
74
75 public static final String SQL_STATE_CONNECTION_IN_USE = "08002"; //$NON-NLS-1$
76
77 public static final String SQL_STATE_CONNECTION_NOT_OPEN = "08003"; //$NON-NLS-1$
78
79 public static final String SQL_STATE_CONNECTION_REJECTED = "08004"; //$NON-NLS-1$
80
81 public static final String SQL_STATE_DATE_TRUNCATED = "01004"; //$NON-NLS-1$
82
83 public static final String SQL_STATE_DATETIME_FIELD_OVERFLOW = "22008"; //$NON-NLS-1$
84
85 public static final String SQL_STATE_DEADLOCK = "41000"; //$NON-NLS-1$
86
87 public static final String SQL_STATE_DISCONNECT_ERROR = "01002"; //$NON-NLS-1$
88
89 public static final String SQL_STATE_DIVISION_BY_ZERO = "22012"; //$NON-NLS-1$
90
91 public static final String SQL_STATE_DRIVER_NOT_CAPABLE = "S1C00"; //$NON-NLS-1$
92
93 public static final String SQL_STATE_ERROR_IN_ROW = "01S01"; //$NON-NLS-1$
94
95 public static final String SQL_STATE_GENERAL_ERROR = "S1000"; //$NON-NLS-1$
96
97 public static final String SQL_STATE_ILLEGAL_ARGUMENT = "S1009"; //$NON-NLS-1$
98
99 public static final String SQL_STATE_INDEX_ALREADY_EXISTS = "S0011"; //$NON-NLS-1$
100
101 public static final String SQL_STATE_INDEX_NOT_FOUND = "S0012"; //$NON-NLS-1$
102
103 public static final String SQL_STATE_INSERT_VALUE_LIST_NO_MATCH_COL_LIST = "21S01"; //$NON-NLS-1$
104
105 public static final String SQL_STATE_INVALID_AUTH_SPEC = "28000"; //$NON-NLS-1$
106
107 public static final String SQL_STATE_INVALID_CHARACTER_VALUE_FOR_CAST = "22018"; // $NON_NLS-1$
108
109 public static final String SQL_STATE_INVALID_COLUMN_NUMBER = "S1002"; //$NON-NLS-1$
110
111 public static final String SQL_STATE_INVALID_CONNECTION_ATTRIBUTE = "01S00"; //$NON-NLS-1$
112
113 public static final String SQL_STATE_MEMORY_ALLOCATION_FAILURE = "S1001"; //$NON-NLS-1$
114
115 public static final String SQL_STATE_MORE_THAN_ONE_ROW_UPDATED_OR_DELETED = "01S04"; //$NON-NLS-1$
116
117 public static final String SQL_STATE_NO_DEFAULT_FOR_COLUMN = "S0023"; //$NON-NLS-1$
118
119 public static final String SQL_STATE_NO_ROWS_UPDATED_OR_DELETED = "01S03"; //$NON-NLS-1$
120
121 public static final String SQL_STATE_NUMERIC_VALUE_OUT_OF_RANGE = "22003"; //$NON-NLS-1$
122
123 public static final String SQL_STATE_PRIVILEGE_NOT_REVOKED = "01006"; //$NON-NLS-1$
124
125 public static final String SQL_STATE_SYNTAX_ERROR = "42000"; //$NON-NLS-1$
126
127 public static final String SQL_STATE_TIMEOUT_EXPIRED = "S1T00"; //$NON-NLS-1$
128
129 public static final String SQL_STATE_TRANSACTION_RESOLUTION_UNKNOWN = "08007"; // $NON_NLS-1$
130
131 public static final String SQL_STATE_UNABLE_TO_CONNECT_TO_DATASOURCE = "08001"; //$NON-NLS-1$
132
133 public static final String SQL_STATE_WRONG_NO_OF_PARAMETERS = "07001"; //$NON-NLS-1$
134
135 public static final String SQL_STATE_INVALID_TRANSACTION_TERMINATION = "2D000"; // $NON_NLS-1$
136
137 private static Map sqlStateMessages;
138
139 private static final long DEFAULT_WAIT_TIMEOUT_SECONDS = 28800;
140
141 private static final int DUE_TO_TIMEOUT_FALSE = 0;
142
143 private static final int DUE_TO_TIMEOUT_MAYBE = 2;
144
145 private static final int DUE_TO_TIMEOUT_TRUE = 1;
146
147 private static final Constructor JDBC_4_COMMUNICATIONS_EXCEPTION_CTOR;
148
149 private static Method THROWABLE_INIT_CAUSE_METHOD;
150
151 static {
152 if (Util.isJdbc4()) {
153 try {
154 JDBC_4_COMMUNICATIONS_EXCEPTION_CTOR = Class.forName(
155 "com.mysql.jdbc.exceptions.jdbc4.CommunicationsException")
156 .getConstructor(
157 new Class[] { ConnectionImpl.class, Long.TYPE, Long.TYPE, Exception.class });
158 } catch (SecurityException e) {
159 throw new RuntimeException(e);
160 } catch (NoSuchMethodException e) {
161 throw new RuntimeException(e);
162 } catch (ClassNotFoundException e) {
163 throw new RuntimeException(e);
164 }
165 } else {
166 JDBC_4_COMMUNICATIONS_EXCEPTION_CTOR = null;
167 }
168
169 try {
170 THROWABLE_INIT_CAUSE_METHOD = Throwable.class.getMethod("initCause", new Class[] {Throwable.class});
171 } catch (Throwable t) {
172 // we're not on a VM that has it
173 THROWABLE_INIT_CAUSE_METHOD = null;
174 }
175
176 sqlStateMessages = new HashMap();
177 sqlStateMessages.put(SQL_STATE_DISCONNECT_ERROR, Messages
178 .getString("SQLError.35")); //$NON-NLS-1$
179 sqlStateMessages.put(SQL_STATE_DATE_TRUNCATED, Messages
180 .getString("SQLError.36")); //$NON-NLS-1$
181 sqlStateMessages.put(SQL_STATE_PRIVILEGE_NOT_REVOKED, Messages
182 .getString("SQLError.37")); //$NON-NLS-1$
183 sqlStateMessages.put(SQL_STATE_INVALID_CONNECTION_ATTRIBUTE, Messages
184 .getString("SQLError.38")); //$NON-NLS-1$
185 sqlStateMessages.put(SQL_STATE_ERROR_IN_ROW, Messages
186 .getString("SQLError.39")); //$NON-NLS-1$
187 sqlStateMessages.put(SQL_STATE_NO_ROWS_UPDATED_OR_DELETED, Messages
188 .getString("SQLError.40")); //$NON-NLS-1$
189 sqlStateMessages.put(SQL_STATE_MORE_THAN_ONE_ROW_UPDATED_OR_DELETED,
190 Messages.getString("SQLError.41")); //$NON-NLS-1$
191 sqlStateMessages.put(SQL_STATE_WRONG_NO_OF_PARAMETERS, Messages
192 .getString("SQLError.42")); //$NON-NLS-1$
193 sqlStateMessages.put(SQL_STATE_UNABLE_TO_CONNECT_TO_DATASOURCE,
194 Messages.getString("SQLError.43")); //$NON-NLS-1$
195 sqlStateMessages.put(SQL_STATE_CONNECTION_IN_USE, Messages
196 .getString("SQLError.44")); //$NON-NLS-1$
197 sqlStateMessages.put(SQL_STATE_CONNECTION_NOT_OPEN, Messages
198 .getString("SQLError.45")); //$NON-NLS-1$
199 sqlStateMessages.put(SQL_STATE_CONNECTION_REJECTED, Messages
200 .getString("SQLError.46")); //$NON-NLS-1$
201 sqlStateMessages.put(SQL_STATE_CONNECTION_FAIL_DURING_TX, Messages
202 .getString("SQLError.47")); //$NON-NLS-1$
203 sqlStateMessages.put(SQL_STATE_COMMUNICATION_LINK_FAILURE, Messages
204 .getString("SQLError.48")); //$NON-NLS-1$
205 sqlStateMessages.put(SQL_STATE_INSERT_VALUE_LIST_NO_MATCH_COL_LIST,
206 Messages.getString("SQLError.49")); //$NON-NLS-1$
207 sqlStateMessages.put(SQL_STATE_NUMERIC_VALUE_OUT_OF_RANGE, Messages
208 .getString("SQLError.50")); //$NON-NLS-1$
209 sqlStateMessages.put(SQL_STATE_DATETIME_FIELD_OVERFLOW, Messages
210 .getString("SQLError.51")); //$NON-NLS-1$
211 sqlStateMessages.put(SQL_STATE_DIVISION_BY_ZERO, Messages
212 .getString("SQLError.52")); //$NON-NLS-1$
213 sqlStateMessages.put(SQL_STATE_DEADLOCK, Messages
214 .getString("SQLError.53")); //$NON-NLS-1$
215 sqlStateMessages.put(SQL_STATE_INVALID_AUTH_SPEC, Messages
216 .getString("SQLError.54")); //$NON-NLS-1$
217 sqlStateMessages.put(SQL_STATE_SYNTAX_ERROR, Messages
218 .getString("SQLError.55")); //$NON-NLS-1$
219 sqlStateMessages.put(SQL_STATE_BASE_TABLE_OR_VIEW_NOT_FOUND, Messages
220 .getString("SQLError.56")); //$NON-NLS-1$
221 sqlStateMessages.put(SQL_STATE_BASE_TABLE_OR_VIEW_ALREADY_EXISTS,
222 Messages.getString("SQLError.57")); //$NON-NLS-1$
223 sqlStateMessages.put(SQL_STATE_BASE_TABLE_NOT_FOUND, Messages
224 .getString("SQLError.58")); //$NON-NLS-1$
225 sqlStateMessages.put(SQL_STATE_INDEX_ALREADY_EXISTS, Messages
226 .getString("SQLError.59")); //$NON-NLS-1$
227 sqlStateMessages.put(SQL_STATE_INDEX_NOT_FOUND, Messages
228 .getString("SQLError.60")); //$NON-NLS-1$
229 sqlStateMessages.put(SQL_STATE_COLUMN_ALREADY_EXISTS, Messages
230 .getString("SQLError.61")); //$NON-NLS-1$
231 sqlStateMessages.put(SQL_STATE_COLUMN_NOT_FOUND, Messages
232 .getString("SQLError.62")); //$NON-NLS-1$
233 sqlStateMessages.put(SQL_STATE_NO_DEFAULT_FOR_COLUMN, Messages
234 .getString("SQLError.63")); //$NON-NLS-1$
235 sqlStateMessages.put(SQL_STATE_GENERAL_ERROR, Messages
236 .getString("SQLError.64")); //$NON-NLS-1$
237 sqlStateMessages.put(SQL_STATE_MEMORY_ALLOCATION_FAILURE, Messages
238 .getString("SQLError.65")); //$NON-NLS-1$
239 sqlStateMessages.put(SQL_STATE_INVALID_COLUMN_NUMBER, Messages
240 .getString("SQLError.66")); //$NON-NLS-1$
241 sqlStateMessages.put(SQL_STATE_ILLEGAL_ARGUMENT, Messages
242 .getString("SQLError.67")); //$NON-NLS-1$
243 sqlStateMessages.put(SQL_STATE_DRIVER_NOT_CAPABLE, Messages
244 .getString("SQLError.68")); //$NON-NLS-1$
245 sqlStateMessages.put(SQL_STATE_TIMEOUT_EXPIRED, Messages
246 .getString("SQLError.69")); //$NON-NLS-1$
247
248 mysqlToSqlState = new Hashtable();
249
250 //
251 // Communications Errors
252 //
253 // ER_CON_COUNT_ERROR 1040
254 // ER_BAD_HOST_ERROR 1042
255 // ER_HANDSHAKE_ERROR 1043
256 // ER_UNKNOWN_COM_ERROR 1047
257 // ER_IPSOCK_ERROR 1081
258 //
259 mysqlToSqlState.put(Constants.integerValueOf(1040), SQL_STATE_CONNECTION_REJECTED);
260 mysqlToSqlState.put(Constants.integerValueOf(1042), SQL_STATE_CONNECTION_REJECTED);
261 mysqlToSqlState.put(Constants.integerValueOf(1043), SQL_STATE_CONNECTION_REJECTED);
262 mysqlToSqlState.put(Constants.integerValueOf(1047),
263 SQL_STATE_COMMUNICATION_LINK_FAILURE);
264 mysqlToSqlState.put(Constants.integerValueOf(1081),
265 SQL_STATE_COMMUNICATION_LINK_FAILURE);
266
267 // ER_HOST_IS_BLOCKED 1129
268 // ER_HOST_NOT_PRIVILEGED 1130
269 mysqlToSqlState.put(Constants.integerValueOf(1129), SQL_STATE_CONNECTION_REJECTED);
270 mysqlToSqlState.put(Constants.integerValueOf(1130), SQL_STATE_CONNECTION_REJECTED);
271
272 //
273 // Authentication Errors
274 //
275 // ER_ACCESS_DENIED_ERROR 1045
276 //
277 mysqlToSqlState.put(Constants.integerValueOf(1045), SQL_STATE_INVALID_AUTH_SPEC);
278
279 //
280 // Resource errors
281 //
282 // ER_CANT_CREATE_FILE 1004
283 // ER_CANT_CREATE_TABLE 1005
284 // ER_CANT_LOCK 1015
285 // ER_DISK_FULL 1021
286 // ER_CON_COUNT_ERROR 1040
287 // ER_OUT_OF_RESOURCES 1041
288 //
289 // Out-of-memory errors
290 //
291 // ER_OUTOFMEMORY 1037
292 // ER_OUT_OF_SORTMEMORY 1038
293 //
294 mysqlToSqlState.put(Constants.integerValueOf(1037),
295 SQL_STATE_MEMORY_ALLOCATION_FAILURE);
296 mysqlToSqlState.put(Constants.integerValueOf(1038),
297 SQL_STATE_MEMORY_ALLOCATION_FAILURE);
298
299 //
300 // Syntax Errors
301 //
302 // ER_PARSE_ERROR 1064
303 // ER_EMPTY_QUERY 1065
304 //
305 mysqlToSqlState.put(Constants.integerValueOf(1064), SQL_STATE_SYNTAX_ERROR);
306 mysqlToSqlState.put(Constants.integerValueOf(1065), SQL_STATE_SYNTAX_ERROR);
307
308 //
309 // Invalid argument errors
310 //
311 // ER_WRONG_FIELD_WITH_GROUP 1055
312 // ER_WRONG_GROUP_FIELD 1056
313 // ER_WRONG_SUM_SELECT 1057
314 // ER_TOO_LONG_IDENT 1059
315 // ER_DUP_FIELDNAME 1060
316 // ER_DUP_KEYNAME 1061
317 // ER_DUP_ENTRY 1062
318 // ER_WRONG_FIELD_SPEC 1063
319 // ER_NONUNIQ_TABLE 1066
320 // ER_INVALID_DEFAULT 1067
321 // ER_MULTIPLE_PRI_KEY 1068
322 // ER_TOO_MANY_KEYS 1069
323 // ER_TOO_MANY_KEY_PARTS 1070
324 // ER_TOO_LONG_KEY 1071
325 // ER_KEY_COLUMN_DOES_NOT_EXIST 1072
326 // ER_BLOB_USED_AS_KEY 1073
327 // ER_TOO_BIG_FIELDLENGTH 1074
328 // ER_WRONG_AUTO_KEY 1075
329 // ER_NO_SUCH_INDEX 1082
330 // ER_WRONG_FIELD_TERMINATORS 1083
331 // ER_BLOBS_AND_NO_TERMINATED 1084
332 //
333 mysqlToSqlState.put(Constants.integerValueOf(1055), SQL_STATE_ILLEGAL_ARGUMENT);
334 mysqlToSqlState.put(Constants.integerValueOf(1056), SQL_STATE_ILLEGAL_ARGUMENT);
335 mysqlToSqlState.put(Constants.integerValueOf(1057), SQL_STATE_ILLEGAL_ARGUMENT);
336 mysqlToSqlState.put(Constants.integerValueOf(1059), SQL_STATE_ILLEGAL_ARGUMENT);
337 mysqlToSqlState.put(Constants.integerValueOf(1060), SQL_STATE_ILLEGAL_ARGUMENT);
338 mysqlToSqlState.put(Constants.integerValueOf(1061), SQL_STATE_ILLEGAL_ARGUMENT);
339 mysqlToSqlState.put(Constants.integerValueOf(1062), SQL_STATE_ILLEGAL_ARGUMENT);
340 mysqlToSqlState.put(Constants.integerValueOf(1063), SQL_STATE_ILLEGAL_ARGUMENT);
341 mysqlToSqlState.put(Constants.integerValueOf(1066), SQL_STATE_ILLEGAL_ARGUMENT);
342 mysqlToSqlState.put(Constants.integerValueOf(1067), SQL_STATE_ILLEGAL_ARGUMENT);
343 mysqlToSqlState.put(Constants.integerValueOf(1068), SQL_STATE_ILLEGAL_ARGUMENT);
344 mysqlToSqlState.put(Constants.integerValueOf(1069), SQL_STATE_ILLEGAL_ARGUMENT);
345 mysqlToSqlState.put(Constants.integerValueOf(1070), SQL_STATE_ILLEGAL_ARGUMENT);
346 mysqlToSqlState.put(Constants.integerValueOf(1071), SQL_STATE_ILLEGAL_ARGUMENT);
347 mysqlToSqlState.put(Constants.integerValueOf(1072), SQL_STATE_ILLEGAL_ARGUMENT);
348 mysqlToSqlState.put(Constants.integerValueOf(1073), SQL_STATE_ILLEGAL_ARGUMENT);
349 mysqlToSqlState.put(Constants.integerValueOf(1074), SQL_STATE_ILLEGAL_ARGUMENT);
350 mysqlToSqlState.put(Constants.integerValueOf(1075), SQL_STATE_ILLEGAL_ARGUMENT);
351 mysqlToSqlState.put(Constants.integerValueOf(1082), SQL_STATE_ILLEGAL_ARGUMENT);
352 mysqlToSqlState.put(Constants.integerValueOf(1083), SQL_STATE_ILLEGAL_ARGUMENT);
353 mysqlToSqlState.put(Constants.integerValueOf(1084), SQL_STATE_ILLEGAL_ARGUMENT);
354
355 //
356 // ER_WRONG_VALUE_COUNT 1058
357 //
358 mysqlToSqlState.put(Constants.integerValueOf(1058),
359 SQL_STATE_INSERT_VALUE_LIST_NO_MATCH_COL_LIST);
360
361 // ER_CANT_CREATE_DB 1006
362 // ER_DB_CREATE_EXISTS 1007
363 // ER_DB_DROP_EXISTS 1008
364 // ER_DB_DROP_DELETE 1009
365 // ER_DB_DROP_RMDIR 1010
366 // ER_CANT_DELETE_FILE 1011
367 // ER_CANT_FIND_SYSTEM_REC 1012
368 // ER_CANT_GET_STAT 1013
369 // ER_CANT_GET_WD 1014
370 // ER_UNEXPECTED_EOF 1039
371 // ER_CANT_OPEN_FILE 1016
372 // ER_FILE_NOT_FOUND 1017
373 // ER_CANT_READ_DIR 1018
374 // ER_CANT_SET_WD 1019
375 // ER_CHECKREAD 1020
376 // ER_DUP_KEY 1022
377 // ER_ERROR_ON_CLOSE 1023
378 // ER_ERROR_ON_READ 1024
379 // ER_ERROR_ON_RENAME 1025
380 // ER_ERROR_ON_WRITE 1026
381 // ER_FILE_USED 1027
382 // ER_FILSORT_ABORT 1028
383 // ER_FORM_NOT_FOUND 1029
384 // ER_GET_ERRNO 1030
385 // ER_ILLEGAL_HA 1031
386 // ER_KEY_NOT_FOUND 1032
387 // ER_NOT_FORM_FILE 1033
388 // ER_DBACCESS_DENIED_ERROR 1044
389 // ER_NO_DB_ERROR 1046
390 // ER_BAD_NULL_ERROR 1048
391 // ER_BAD_DB_ERROR 1049
392 // ER_TABLE_EXISTS_ERROR 1050
393 // ER_BAD_TABLE_ERROR 1051
394 mysqlToSqlState.put(Constants.integerValueOf(1051),
395 SQL_STATE_BASE_TABLE_OR_VIEW_NOT_FOUND);
396
397 // ER_NON_UNIQ_ERROR 1052
398 // ER_BAD_FIELD_ERROR 1054
399 mysqlToSqlState.put(Constants.integerValueOf(1054), SQL_STATE_COLUMN_NOT_FOUND);
400
401 // ER_TEXTFILE_NOT_READABLE 1085
402 // ER_FILE_EXISTS_ERROR 1086
403 // ER_LOAD_INFO 1087
404 // ER_ALTER_INFO 1088
405 // ER_WRONG_SUB_KEY 1089
406 // ER_CANT_REMOVE_ALL_FIELDS 1090
407 // ER_CANT_DROP_FIELD_OR_KEY 1091
408 // ER_INSERT_INFO 1092
409 // ER_INSERT_TABLE_USED 1093
410 // ER_LOCK_DEADLOCK 1213
411 mysqlToSqlState.put(Constants.integerValueOf(1205), SQL_STATE_DEADLOCK);
412 mysqlToSqlState.put(Constants.integerValueOf(1213), SQL_STATE_DEADLOCK);
413
414 mysqlToSql99State = new HashMap();
415
416 mysqlToSql99State.put(Constants.integerValueOf(1205), SQL_STATE_DEADLOCK);
417 mysqlToSql99State.put(Constants.integerValueOf(1213), SQL_STATE_DEADLOCK);
418 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_DUP_KEY),
419 "23000");
420 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_OUTOFMEMORY),
421 "HY001");
422 mysqlToSql99State.put(Constants.integerValueOf(
423 MysqlErrorNumbers.ER_OUT_OF_SORTMEMORY), "HY001");
424 mysqlToSql99State.put(
425 Constants.integerValueOf(MysqlErrorNumbers.ER_CON_COUNT_ERROR), "08004");
426 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_BAD_HOST_ERROR),
427 "08S01");
428 mysqlToSql99State.put(
429 Constants.integerValueOf(MysqlErrorNumbers.ER_HANDSHAKE_ERROR), "08S01");
430 mysqlToSql99State.put(Constants.integerValueOf(
431 MysqlErrorNumbers.ER_DBACCESS_DENIED_ERROR), "42000");
432 mysqlToSql99State.put(Constants.integerValueOf(
433 MysqlErrorNumbers.ER_ACCESS_DENIED_ERROR), "28000");
434 mysqlToSql99State.put(Constants.integerValueOf(
435 MysqlErrorNumbers.ER_TABLE_EXISTS_ERROR), "42S01");
436 mysqlToSql99State.put(
437 Constants.integerValueOf(MysqlErrorNumbers.ER_BAD_TABLE_ERROR), "42S02");
438 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_NON_UNIQ_ERROR),
439 "23000");
440 mysqlToSql99State.put(
441 Constants.integerValueOf(MysqlErrorNumbers.ER_SERVER_SHUTDOWN), "08S01");
442 mysqlToSql99State.put(
443 Constants.integerValueOf(MysqlErrorNumbers.ER_BAD_FIELD_ERROR), "42S22");
444 mysqlToSql99State.put(Constants.integerValueOf(
445 MysqlErrorNumbers.ER_WRONG_FIELD_WITH_GROUP), "42000");
446 mysqlToSql99State.put(Constants.integerValueOf(
447 MysqlErrorNumbers.ER_WRONG_GROUP_FIELD), "42000");
448 mysqlToSql99State.put(
449 Constants.integerValueOf(MysqlErrorNumbers.ER_WRONG_SUM_SELECT), "42000");
450 mysqlToSql99State.put(Constants.integerValueOf(
451 MysqlErrorNumbers.ER_WRONG_VALUE_COUNT), "21S01");
452 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_TOO_LONG_IDENT),
453 "42000");
454 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_DUP_FIELDNAME),
455 "42S21");
456 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_DUP_KEYNAME),
457 "42000");
458 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_DUP_ENTRY),
459 "23000");
460 mysqlToSql99State.put(
461 Constants.integerValueOf(MysqlErrorNumbers.ER_WRONG_FIELD_SPEC), "42000");
462 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_PARSE_ERROR),
463 "42000");
464 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_EMPTY_QUERY),
465 "42000");
466 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_NONUNIQ_TABLE),
467 "42000");
468 mysqlToSql99State.put(
469 Constants.integerValueOf(MysqlErrorNumbers.ER_INVALID_DEFAULT), "42000");
470 mysqlToSql99State.put(
471 Constants.integerValueOf(MysqlErrorNumbers.ER_MULTIPLE_PRI_KEY), "42000");
472 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_TOO_MANY_KEYS),
473 "42000");
474 mysqlToSql99State.put(Constants.integerValueOf(
475 MysqlErrorNumbers.ER_TOO_MANY_KEY_PARTS), "42000");
476 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_TOO_LONG_KEY),
477 "42000");
478 mysqlToSql99State.put(Constants.integerValueOf(
479 MysqlErrorNumbers.ER_KEY_COLUMN_DOES_NOT_EXITS), "42000");
480 mysqlToSql99State.put(
481 Constants.integerValueOf(MysqlErrorNumbers.ER_BLOB_USED_AS_KEY), "42000");
482 mysqlToSql99State.put(Constants.integerValueOf(
483 MysqlErrorNumbers.ER_TOO_BIG_FIELDLENGTH), "42000");
484 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_WRONG_AUTO_KEY),
485 "42000");
486 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_FORCING_CLOSE),
487 "08S01");
488 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_IPSOCK_ERROR),
489 "08S01");
490 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_NO_SUCH_INDEX),
491 "42S12");
492 mysqlToSql99State.put(Constants.integerValueOf(
493 MysqlErrorNumbers.ER_WRONG_FIELD_TERMINATORS), "42000");
494 mysqlToSql99State.put(Constants.integerValueOf(
495 MysqlErrorNumbers.ER_BLOBS_AND_NO_TERMINATED), "42000");
496 mysqlToSql99State.put(Constants.integerValueOf(
497 MysqlErrorNumbers.ER_CANT_REMOVE_ALL_FIELDS), "42000");
498 mysqlToSql99State.put(Constants.integerValueOf(
499 MysqlErrorNumbers.ER_CANT_DROP_FIELD_OR_KEY), "42000");
500 mysqlToSql99State.put(Constants.integerValueOf(
501 MysqlErrorNumbers.ER_BLOB_CANT_HAVE_DEFAULT), "42000");
502 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_WRONG_DB_NAME),
503 "42000");
504 mysqlToSql99State.put(
505 Constants.integerValueOf(MysqlErrorNumbers.ER_WRONG_TABLE_NAME), "42000");
506 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_TOO_BIG_SELECT),
507 "42000");
508 mysqlToSql99State.put(Constants.integerValueOf(
509 MysqlErrorNumbers.ER_UNKNOWN_PROCEDURE), "42000");
510 mysqlToSql99State.put(Constants.integerValueOf(
511 MysqlErrorNumbers.ER_WRONG_PARAMCOUNT_TO_PROCEDURE), "42000");
512 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_UNKNOWN_TABLE),
513 "42S02");
514 mysqlToSql99State.put(Constants.integerValueOf(
515 MysqlErrorNumbers.ER_FIELD_SPECIFIED_TWICE), "42000");
516 mysqlToSql99State.put(Constants.integerValueOf(
517 MysqlErrorNumbers.ER_UNSUPPORTED_EXTENSION), "42000");
518 mysqlToSql99State.put(Constants.integerValueOf(
519 MysqlErrorNumbers.ER_TABLE_MUST_HAVE_COLUMNS), "42000");
520 mysqlToSql99State.put(Constants.integerValueOf(
521 MysqlErrorNumbers.ER_UNKNOWN_CHARACTER_SET), "42000");
522 mysqlToSql99State.put(
523 Constants.integerValueOf(MysqlErrorNumbers.ER_TOO_BIG_ROWSIZE), "42000");
524 mysqlToSql99State.put(
525 Constants.integerValueOf(MysqlErrorNumbers.ER_WRONG_OUTER_JOIN), "42000");
526 mysqlToSql99State.put(Constants.integerValueOf(
527 MysqlErrorNumbers.ER_NULL_COLUMN_IN_INDEX), "42000");
528 mysqlToSql99State.put(Constants.integerValueOf(
529 MysqlErrorNumbers.ER_PASSWORD_ANONYMOUS_USER), "42000");
530 mysqlToSql99State.put(Constants.integerValueOf(
531 MysqlErrorNumbers.ER_PASSWORD_NOT_ALLOWED), "42000");
532 mysqlToSql99State.put(Constants.integerValueOf(
533 MysqlErrorNumbers.ER_PASSWORD_NO_MATCH), "42000");
534 mysqlToSql99State.put(Constants.integerValueOf(
535 MysqlErrorNumbers.ER_WRONG_VALUE_COUNT_ON_ROW), "21S01");
536 mysqlToSql99State.put(Constants.integerValueOf(
537 MysqlErrorNumbers.ER_INVALID_USE_OF_NULL), "42000");
538 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_REGEXP_ERROR),
539 "42000");
540 mysqlToSql99State.put(Constants.integerValueOf(
541 MysqlErrorNumbers.ER_MIX_OF_GROUP_FUNC_AND_FIELDS), "42000");
542 mysqlToSql99State.put(Constants.integerValueOf(
543 MysqlErrorNumbers.ER_NONEXISTING_GRANT), "42000");
544 mysqlToSql99State.put(Constants.integerValueOf(
545 MysqlErrorNumbers.ER_TABLEACCESS_DENIED_ERROR), "42000");
546 mysqlToSql99State.put(Constants.integerValueOf(
547 MysqlErrorNumbers.ER_COLUMNACCESS_DENIED_ERROR), "42000");
548 mysqlToSql99State.put(Constants.integerValueOf(
549 MysqlErrorNumbers.ER_ILLEGAL_GRANT_FOR_TABLE), "42000");
550 mysqlToSql99State.put(Constants.integerValueOf(
551 MysqlErrorNumbers.ER_GRANT_WRONG_HOST_OR_USER), "42000");
552 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_NO_SUCH_TABLE),
553 "42S02");
554 mysqlToSql99State.put(Constants.integerValueOf(
555 MysqlErrorNumbers.ER_NONEXISTING_TABLE_GRANT), "42000");
556 mysqlToSql99State.put(Constants.integerValueOf(
557 MysqlErrorNumbers.ER_NOT_ALLOWED_COMMAND), "42000");
558 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_SYNTAX_ERROR),
559 "42000");
560 mysqlToSql99State.put(Constants.integerValueOf(
561 MysqlErrorNumbers.ER_ABORTING_CONNECTION), "08S01");
562 mysqlToSql99State.put(Constants.integerValueOf(
563 MysqlErrorNumbers.ER_NET_PACKET_TOO_LARGE), "08S01");
564 mysqlToSql99State.put(Constants.integerValueOf(
565 MysqlErrorNumbers.ER_NET_READ_ERROR_FROM_PIPE), "08S01");
566 mysqlToSql99State.put(
567 Constants.integerValueOf(MysqlErrorNumbers.ER_NET_FCNTL_ERROR), "08S01");
568 mysqlToSql99State.put(Constants.integerValueOf(
569 MysqlErrorNumbers.ER_NET_PACKETS_OUT_OF_ORDER), "08S01");
570 mysqlToSql99State.put(Constants.integerValueOf(
571 MysqlErrorNumbers.ER_NET_UNCOMPRESS_ERROR), "08S01");
572 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_NET_READ_ERROR),
573 "08S01");
574 mysqlToSql99State.put(Constants.integerValueOf(
575 MysqlErrorNumbers.ER_NET_READ_INTERRUPTED), "08S01");
576 mysqlToSql99State.put(Constants.integerValueOf(
577 MysqlErrorNumbers.ER_NET_ERROR_ON_WRITE), "08S01");
578 mysqlToSql99State.put(Constants.integerValueOf(
579 MysqlErrorNumbers.ER_NET_WRITE_INTERRUPTED), "08S01");
580 mysqlToSql99State.put(
581 Constants.integerValueOf(MysqlErrorNumbers.ER_TOO_LONG_STRING), "42000");
582 mysqlToSql99State.put(Constants.integerValueOf(
583 MysqlErrorNumbers.ER_TABLE_CANT_HANDLE_BLOB), "42000");
584 mysqlToSql99State
585 .put(Constants.integerValueOf(
586 MysqlErrorNumbers.ER_TABLE_CANT_HANDLE_AUTO_INCREMENT),
587 "42000");
588 mysqlToSql99State.put(Constants.integerValueOf(
589 MysqlErrorNumbers.ER_WRONG_COLUMN_NAME), "42000");
590 mysqlToSql99State.put(
591 Constants.integerValueOf(MysqlErrorNumbers.ER_WRONG_KEY_COLUMN), "42000");
592 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_DUP_UNIQUE),
593 "23000");
594 mysqlToSql99State.put(Constants.integerValueOf(
595 MysqlErrorNumbers.ER_BLOB_KEY_WITHOUT_LENGTH), "42000");
596 mysqlToSql99State.put(Constants.integerValueOf(
597 MysqlErrorNumbers.ER_PRIMARY_CANT_HAVE_NULL), "42000");
598 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_TOO_MANY_ROWS),
599 "42000");
600 mysqlToSql99State.put(Constants.integerValueOf(
601 MysqlErrorNumbers.ER_REQUIRES_PRIMARY_KEY), "42000");
602 mysqlToSql99State.put(Constants.integerValueOf(
603 MysqlErrorNumbers.ER_CHECK_NO_SUCH_TABLE), "42000");
604 mysqlToSql99State.put(Constants.integerValueOf(
605 MysqlErrorNumbers.ER_CHECK_NOT_IMPLEMENTED), "42000");
606 mysqlToSql99State.put(Constants.integerValueOf(
607 MysqlErrorNumbers.ER_CANT_DO_THIS_DURING_AN_TRANSACTION),
608 "25000");
609 mysqlToSql99State.put(Constants.integerValueOf(
610 MysqlErrorNumbers.ER_NEW_ABORTING_CONNECTION), "08S01");
611 mysqlToSql99State.put(
612 Constants.integerValueOf(MysqlErrorNumbers.ER_MASTER_NET_READ), "08S01");
613 mysqlToSql99State.put(
614 Constants.integerValueOf(MysqlErrorNumbers.ER_MASTER_NET_WRITE), "08S01");
615 mysqlToSql99State.put(Constants.integerValueOf(
616 MysqlErrorNumbers.ER_TOO_MANY_USER_CONNECTIONS), "42000");
617 mysqlToSql99State.put(Constants.integerValueOf(
618 MysqlErrorNumbers.ER_READ_ONLY_TRANSACTION), "25000");
619 mysqlToSql99State.put(Constants.integerValueOf(
620 MysqlErrorNumbers.ER_NO_PERMISSION_TO_CREATE_USER), "42000");
621 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_LOCK_DEADLOCK),
622 "40001");
623 mysqlToSql99State.put(Constants.integerValueOf(
624 MysqlErrorNumbers.ER_NO_REFERENCED_ROW), "23000");
625 mysqlToSql99State.put(Constants.integerValueOf(
626 MysqlErrorNumbers.ER_ROW_IS_REFERENCED), "23000");
627 mysqlToSql99State.put(Constants.integerValueOf(
628 MysqlErrorNumbers.ER_CONNECT_TO_MASTER), "08S01");
629 mysqlToSql99State.put(Constants.integerValueOf(
630 MysqlErrorNumbers.ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT),
631 "21000");
632 mysqlToSql99State.put(Constants.integerValueOf(
633 MysqlErrorNumbers.ER_USER_LIMIT_REACHED), "42000");
634 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_NO_DEFAULT),
635 "42000");
636 mysqlToSql99State.put(Constants.integerValueOf(
637 MysqlErrorNumbers.ER_WRONG_VALUE_FOR_VAR), "42000");
638 mysqlToSql99State.put(Constants.integerValueOf(
639 MysqlErrorNumbers.ER_WRONG_TYPE_FOR_VAR), "42000");
640 mysqlToSql99State.put(Constants.integerValueOf(
641 MysqlErrorNumbers.ER_CANT_USE_OPTION_HERE), "42000");
642 mysqlToSql99State.put(Constants.integerValueOf(
643 MysqlErrorNumbers.ER_NOT_SUPPORTED_YET), "42000");
644 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_WRONG_FK_DEF),
645 "42000");
646 mysqlToSql99State.put(
647 Constants.integerValueOf(MysqlErrorNumbers.ER_OPERAND_COLUMNS), "21000");
648 mysqlToSql99State.put(Constants.integerValueOf(
649 MysqlErrorNumbers.ER_SUBQUERY_NO_1_ROW), "21000");
650 mysqlToSql99State.put(Constants.integerValueOf(
651 MysqlErrorNumbers.ER_ILLEGAL_REFERENCE), "42S22");
652 mysqlToSql99State.put(Constants.integerValueOf(
653 MysqlErrorNumbers.ER_DERIVED_MUST_HAVE_ALIAS), "42000");
654 mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_SELECT_REDUCED),
655 "01000");
656 mysqlToSql99State.put(Constants.integerValueOf(
657 MysqlErrorNumbers.ER_TABLENAME_NOT_ALLOWED_HERE), "42000");
658 mysqlToSql99State.put(Constants.integerValueOf(
659 MysqlErrorNumbers.ER_NOT_SUPPORTED_AUTH_MODE), "08004");
660 mysqlToSql99State.put(Constants.integerValueOf(
661 MysqlErrorNumbers.ER_SPATIAL_CANT_HAVE_NULL), "42000");
662 mysqlToSql99State.put(Constants.integerValueOf(
663 MysqlErrorNumbers.ER_COLLATION_CHARSET_MISMATCH), "42000");
664 mysqlToSql99State.put(Constants.integerValueOf(
665 MysqlErrorNumbers.ER_WARN_TOO_FEW_RECORDS), "01000");
666 mysqlToSql99State.put(Constants.integerValueOf(
667 MysqlErrorNumbers.ER_WARN_TOO_MANY_RECORDS), "01000");
668 mysqlToSql99State.put(Constants.integerValueOf(
669 MysqlErrorNumbers.ER_WARN_NULL_TO_NOTNULL), "01000");
670 mysqlToSql99State.put(Constants.integerValueOf(
671 MysqlErrorNumbers.ER_WARN_DATA_OUT_OF_RANGE), "01000");
672 mysqlToSql99State.put(Constants.integerValueOf(
673 MysqlErrorNumbers.ER_WARN_DATA_TRUNCATED), "01000");
674 mysqlToSql99State.put(Constants.integerValueOf(
675 MysqlErrorNumbers.ER_WRONG_NAME_FOR_INDEX), "42000");
676 mysqlToSql99State.put(Constants.integerValueOf(
677 MysqlErrorNumbers.ER_WRONG_NAME_FOR_CATALOG), "42000");
678 mysqlToSql99State.put(Constants.integerValueOf(
679 MysqlErrorNumbers.ER_UNKNOWN_STORAGE_ENGINE), "42000");
680 }
681
682 /**
683 * Turns output of 'SHOW WARNINGS' into JDBC SQLWarning instances.
684 *
685 * If 'forTruncationOnly' is true, only looks for truncation warnings, and
686 * actually throws DataTruncation as an exception.
687 *
688 * @param connection
689 * the connection to use for getting warnings.
690 *
691 * @return the SQLWarning chain (or null if no warnings)
692 *
693 * @throws SQLException
694 * if the warnings could not be retrieved
695 */
696 static SQLWarning convertShowWarningsToSQLWarnings(Connection connection)
697 throws SQLException {
698 return convertShowWarningsToSQLWarnings(connection, 0, false);
699 }
700
701 /**
702 * Turns output of 'SHOW WARNINGS' into JDBC SQLWarning instances.
703 *
704 * If 'forTruncationOnly' is true, only looks for truncation warnings, and
705 * actually throws DataTruncation as an exception.
706 *
707 * @param connection
708 * the connection to use for getting warnings.
709 * @param warningCountIfKnown
710 * the warning count (if known), otherwise set it to 0.
711 * @param forTruncationOnly
712 * if this method should only scan for data truncation warnings
713 *
714 * @return the SQLWarning chain (or null if no warnings)
715 *
716 * @throws SQLException
717 * if the warnings could not be retrieved, or if data truncation
718 * is being scanned for and truncations were found.
719 */
720 static SQLWarning convertShowWarningsToSQLWarnings(Connection connection,
721 int warningCountIfKnown, boolean forTruncationOnly)
722 throws SQLException {
723 java.sql.Statement stmt = null;
724 java.sql.ResultSet warnRs = null;
725
726 SQLWarning currentWarning = null;
727
728 try {
729 if (warningCountIfKnown < 100) {
730 stmt = connection.createStatement();
731
732 if (stmt.getMaxRows() != 0) {
733 stmt.setMaxRows(0);
734 }
735 } else {
736 // stream large warning counts
737 stmt = connection.createStatement(
738 java.sql.ResultSet.TYPE_FORWARD_ONLY,
739 java.sql.ResultSet.CONCUR_READ_ONLY);
740 stmt.setFetchSize(Integer.MIN_VALUE);
741 }
742
743 /*
744 * +---------+------+---------------------------------------------+ |
745 * Level | Code | Message |
746 * +---------+------+---------------------------------------------+ |
747 * Warning | 1265 | Data truncated for column 'field1' at row 1 |
748 * +---------+------+---------------------------------------------+
749 */
750 warnRs = stmt.executeQuery("SHOW WARNINGS"); //$NON-NLS-1$
751
752 while (warnRs.next()) {
753 int code = warnRs.getInt("Code"); //$NON-NLS-1$
754
755 if (forTruncationOnly) {
756 if (code == 1265 || code == 1264) {
757 DataTruncation newTruncation = new MysqlDataTruncation(
758 warnRs.getString("Message"), 0, false, false, 0, 0, code); //$NON-NLS-1$
759
760 if (currentWarning == null) {
761 currentWarning = newTruncation;
762 } else {
763 currentWarning.setNextWarning(newTruncation);
764 }
765 }
766 } else {
767 String level = warnRs.getString("Level"); //$NON-NLS-1$
768 String message = warnRs.getString("Message"); //$NON-NLS-1$
769
770 SQLWarning newWarning = new SQLWarning(message, SQLError
771 .mysqlToSqlState(code, connection
772 .getUseSqlStateCodes()), code);
773
774 if (currentWarning == null) {
775 currentWarning = newWarning;
776 } else {
777 currentWarning.setNextWarning(newWarning);
778 }
779 }
780 }
781
782 if (forTruncationOnly && (currentWarning != null)) {
783 throw currentWarning;
784 }
785
786 return currentWarning;
787 } finally {
788 SQLException reThrow = null;
789
790 if (warnRs != null) {
791 try {
792 warnRs.close();
793 } catch (SQLException sqlEx) {
794 reThrow = sqlEx;
795 }
796 }
797
798 if (stmt != null) {
799 try {
800 stmt.close();
801 } catch (SQLException sqlEx) {
802 // ideally, we'd use chained exceptions here,
803 // but we still support JDK-1.2.x with this driver
804 // which doesn't have them....
805 reThrow = sqlEx;
806 }
807 }
808
809 if (reThrow != null) {
810 throw reThrow;
811 }
812 }
813 }
814
815 public static void dumpSqlStatesMappingsAsXml() throws Exception {
816 TreeMap allErrorNumbers = new TreeMap();
817 Map mysqlErrorNumbersToNames = new HashMap();
818
819 Integer errorNumber = null;
820
821 //
822 // First create a list of all 'known' error numbers that
823 // are mapped.
824 //
825 for (Iterator mysqlErrorNumbers = mysqlToSql99State.keySet().iterator(); mysqlErrorNumbers
826 .hasNext();) {
827 errorNumber = (Integer) mysqlErrorNumbers.next();
828 allErrorNumbers.put(errorNumber, errorNumber);
829 }
830
831 for (Iterator mysqlErrorNumbers = mysqlToSqlState.keySet().iterator(); mysqlErrorNumbers
832 .hasNext();) {
833 errorNumber = (Integer) mysqlErrorNumbers.next();
834 allErrorNumbers.put(errorNumber, errorNumber);
835 }
836
837 //
838 // Now create a list of the actual MySQL error numbers we know about
839 //
840 java.lang.reflect.Field[] possibleFields = MysqlErrorNumbers.class
841 .getDeclaredFields();
842
843 for (int i = 0; i < possibleFields.length; i++) {
844 String fieldName = possibleFields[i].getName();
845
846 if (fieldName.startsWith("ER_")) {
847 mysqlErrorNumbersToNames.put(possibleFields[i].get(null),
848 fieldName);
849 }
850 }
851
852 System.out.println("<ErrorMappings>");
853
854 for (Iterator allErrorNumbersIter = allErrorNumbers.keySet().iterator(); allErrorNumbersIter
855 .hasNext();) {
856 errorNumber = (Integer) allErrorNumbersIter.next();
857
858 String sql92State = mysqlToSql99(errorNumber.intValue());
859 String oldSqlState = mysqlToXOpen(errorNumber.intValue());
860
861 System.out.println(" <ErrorMapping mysqlErrorNumber=\""
862 + errorNumber + "\" mysqlErrorName=\""
863 + mysqlErrorNumbersToNames.get(errorNumber)
864 + "\" legacySqlState=\""
865 + ((oldSqlState == null) ? "" : oldSqlState)
866 + "\" sql92SqlState=\""
867 + ((sql92State == null) ? "" : sql92State) + "\"/>");
868 }
869
870 System.out.println("</ErrorMappings>");
871 }
872
873 static String get(String stateCode) {
874 return (String) sqlStateMessages.get(stateCode);
875 }
876
877 private static String mysqlToSql99(int errno) {
878 Integer err = Constants.integerValueOf(errno);
879
880 if (mysqlToSql99State.containsKey(err)) {
881 return (String) mysqlToSql99State.get(err);
882 }
883
884 return "HY000";
885 }
886
887 /**
888 * Map MySQL error codes to X/Open or SQL-92 error codes
889 *
890 * @param errno
891 * the MySQL error code
892 *
893 * @return the corresponding X/Open or SQL-92 error code
894 */
895 static String mysqlToSqlState(int errno, boolean useSql92States) {
896 if (useSql92States) {
897 return mysqlToSql99(errno);
898 }
899
900 return mysqlToXOpen(errno);
901 }
902
903 private static String mysqlToXOpen(int errno) {
904 Integer err = Constants.integerValueOf(errno);
905
906 if (mysqlToSqlState.containsKey(err)) {
907 return (String) mysqlToSqlState.get(err);
908 }
909
910 return SQL_STATE_GENERAL_ERROR;
911 }
912
913 /*
914 * SQL State Class SQLNonTransientException Subclass 08
915 * SQLNonTransientConnectionException 22 SQLDataException 23
916 * SQLIntegrityConstraintViolationException N/A
917 * SQLInvalidAuthorizationException 42 SQLSyntaxErrorException
918 *
919 * SQL State Class SQLTransientException Subclass 08
920 * SQLTransientConnectionException 40 SQLTransactionRollbackException N/A
921 * SQLTimeoutException
922 */
923
924 public static SQLException createSQLException(String message,
925 String sqlState, ExceptionInterceptor interceptor) {
926 return createSQLException(message, sqlState, 0, interceptor);
927 }
928
929 public static SQLException createSQLException(String message, ExceptionInterceptor interceptor) {
930 return createSQLException(message, interceptor, null);
931 }
932 public static SQLException createSQLException(String message, ExceptionInterceptor interceptor, Connection conn) {
933 SQLException sqlEx = new SQLException(message);
934
935 if (interceptor != null) {
936 SQLException interceptedEx = interceptor.interceptException(sqlEx, conn);
937
938 if (interceptedEx != null) {
939 return interceptedEx;
940 }
941 }
942
943 return sqlEx;
944 }
945
946 public static SQLException createSQLException(String message, String sqlState, Throwable cause, ExceptionInterceptor interceptor) {
947 return createSQLException(message, sqlState, cause, interceptor, null);
948 }
949 public static SQLException createSQLException(String message, String sqlState, Throwable cause, ExceptionInterceptor interceptor,
950 Connection conn) {
951 if (THROWABLE_INIT_CAUSE_METHOD == null) {
952 if (cause != null) {
953 message = message + " due to " + cause.toString();
954 }
955 }
956
957 SQLException sqlEx = createSQLException(message, sqlState, interceptor);
958
959 if (cause != null && THROWABLE_INIT_CAUSE_METHOD != null) {
960 try {
961 THROWABLE_INIT_CAUSE_METHOD.invoke(sqlEx, new Object[] {cause});
962 } catch (Throwable t) {
963 // we're not going to muck with that here, since it's
964 // an error condition anyway!
965 }
966 }
967
968 if (interceptor != null) {
969 SQLException interceptedEx = interceptor.interceptException(sqlEx, conn);
970
971 if (interceptedEx != null) {
972 return interceptedEx;
973 }
974 }
975
976 return sqlEx;
977 }
978
979 public static SQLException createSQLException(String message,
980 String sqlState, int vendorErrorCode, ExceptionInterceptor interceptor) {
981 return createSQLException(message, sqlState, vendorErrorCode, false, interceptor);
982 }
983
984 public static SQLException createSQLException(String message,
985 String sqlState, int vendorErrorCode, boolean isTransient, ExceptionInterceptor interceptor) {
986 return createSQLException(message, sqlState, vendorErrorCode, false, interceptor, null);
987 }
988 public static SQLException createSQLException(String message,
989 String sqlState, int vendorErrorCode, boolean isTransient, ExceptionInterceptor interceptor, Connection conn) {
990 try {
991 SQLException sqlEx = null;
992
993 if (sqlState != null) {
994 if (sqlState.startsWith("08")) {
995 if (isTransient) {
996 if (!Util.isJdbc4()) {
997 sqlEx = new MySQLTransientConnectionException(
998 message, sqlState, vendorErrorCode);
999 } else {
1000 sqlEx = (SQLException) Util
1001 .getInstance(
1002 "com.mysql.jdbc.exceptions.jdbc4.MySQLTransientConnectionException",
1003 new Class[] { String.class,
1004 String.class, Integer.TYPE },
1005 new Object[] { message, sqlState,
1006 Constants.integerValueOf(vendorErrorCode) }, interceptor);
1007 }
1008 } else if (!Util.isJdbc4()) {
1009 sqlEx = new MySQLNonTransientConnectionException(
1010 message, sqlState, vendorErrorCode);
1011 } else {
1012 sqlEx = (SQLException) Util.getInstance(
1013 "com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException",
1014 new Class[] { String.class, String.class,
1015 Integer.TYPE }, new Object[] {
1016 message, sqlState,
1017 Constants.integerValueOf(vendorErrorCode) }, interceptor);
1018 }
1019 } else if (sqlState.startsWith("22")) {
1020 if (!Util.isJdbc4()) {
1021 sqlEx = new MySQLDataException(message, sqlState,
1022 vendorErrorCode);
1023 } else {
1024 sqlEx = (SQLException) Util
1025 .getInstance(
1026 "com.mysql.jdbc.exceptions.jdbc4.MySQLDataException",
1027 new Class[] { String.class, String.class,
1028 Integer.TYPE }, new Object[] {
1029 message, sqlState,
1030 Constants.integerValueOf(vendorErrorCode) }, interceptor);
1031 }
1032 } else if (sqlState.startsWith("23")) {
1033
1034 if (!Util.isJdbc4()) {
1035 sqlEx = new MySQLIntegrityConstraintViolationException(
1036 message, sqlState, vendorErrorCode);
1037 } else {
1038 sqlEx = (SQLException) Util
1039 .getInstance(
1040 "com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException",
1041 new Class[] { String.class, String.class,
1042 Integer.TYPE }, new Object[] {
1043 message, sqlState,
1044 Constants.integerValueOf(vendorErrorCode) }, interceptor);
1045 }
1046 } else if (sqlState.startsWith("42")) {
1047 if (!Util.isJdbc4()) {
1048 sqlEx = new MySQLSyntaxErrorException(message, sqlState,
1049 vendorErrorCode);
1050 } else {
1051 sqlEx = (SQLException) Util.getInstance(
1052 "com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException",
1053 new Class[] { String.class, String.class,
1054 Integer.TYPE }, new Object[] {
1055 message, sqlState,
1056 Constants.integerValueOf(vendorErrorCode) }, interceptor);
1057 }
1058 } else if (sqlState.startsWith("40")) {
1059 if (!Util.isJdbc4()) {
1060 sqlEx = new MySQLTransactionRollbackException(message,
1061 sqlState, vendorErrorCode);
1062 } else {
1063 sqlEx = (SQLException) Util
1064 .getInstance(
1065 "com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException",
1066 new Class[] { String.class, String.class,
1067 Integer.TYPE }, new Object[] {
1068 message, sqlState,
1069 Constants.integerValueOf(vendorErrorCode) }, interceptor);
1070 }
1071 } else {
1072 sqlEx = new SQLException(message, sqlState, vendorErrorCode);
1073 }
1074 } else {
1075 sqlEx = new SQLException(message, sqlState, vendorErrorCode);
1076 }
1077
1078 if (interceptor != null) {
1079 SQLException interceptedEx = interceptor.interceptException(sqlEx, conn);
1080
1081 if (interceptedEx != null) {
1082 return interceptedEx;
1083 }
1084 }
1085
1086 if (sqlEx == null) {
1087 System.out.println("!");
1088 }
1089
1090 return sqlEx;
1091 } catch (SQLException sqlEx) {
1092 SQLException unexpectedEx = new SQLException(
1093 "Unable to create correct SQLException class instance, error class/codes may be incorrect. Reason: "
1094 + Util.stackTraceToString(sqlEx),
1095 SQL_STATE_GENERAL_ERROR);
1096
1097 if (interceptor != null) {
1098 SQLException interceptedEx = interceptor.interceptException(unexpectedEx, conn);
1099
1100 if (interceptedEx != null) {
1101 return interceptedEx;
1102 }
1103 }
1104
1105 return unexpectedEx;
1106 }
1107 }
1108
1109 public static SQLException createCommunicationsException(ConnectionImpl conn, long lastPacketSentTimeMs,
1110 long lastPacketReceivedTimeMs,
1111 Exception underlyingException, ExceptionInterceptor interceptor) {
1112 SQLException exToReturn = null;
1113
1114 if (!Util.isJdbc4()) {
1115 exToReturn = new CommunicationsException(conn, lastPacketSentTimeMs, lastPacketReceivedTimeMs, underlyingException);
1116 } else {
1117
1118 try {
1119 exToReturn = (SQLException) Util.handleNewInstance(JDBC_4_COMMUNICATIONS_EXCEPTION_CTOR, new Object[] {
1120 conn, Constants.longValueOf(lastPacketSentTimeMs), Constants.longValueOf(lastPacketReceivedTimeMs), underlyingException}, interceptor);
1121 } catch (SQLException sqlEx) {
1122 // We should _never_ get this, but let's not swallow it either
1123
1124 return sqlEx;
1125 }
1126 }
1127
1128 if (THROWABLE_INIT_CAUSE_METHOD != null && underlyingException != null) {
1129 try {
1130 THROWABLE_INIT_CAUSE_METHOD.invoke(exToReturn, new Object[] {underlyingException});
1131 } catch (Throwable t) {
1132 // we're not going to muck with that here, since it's
1133 // an error condition anyway!
1134 }
1135 }
1136
1137 if (interceptor != null) {
1138 SQLException interceptedEx = interceptor.interceptException(exToReturn, conn);
1139
1140 if (interceptedEx != null) {
1141 return interceptedEx;
1142 }
1143 }
1144
1145 return exToReturn;
1146 }
1147
1148 /**
1149 * Creates a communications link failure message to be used
1150 * in CommunicationsException that (hopefully) has some better
1151 * information and suggestions based on heuristics.
1152 *
1153 * @param conn
1154 * @param lastPacketSentTimeMs
1155 * @param underlyingException
1156 * @param streamingResultSetInPlay
1157 * @return
1158 */
1159 public static String createLinkFailureMessageBasedOnHeuristics(
1160 ConnectionImpl conn,
1161 long lastPacketSentTimeMs,
1162 long lastPacketReceivedTimeMs,
1163 Exception underlyingException,
1164 boolean streamingResultSetInPlay) {
1165 long serverTimeoutSeconds = 0;
1166 boolean isInteractiveClient = false;
1167
1168 if (conn != null) {
1169 isInteractiveClient = conn.getInteractiveClient();
1170
1171 String serverTimeoutSecondsStr = null;
1172
1173 if (isInteractiveClient) {
1174 serverTimeoutSecondsStr = conn
1175 .getServerVariable("interactive_timeout"); //$NON-NLS-1$
1176 } else {
1177 serverTimeoutSecondsStr = conn
1178 .getServerVariable("wait_timeout"); //$NON-NLS-1$
1179 }
1180
1181 if (serverTimeoutSecondsStr != null) {
1182 try {
1183 serverTimeoutSeconds = Long
1184 .parseLong(serverTimeoutSecondsStr);
1185 } catch (NumberFormatException nfe) {
1186 serverTimeoutSeconds = 0;
1187 }
1188 }
1189 }
1190
1191 StringBuffer exceptionMessageBuf = new StringBuffer();
1192
1193 if (lastPacketSentTimeMs == 0) {
1194 lastPacketSentTimeMs = System.currentTimeMillis();
1195 }
1196
1197 long timeSinceLastPacket = (System.currentTimeMillis() - lastPacketSentTimeMs) / 1000;
1198 long timeSinceLastPacketMs = (System.currentTimeMillis() - lastPacketSentTimeMs);
1199 long timeSinceLastPacketReceivedMs = (System.currentTimeMillis() - lastPacketReceivedTimeMs);
1200
1201 int dueToTimeout = DUE_TO_TIMEOUT_FALSE;
1202
1203 StringBuffer timeoutMessageBuf = null;
1204
1205 if (streamingResultSetInPlay) {
1206 exceptionMessageBuf.append(Messages
1207 .getString("CommunicationsException.ClientWasStreaming")); //$NON-NLS-1$
1208 } else {
1209 if (serverTimeoutSeconds != 0) {
1210 if (timeSinceLastPacket > serverTimeoutSeconds) {
1211 dueToTimeout = DUE_TO_TIMEOUT_TRUE;
1212
1213 timeoutMessageBuf = new StringBuffer();
1214
1215 timeoutMessageBuf.append(Messages
1216 .getString("CommunicationsException.2")); //$NON-NLS-1$
1217
1218 if (!isInteractiveClient) {
1219 timeoutMessageBuf.append(Messages
1220 .getString("CommunicationsException.3")); //$NON-NLS-1$
1221 } else {
1222 timeoutMessageBuf.append(Messages
1223 .getString("CommunicationsException.4")); //$NON-NLS-1$
1224 }
1225
1226 }
1227 } else if (timeSinceLastPacket > DEFAULT_WAIT_TIMEOUT_SECONDS) {
1228 dueToTimeout = DUE_TO_TIMEOUT_MAYBE;
1229
1230 timeoutMessageBuf = new StringBuffer();
1231
1232 timeoutMessageBuf.append(Messages
1233 .getString("CommunicationsException.5")); //$NON-NLS-1$
1234 timeoutMessageBuf.append(Messages
1235 .getString("CommunicationsException.6")); //$NON-NLS-1$
1236 timeoutMessageBuf.append(Messages
1237 .getString("CommunicationsException.7")); //$NON-NLS-1$
1238 timeoutMessageBuf.append(Messages
1239 .getString("CommunicationsException.8")); //$NON-NLS-1$
1240 }
1241
1242 if (dueToTimeout == DUE_TO_TIMEOUT_TRUE
1243 || dueToTimeout == DUE_TO_TIMEOUT_MAYBE) {
1244
1245 if (lastPacketReceivedTimeMs != 0) {
1246 Object[] timingInfo = {
1247 new Long(timeSinceLastPacketReceivedMs),
1248 new Long(timeSinceLastPacketMs)
1249 };
1250 exceptionMessageBuf.append(Messages
1251 .getString("CommunicationsException.ServerPacketTimingInfo", //$NON-NLS-1$
1252 timingInfo));
1253 } else {
1254 exceptionMessageBuf.append(Messages
1255 .getString("CommunicationsException.ServerPacketTimingInfoNoRecv", //$NON-NLS-1$
1256 new Object[] { new Long(timeSinceLastPacketMs)}));
1257 }
1258
1259 if (timeoutMessageBuf != null) {
1260 exceptionMessageBuf.append(timeoutMessageBuf);
1261 }
1262
1263 exceptionMessageBuf.append(Messages
1264 .getString("CommunicationsException.11")); //$NON-NLS-1$
1265 exceptionMessageBuf.append(Messages
1266 .getString("CommunicationsException.12")); //$NON-NLS-1$
1267 exceptionMessageBuf.append(Messages
1268 .getString("CommunicationsException.13")); //$NON-NLS-1$
1269
1270 } else {
1271 //
1272 // Attempt to determine the reason for the underlying exception
1273 // (we can only make a best-guess here)
1274 //
1275
1276 if (underlyingException instanceof BindException) {
1277 if (conn.getLocalSocketAddress() != null
1278 && !Util.interfaceExists(conn
1279 .getLocalSocketAddress())) {
1280 exceptionMessageBuf.append(Messages
1281 .getString("CommunicationsException.LocalSocketAddressNotAvailable")); //$NON-NLS-1$
1282 } else {
1283 // too many client connections???
1284 exceptionMessageBuf.append(Messages
1285 .getString("CommunicationsException.TooManyClientConnections")); //$NON-NLS-1$
1286 }
1287 }
1288 }
1289 }
1290
1291 if (exceptionMessageBuf.length() == 0) {
1292 // We haven't figured out a good reason, so copy it.
1293 exceptionMessageBuf.append(Messages
1294 .getString("CommunicationsException.20")); //$NON-NLS-1$
1295
1296 if (THROWABLE_INIT_CAUSE_METHOD == null &&
1297 underlyingException != null) {
1298 exceptionMessageBuf.append(Messages
1299 .getString("CommunicationsException.21")); //$NON-NLS-1$
1300 exceptionMessageBuf.append(Util
1301 .stackTraceToString(underlyingException));
1302 }
1303
1304 if (conn != null && conn.getMaintainTimeStats()
1305 && !conn.getParanoid()) {
1306 exceptionMessageBuf.append("\n\n"); //$NON-NLS-1$
1307 if (lastPacketReceivedTimeMs != 0) {
1308 Object[] timingInfo = {
1309 new Long(timeSinceLastPacketReceivedMs),
1310 new Long(timeSinceLastPacketMs)
1311 };
1312 exceptionMessageBuf.append(Messages
1313 .getString("CommunicationsException.ServerPacketTimingInfo", //$NON-NLS-1$
1314 timingInfo));
1315 } else {
1316 exceptionMessageBuf.append(Messages
1317 .getString("CommunicationsException.ServerPacketTimingInfoNoRecv", //$NON-NLS-1$
1318 new Object[] { new Long(timeSinceLastPacketMs)}));
1319 }
1320 }
1321 }
1322
1323 return exceptionMessageBuf.toString();
1324 }
1325
1326 public static SQLException notImplemented() {
1327 if (Util.isJdbc4()) {
1328 try {
1329 return (SQLException) Class.forName(
1330 "java.sql.SQLFeatureNotSupportedException")
1331 .newInstance();
1332 } catch (Throwable t) {
1333 // proceed
1334 }
1335 }
1336
1337 return new NotImplemented();
1338 }
1339 }