2
Copyright (C) 2002-2004 MySQL AB
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.
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.
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.
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
25
package com.mysql.jdbc;
27
import java.sql.DataTruncation;
28
import java.sql.SQLException;
29
import java.sql.SQLWarning;
31
import java.util.HashMap;
32
import java.util.Hashtable;
33
import java.util.Iterator;
35
import java.util.TreeMap;
37
import com.mysql.jdbc.exceptions.MySQLDataException;
38
import com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException;
39
import com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException;
40
import com.mysql.jdbc.exceptions.MySQLSyntaxErrorException;
41
import com.mysql.jdbc.exceptions.MySQLTransactionRollbackException;
44
* SQLError is a utility class that maps MySQL error codes to X/Open error codes
45
* as is required by the JDBC spec.
47
* @author Mark Matthews <mmatthew_at_worldserver.com>
50
public class SQLError {
51
static final int ER_WARNING_NOT_COMPLETE_ROLLBACK = 1196;
53
private static Map mysqlToSql99State;
55
private static Map mysqlToSqlState;
57
public static final String SQL_STATE_BASE_TABLE_NOT_FOUND = "S0002"; //$NON-NLS-1$
59
public static final String SQL_STATE_BASE_TABLE_OR_VIEW_ALREADY_EXISTS = "S0001"; //$NON-NLS-1$
61
public static final String SQL_STATE_BASE_TABLE_OR_VIEW_NOT_FOUND = "42S02"; //$NON-NLS-1$
63
public static final String SQL_STATE_COLUMN_ALREADY_EXISTS = "S0021"; //$NON-NLS-1$
65
public static final String SQL_STATE_COLUMN_NOT_FOUND = "S0022"; //$NON-NLS-1$
67
public static final String SQL_STATE_COMMUNICATION_LINK_FAILURE = "08S01"; //$NON-NLS-1$
69
public static final String SQL_STATE_CONNECTION_FAIL_DURING_TX = "08007"; //$NON-NLS-1$
71
public static final String SQL_STATE_CONNECTION_IN_USE = "08002"; //$NON-NLS-1$
73
public static final String SQL_STATE_CONNECTION_NOT_OPEN = "08003"; //$NON-NLS-1$
75
public static final String SQL_STATE_CONNECTION_REJECTED = "08004"; //$NON-NLS-1$
77
public static final String SQL_STATE_DATE_TRUNCATED = "01004"; //$NON-NLS-1$
79
public static final String SQL_STATE_DATETIME_FIELD_OVERFLOW = "22008"; //$NON-NLS-1$
81
public static final String SQL_STATE_DEADLOCK = "41000"; //$NON-NLS-1$
83
public static final String SQL_STATE_DISCONNECT_ERROR = "01002"; //$NON-NLS-1$
85
public static final String SQL_STATE_DIVISION_BY_ZERO = "22012"; //$NON-NLS-1$
87
public static final String SQL_STATE_DRIVER_NOT_CAPABLE = "S1C00"; //$NON-NLS-1$
89
public static final String SQL_STATE_ERROR_IN_ROW = "01S01"; //$NON-NLS-1$
91
public static final String SQL_STATE_GENERAL_ERROR = "S1000"; //$NON-NLS-1$
93
public static final String SQL_STATE_ILLEGAL_ARGUMENT = "S1009"; //$NON-NLS-1$
95
public static final String SQL_STATE_INDEX_ALREADY_EXISTS = "S0011"; //$NON-NLS-1$
97
public static final String SQL_STATE_INDEX_NOT_FOUND = "S0012"; //$NON-NLS-1$
99
public static final String SQL_STATE_INSERT_VALUE_LIST_NO_MATCH_COL_LIST = "21S01"; //$NON-NLS-1$
101
public static final String SQL_STATE_INVALID_AUTH_SPEC = "28000"; //$NON-NLS-1$
103
public static final String SQL_STATE_INVALID_CHARACTER_VALUE_FOR_CAST = "22018"; // $NON_NLS-1$
105
public static final String SQL_STATE_INVALID_COLUMN_NUMBER = "S1002"; //$NON-NLS-1$
107
public static final String SQL_STATE_INVALID_CONNECTION_ATTRIBUTE = "01S00"; //$NON-NLS-1$
109
public static final String SQL_STATE_MEMORY_ALLOCATION_FAILURE = "S1001"; //$NON-NLS-1$
111
public static final String SQL_STATE_MORE_THAN_ONE_ROW_UPDATED_OR_DELETED = "01S04"; //$NON-NLS-1$
113
public static final String SQL_STATE_NO_DEFAULT_FOR_COLUMN = "S0023"; //$NON-NLS-1$
115
public static final String SQL_STATE_NO_ROWS_UPDATED_OR_DELETED = "01S03"; //$NON-NLS-1$
117
public static final String SQL_STATE_NUMERIC_VALUE_OUT_OF_RANGE = "22003"; //$NON-NLS-1$
119
public static final String SQL_STATE_PRIVILEGE_NOT_REVOKED = "01006"; //$NON-NLS-1$
121
public static final String SQL_STATE_SYNTAX_ERROR = "42000"; //$NON-NLS-1$
123
public static final String SQL_STATE_TIMEOUT_EXPIRED = "S1T00"; //$NON-NLS-1$
125
public static final String SQL_STATE_TRANSACTION_RESOLUTION_UNKNOWN = "08007"; // $NON_NLS-1$
127
public static final String SQL_STATE_UNABLE_TO_CONNECT_TO_DATASOURCE = "08001"; //$NON-NLS-1$
129
public static final String SQL_STATE_WRONG_NO_OF_PARAMETERS = "07001"; //$NON-NLS-1$
131
public static final String SQL_STATE_INVALID_TRANSACTION_TERMINATION = "2D000"; //$NON_NLS-1$
133
private static Map sqlStateMessages;
136
sqlStateMessages = new HashMap();
137
sqlStateMessages.put(SQL_STATE_DISCONNECT_ERROR, Messages
138
.getString("SQLError.35")); //$NON-NLS-1$
139
sqlStateMessages.put(SQL_STATE_DATE_TRUNCATED, Messages
140
.getString("SQLError.36")); //$NON-NLS-1$
141
sqlStateMessages.put(SQL_STATE_PRIVILEGE_NOT_REVOKED, Messages
142
.getString("SQLError.37")); //$NON-NLS-1$
143
sqlStateMessages.put(SQL_STATE_INVALID_CONNECTION_ATTRIBUTE, Messages
144
.getString("SQLError.38")); //$NON-NLS-1$
145
sqlStateMessages.put(SQL_STATE_ERROR_IN_ROW, Messages
146
.getString("SQLError.39")); //$NON-NLS-1$
147
sqlStateMessages.put(SQL_STATE_NO_ROWS_UPDATED_OR_DELETED, Messages
148
.getString("SQLError.40")); //$NON-NLS-1$
149
sqlStateMessages.put(SQL_STATE_MORE_THAN_ONE_ROW_UPDATED_OR_DELETED,
150
Messages.getString("SQLError.41")); //$NON-NLS-1$
151
sqlStateMessages.put(SQL_STATE_WRONG_NO_OF_PARAMETERS, Messages
152
.getString("SQLError.42")); //$NON-NLS-1$
153
sqlStateMessages.put(SQL_STATE_UNABLE_TO_CONNECT_TO_DATASOURCE,
154
Messages.getString("SQLError.43")); //$NON-NLS-1$
155
sqlStateMessages.put(SQL_STATE_CONNECTION_IN_USE, Messages
156
.getString("SQLError.44")); //$NON-NLS-1$
157
sqlStateMessages.put(SQL_STATE_CONNECTION_NOT_OPEN, Messages
158
.getString("SQLError.45")); //$NON-NLS-1$
159
sqlStateMessages.put(SQL_STATE_CONNECTION_REJECTED, Messages
160
.getString("SQLError.46")); //$NON-NLS-1$
161
sqlStateMessages.put(SQL_STATE_CONNECTION_FAIL_DURING_TX, Messages
162
.getString("SQLError.47")); //$NON-NLS-1$
163
sqlStateMessages.put(SQL_STATE_COMMUNICATION_LINK_FAILURE, Messages
164
.getString("SQLError.48")); //$NON-NLS-1$
165
sqlStateMessages.put(SQL_STATE_INSERT_VALUE_LIST_NO_MATCH_COL_LIST,
166
Messages.getString("SQLError.49")); //$NON-NLS-1$
167
sqlStateMessages.put(SQL_STATE_NUMERIC_VALUE_OUT_OF_RANGE, Messages
168
.getString("SQLError.50")); //$NON-NLS-1$
169
sqlStateMessages.put(SQL_STATE_DATETIME_FIELD_OVERFLOW, Messages
170
.getString("SQLError.51")); //$NON-NLS-1$
171
sqlStateMessages.put(SQL_STATE_DIVISION_BY_ZERO, Messages
172
.getString("SQLError.52")); //$NON-NLS-1$
173
sqlStateMessages.put(SQL_STATE_DEADLOCK, Messages
174
.getString("SQLError.53")); //$NON-NLS-1$
175
sqlStateMessages.put(SQL_STATE_INVALID_AUTH_SPEC, Messages
176
.getString("SQLError.54")); //$NON-NLS-1$
177
sqlStateMessages.put(SQL_STATE_SYNTAX_ERROR, Messages
178
.getString("SQLError.55")); //$NON-NLS-1$
179
sqlStateMessages.put(SQL_STATE_BASE_TABLE_OR_VIEW_NOT_FOUND, Messages
180
.getString("SQLError.56")); //$NON-NLS-1$
181
sqlStateMessages.put(SQL_STATE_BASE_TABLE_OR_VIEW_ALREADY_EXISTS,
182
Messages.getString("SQLError.57")); //$NON-NLS-1$
183
sqlStateMessages.put(SQL_STATE_BASE_TABLE_NOT_FOUND, Messages
184
.getString("SQLError.58")); //$NON-NLS-1$
185
sqlStateMessages.put(SQL_STATE_INDEX_ALREADY_EXISTS, Messages
186
.getString("SQLError.59")); //$NON-NLS-1$
187
sqlStateMessages.put(SQL_STATE_INDEX_NOT_FOUND, Messages
188
.getString("SQLError.60")); //$NON-NLS-1$
189
sqlStateMessages.put(SQL_STATE_COLUMN_ALREADY_EXISTS, Messages
190
.getString("SQLError.61")); //$NON-NLS-1$
191
sqlStateMessages.put(SQL_STATE_COLUMN_NOT_FOUND, Messages
192
.getString("SQLError.62")); //$NON-NLS-1$
193
sqlStateMessages.put(SQL_STATE_NO_DEFAULT_FOR_COLUMN, Messages
194
.getString("SQLError.63")); //$NON-NLS-1$
195
sqlStateMessages.put(SQL_STATE_GENERAL_ERROR, Messages
196
.getString("SQLError.64")); //$NON-NLS-1$
197
sqlStateMessages.put(SQL_STATE_MEMORY_ALLOCATION_FAILURE, Messages
198
.getString("SQLError.65")); //$NON-NLS-1$
199
sqlStateMessages.put(SQL_STATE_INVALID_COLUMN_NUMBER, Messages
200
.getString("SQLError.66")); //$NON-NLS-1$
201
sqlStateMessages.put(SQL_STATE_ILLEGAL_ARGUMENT, Messages
202
.getString("SQLError.67")); //$NON-NLS-1$
203
sqlStateMessages.put(SQL_STATE_DRIVER_NOT_CAPABLE, Messages
204
.getString("SQLError.68")); //$NON-NLS-1$
205
sqlStateMessages.put(SQL_STATE_TIMEOUT_EXPIRED, Messages
206
.getString("SQLError.69")); //$NON-NLS-1$
208
mysqlToSqlState = new Hashtable();
211
// Communications Errors
213
// ER_CON_COUNT_ERROR 1040
214
// ER_BAD_HOST_ERROR 1042
215
// ER_HANDSHAKE_ERROR 1043
216
// ER_UNKNOWN_COM_ERROR 1047
217
// ER_IPSOCK_ERROR 1081
219
mysqlToSqlState.put(new Integer(1040), SQL_STATE_CONNECTION_REJECTED);
220
mysqlToSqlState.put(new Integer(1042), SQL_STATE_CONNECTION_REJECTED);
221
mysqlToSqlState.put(new Integer(1043), SQL_STATE_CONNECTION_REJECTED);
222
mysqlToSqlState.put(new Integer(1047),
223
SQL_STATE_COMMUNICATION_LINK_FAILURE);
224
mysqlToSqlState.put(new Integer(1081),
225
SQL_STATE_COMMUNICATION_LINK_FAILURE);
227
// ER_HOST_IS_BLOCKED 1129
228
// ER_HOST_NOT_PRIVILEGED 1130
229
mysqlToSqlState.put(new Integer(1129), SQL_STATE_CONNECTION_REJECTED);
230
mysqlToSqlState.put(new Integer(1130), SQL_STATE_CONNECTION_REJECTED);
233
// Authentication Errors
235
// ER_ACCESS_DENIED_ERROR 1045
237
mysqlToSqlState.put(new Integer(1045), SQL_STATE_INVALID_AUTH_SPEC);
242
// ER_CANT_CREATE_FILE 1004
243
// ER_CANT_CREATE_TABLE 1005
246
// ER_CON_COUNT_ERROR 1040
247
// ER_OUT_OF_RESOURCES 1041
249
// Out-of-memory errors
251
// ER_OUTOFMEMORY 1037
252
// ER_OUT_OF_SORTMEMORY 1038
254
mysqlToSqlState.put(new Integer(1037),
255
SQL_STATE_MEMORY_ALLOCATION_FAILURE);
256
mysqlToSqlState.put(new Integer(1038),
257
SQL_STATE_MEMORY_ALLOCATION_FAILURE);
262
// ER_PARSE_ERROR 1064
263
// ER_EMPTY_QUERY 1065
265
mysqlToSqlState.put(new Integer(1064), SQL_STATE_SYNTAX_ERROR);
266
mysqlToSqlState.put(new Integer(1065), SQL_STATE_SYNTAX_ERROR);
269
// Invalid argument errors
271
// ER_WRONG_FIELD_WITH_GROUP 1055
272
// ER_WRONG_GROUP_FIELD 1056
273
// ER_WRONG_SUM_SELECT 1057
274
// ER_TOO_LONG_IDENT 1059
275
// ER_DUP_FIELDNAME 1060
276
// ER_DUP_KEYNAME 1061
278
// ER_WRONG_FIELD_SPEC 1063
279
// ER_NONUNIQ_TABLE 1066
280
// ER_INVALID_DEFAULT 1067
281
// ER_MULTIPLE_PRI_KEY 1068
282
// ER_TOO_MANY_KEYS 1069
283
// ER_TOO_MANY_KEY_PARTS 1070
284
// ER_TOO_LONG_KEY 1071
285
// ER_KEY_COLUMN_DOES_NOT_EXIST 1072
286
// ER_BLOB_USED_AS_KEY 1073
287
// ER_TOO_BIG_FIELDLENGTH 1074
288
// ER_WRONG_AUTO_KEY 1075
289
// ER_NO_SUCH_INDEX 1082
290
// ER_WRONG_FIELD_TERMINATORS 1083
291
// ER_BLOBS_AND_NO_TERMINATED 1084
293
mysqlToSqlState.put(new Integer(1055), SQL_STATE_ILLEGAL_ARGUMENT);
294
mysqlToSqlState.put(new Integer(1056), SQL_STATE_ILLEGAL_ARGUMENT);
295
mysqlToSqlState.put(new Integer(1057), SQL_STATE_ILLEGAL_ARGUMENT);
296
mysqlToSqlState.put(new Integer(1059), SQL_STATE_ILLEGAL_ARGUMENT);
297
mysqlToSqlState.put(new Integer(1060), SQL_STATE_ILLEGAL_ARGUMENT);
298
mysqlToSqlState.put(new Integer(1061), SQL_STATE_ILLEGAL_ARGUMENT);
299
mysqlToSqlState.put(new Integer(1062), SQL_STATE_ILLEGAL_ARGUMENT);
300
mysqlToSqlState.put(new Integer(1063), SQL_STATE_ILLEGAL_ARGUMENT);
301
mysqlToSqlState.put(new Integer(1066), SQL_STATE_ILLEGAL_ARGUMENT);
302
mysqlToSqlState.put(new Integer(1067), SQL_STATE_ILLEGAL_ARGUMENT);
303
mysqlToSqlState.put(new Integer(1068), SQL_STATE_ILLEGAL_ARGUMENT);
304
mysqlToSqlState.put(new Integer(1069), SQL_STATE_ILLEGAL_ARGUMENT);
305
mysqlToSqlState.put(new Integer(1070), SQL_STATE_ILLEGAL_ARGUMENT);
306
mysqlToSqlState.put(new Integer(1071), SQL_STATE_ILLEGAL_ARGUMENT);
307
mysqlToSqlState.put(new Integer(1072), SQL_STATE_ILLEGAL_ARGUMENT);
308
mysqlToSqlState.put(new Integer(1073), SQL_STATE_ILLEGAL_ARGUMENT);
309
mysqlToSqlState.put(new Integer(1074), SQL_STATE_ILLEGAL_ARGUMENT);
310
mysqlToSqlState.put(new Integer(1075), SQL_STATE_ILLEGAL_ARGUMENT);
311
mysqlToSqlState.put(new Integer(1082), SQL_STATE_ILLEGAL_ARGUMENT);
312
mysqlToSqlState.put(new Integer(1083), SQL_STATE_ILLEGAL_ARGUMENT);
313
mysqlToSqlState.put(new Integer(1084), SQL_STATE_ILLEGAL_ARGUMENT);
316
// ER_WRONG_VALUE_COUNT 1058
318
mysqlToSqlState.put(new Integer(1058),
319
SQL_STATE_INSERT_VALUE_LIST_NO_MATCH_COL_LIST);
321
// ER_CANT_CREATE_DB 1006
322
// ER_DB_CREATE_EXISTS 1007
323
// ER_DB_DROP_EXISTS 1008
324
// ER_DB_DROP_DELETE 1009
325
// ER_DB_DROP_RMDIR 1010
326
// ER_CANT_DELETE_FILE 1011
327
// ER_CANT_FIND_SYSTEM_REC 1012
328
// ER_CANT_GET_STAT 1013
329
// ER_CANT_GET_WD 1014
330
// ER_UNEXPECTED_EOF 1039
331
// ER_CANT_OPEN_FILE 1016
332
// ER_FILE_NOT_FOUND 1017
333
// ER_CANT_READ_DIR 1018
334
// ER_CANT_SET_WD 1019
337
// ER_ERROR_ON_CLOSE 1023
338
// ER_ERROR_ON_READ 1024
339
// ER_ERROR_ON_RENAME 1025
340
// ER_ERROR_ON_WRITE 1026
342
// ER_FILSORT_ABORT 1028
343
// ER_FORM_NOT_FOUND 1029
345
// ER_ILLEGAL_HA 1031
346
// ER_KEY_NOT_FOUND 1032
347
// ER_NOT_FORM_FILE 1033
348
// ER_DBACCESS_DENIED_ERROR 1044
349
// ER_NO_DB_ERROR 1046
350
// ER_BAD_NULL_ERROR 1048
351
// ER_BAD_DB_ERROR 1049
352
// ER_TABLE_EXISTS_ERROR 1050
353
// ER_BAD_TABLE_ERROR 1051
354
mysqlToSqlState.put(new Integer(1051),
355
SQL_STATE_BASE_TABLE_OR_VIEW_NOT_FOUND);
357
// ER_NON_UNIQ_ERROR 1052
358
// ER_BAD_FIELD_ERROR 1054
359
mysqlToSqlState.put(new Integer(1054), SQL_STATE_COLUMN_NOT_FOUND);
361
// ER_TEXTFILE_NOT_READABLE 1085
362
// ER_FILE_EXISTS_ERROR 1086
364
// ER_ALTER_INFO 1088
365
// ER_WRONG_SUB_KEY 1089
366
// ER_CANT_REMOVE_ALL_FIELDS 1090
367
// ER_CANT_DROP_FIELD_OR_KEY 1091
368
// ER_INSERT_INFO 1092
369
// ER_INSERT_TABLE_USED 1093
370
// ER_LOCK_DEADLOCK 1213
371
mysqlToSqlState.put(new Integer(1205), SQL_STATE_DEADLOCK);
372
mysqlToSqlState.put(new Integer(1213), SQL_STATE_DEADLOCK);
374
mysqlToSql99State = new HashMap();
376
mysqlToSql99State.put(new Integer(1205), SQL_STATE_DEADLOCK);
377
mysqlToSql99State.put(new Integer(1213), SQL_STATE_DEADLOCK);
378
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_DUP_KEY),
380
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_OUTOFMEMORY),
382
mysqlToSql99State.put(new Integer(
383
MysqlErrorNumbers.ER_OUT_OF_SORTMEMORY), "HY001");
384
mysqlToSql99State.put(
385
new Integer(MysqlErrorNumbers.ER_CON_COUNT_ERROR), "08004");
386
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_BAD_HOST_ERROR),
388
mysqlToSql99State.put(
389
new Integer(MysqlErrorNumbers.ER_HANDSHAKE_ERROR), "08S01");
390
mysqlToSql99State.put(new Integer(
391
MysqlErrorNumbers.ER_DBACCESS_DENIED_ERROR), "42000");
392
mysqlToSql99State.put(new Integer(
393
MysqlErrorNumbers.ER_ACCESS_DENIED_ERROR), "28000");
394
mysqlToSql99State.put(new Integer(
395
MysqlErrorNumbers.ER_TABLE_EXISTS_ERROR), "42S01");
396
mysqlToSql99State.put(
397
new Integer(MysqlErrorNumbers.ER_BAD_TABLE_ERROR), "42S02");
398
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_NON_UNIQ_ERROR),
400
mysqlToSql99State.put(
401
new Integer(MysqlErrorNumbers.ER_SERVER_SHUTDOWN), "08S01");
402
mysqlToSql99State.put(
403
new Integer(MysqlErrorNumbers.ER_BAD_FIELD_ERROR), "42S22");
404
mysqlToSql99State.put(new Integer(
405
MysqlErrorNumbers.ER_WRONG_FIELD_WITH_GROUP), "42000");
406
mysqlToSql99State.put(new Integer(
407
MysqlErrorNumbers.ER_WRONG_GROUP_FIELD), "42000");
408
mysqlToSql99State.put(
409
new Integer(MysqlErrorNumbers.ER_WRONG_SUM_SELECT), "42000");
410
mysqlToSql99State.put(new Integer(
411
MysqlErrorNumbers.ER_WRONG_VALUE_COUNT), "21S01");
412
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_TOO_LONG_IDENT),
414
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_DUP_FIELDNAME),
416
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_DUP_KEYNAME),
418
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_DUP_ENTRY),
420
mysqlToSql99State.put(
421
new Integer(MysqlErrorNumbers.ER_WRONG_FIELD_SPEC), "42000");
422
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_PARSE_ERROR),
424
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_EMPTY_QUERY),
426
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_NONUNIQ_TABLE),
428
mysqlToSql99State.put(
429
new Integer(MysqlErrorNumbers.ER_INVALID_DEFAULT), "42000");
430
mysqlToSql99State.put(
431
new Integer(MysqlErrorNumbers.ER_MULTIPLE_PRI_KEY), "42000");
432
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_TOO_MANY_KEYS),
434
mysqlToSql99State.put(new Integer(
435
MysqlErrorNumbers.ER_TOO_MANY_KEY_PARTS), "42000");
436
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_TOO_LONG_KEY),
438
mysqlToSql99State.put(new Integer(
439
MysqlErrorNumbers.ER_KEY_COLUMN_DOES_NOT_EXITS), "42000");
440
mysqlToSql99State.put(
441
new Integer(MysqlErrorNumbers.ER_BLOB_USED_AS_KEY), "42000");
442
mysqlToSql99State.put(new Integer(
443
MysqlErrorNumbers.ER_TOO_BIG_FIELDLENGTH), "42000");
444
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_WRONG_AUTO_KEY),
446
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_FORCING_CLOSE),
448
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_IPSOCK_ERROR),
450
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_NO_SUCH_INDEX),
452
mysqlToSql99State.put(new Integer(
453
MysqlErrorNumbers.ER_WRONG_FIELD_TERMINATORS), "42000");
454
mysqlToSql99State.put(new Integer(
455
MysqlErrorNumbers.ER_BLOBS_AND_NO_TERMINATED), "42000");
456
mysqlToSql99State.put(new Integer(
457
MysqlErrorNumbers.ER_CANT_REMOVE_ALL_FIELDS), "42000");
458
mysqlToSql99State.put(new Integer(
459
MysqlErrorNumbers.ER_CANT_DROP_FIELD_OR_KEY), "42000");
460
mysqlToSql99State.put(new Integer(
461
MysqlErrorNumbers.ER_BLOB_CANT_HAVE_DEFAULT), "42000");
462
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_WRONG_DB_NAME),
464
mysqlToSql99State.put(
465
new Integer(MysqlErrorNumbers.ER_WRONG_TABLE_NAME), "42000");
466
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_TOO_BIG_SELECT),
468
mysqlToSql99State.put(new Integer(
469
MysqlErrorNumbers.ER_UNKNOWN_PROCEDURE), "42000");
470
mysqlToSql99State.put(new Integer(
471
MysqlErrorNumbers.ER_WRONG_PARAMCOUNT_TO_PROCEDURE), "42000");
472
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_UNKNOWN_TABLE),
474
mysqlToSql99State.put(new Integer(
475
MysqlErrorNumbers.ER_FIELD_SPECIFIED_TWICE), "42000");
476
mysqlToSql99State.put(new Integer(
477
MysqlErrorNumbers.ER_UNSUPPORTED_EXTENSION), "42000");
478
mysqlToSql99State.put(new Integer(
479
MysqlErrorNumbers.ER_TABLE_MUST_HAVE_COLUMNS), "42000");
480
mysqlToSql99State.put(new Integer(
481
MysqlErrorNumbers.ER_UNKNOWN_CHARACTER_SET), "42000");
482
mysqlToSql99State.put(
483
new Integer(MysqlErrorNumbers.ER_TOO_BIG_ROWSIZE), "42000");
484
mysqlToSql99State.put(
485
new Integer(MysqlErrorNumbers.ER_WRONG_OUTER_JOIN), "42000");
486
mysqlToSql99State.put(new Integer(
487
MysqlErrorNumbers.ER_NULL_COLUMN_IN_INDEX), "42000");
488
mysqlToSql99State.put(new Integer(
489
MysqlErrorNumbers.ER_PASSWORD_ANONYMOUS_USER), "42000");
490
mysqlToSql99State.put(new Integer(
491
MysqlErrorNumbers.ER_PASSWORD_NOT_ALLOWED), "42000");
492
mysqlToSql99State.put(new Integer(
493
MysqlErrorNumbers.ER_PASSWORD_NO_MATCH), "42000");
494
mysqlToSql99State.put(new Integer(
495
MysqlErrorNumbers.ER_WRONG_VALUE_COUNT_ON_ROW), "21S01");
496
mysqlToSql99State.put(new Integer(
497
MysqlErrorNumbers.ER_INVALID_USE_OF_NULL), "42000");
498
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_REGEXP_ERROR),
500
mysqlToSql99State.put(new Integer(
501
MysqlErrorNumbers.ER_MIX_OF_GROUP_FUNC_AND_FIELDS), "42000");
502
mysqlToSql99State.put(new Integer(
503
MysqlErrorNumbers.ER_NONEXISTING_GRANT), "42000");
504
mysqlToSql99State.put(new Integer(
505
MysqlErrorNumbers.ER_TABLEACCESS_DENIED_ERROR), "42000");
506
mysqlToSql99State.put(new Integer(
507
MysqlErrorNumbers.ER_COLUMNACCESS_DENIED_ERROR), "42000");
508
mysqlToSql99State.put(new Integer(
509
MysqlErrorNumbers.ER_ILLEGAL_GRANT_FOR_TABLE), "42000");
510
mysqlToSql99State.put(new Integer(
511
MysqlErrorNumbers.ER_GRANT_WRONG_HOST_OR_USER), "42000");
512
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_NO_SUCH_TABLE),
514
mysqlToSql99State.put(new Integer(
515
MysqlErrorNumbers.ER_NONEXISTING_TABLE_GRANT), "42000");
516
mysqlToSql99State.put(new Integer(
517
MysqlErrorNumbers.ER_NOT_ALLOWED_COMMAND), "42000");
518
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_SYNTAX_ERROR),
520
mysqlToSql99State.put(new Integer(
521
MysqlErrorNumbers.ER_ABORTING_CONNECTION), "08S01");
522
mysqlToSql99State.put(new Integer(
523
MysqlErrorNumbers.ER_NET_PACKET_TOO_LARGE), "08S01");
524
mysqlToSql99State.put(new Integer(
525
MysqlErrorNumbers.ER_NET_READ_ERROR_FROM_PIPE), "08S01");
526
mysqlToSql99State.put(
527
new Integer(MysqlErrorNumbers.ER_NET_FCNTL_ERROR), "08S01");
528
mysqlToSql99State.put(new Integer(
529
MysqlErrorNumbers.ER_NET_PACKETS_OUT_OF_ORDER), "08S01");
530
mysqlToSql99State.put(new Integer(
531
MysqlErrorNumbers.ER_NET_UNCOMPRESS_ERROR), "08S01");
532
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_NET_READ_ERROR),
534
mysqlToSql99State.put(new Integer(
535
MysqlErrorNumbers.ER_NET_READ_INTERRUPTED), "08S01");
536
mysqlToSql99State.put(new Integer(
537
MysqlErrorNumbers.ER_NET_ERROR_ON_WRITE), "08S01");
538
mysqlToSql99State.put(new Integer(
539
MysqlErrorNumbers.ER_NET_WRITE_INTERRUPTED), "08S01");
540
mysqlToSql99State.put(
541
new Integer(MysqlErrorNumbers.ER_TOO_LONG_STRING), "42000");
542
mysqlToSql99State.put(new Integer(
543
MysqlErrorNumbers.ER_TABLE_CANT_HANDLE_BLOB), "42000");
546
MysqlErrorNumbers.ER_TABLE_CANT_HANDLE_AUTO_INCREMENT),
548
mysqlToSql99State.put(new Integer(
549
MysqlErrorNumbers.ER_WRONG_COLUMN_NAME), "42000");
550
mysqlToSql99State.put(
551
new Integer(MysqlErrorNumbers.ER_WRONG_KEY_COLUMN), "42000");
552
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_DUP_UNIQUE),
554
mysqlToSql99State.put(new Integer(
555
MysqlErrorNumbers.ER_BLOB_KEY_WITHOUT_LENGTH), "42000");
556
mysqlToSql99State.put(new Integer(
557
MysqlErrorNumbers.ER_PRIMARY_CANT_HAVE_NULL), "42000");
558
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_TOO_MANY_ROWS),
560
mysqlToSql99State.put(new Integer(
561
MysqlErrorNumbers.ER_REQUIRES_PRIMARY_KEY), "42000");
562
mysqlToSql99State.put(new Integer(
563
MysqlErrorNumbers.ER_CHECK_NO_SUCH_TABLE), "42000");
564
mysqlToSql99State.put(new Integer(
565
MysqlErrorNumbers.ER_CHECK_NOT_IMPLEMENTED), "42000");
566
mysqlToSql99State.put(new Integer(
567
MysqlErrorNumbers.ER_CANT_DO_THIS_DURING_AN_TRANSACTION),
569
mysqlToSql99State.put(new Integer(
570
MysqlErrorNumbers.ER_NEW_ABORTING_CONNECTION), "08S01");
571
mysqlToSql99State.put(
572
new Integer(MysqlErrorNumbers.ER_MASTER_NET_READ), "08S01");
573
mysqlToSql99State.put(
574
new Integer(MysqlErrorNumbers.ER_MASTER_NET_WRITE), "08S01");
575
mysqlToSql99State.put(new Integer(
576
MysqlErrorNumbers.ER_TOO_MANY_USER_CONNECTIONS), "42000");
577
mysqlToSql99State.put(new Integer(
578
MysqlErrorNumbers.ER_READ_ONLY_TRANSACTION), "25000");
579
mysqlToSql99State.put(new Integer(
580
MysqlErrorNumbers.ER_NO_PERMISSION_TO_CREATE_USER), "42000");
581
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_LOCK_DEADLOCK),
583
mysqlToSql99State.put(new Integer(
584
MysqlErrorNumbers.ER_NO_REFERENCED_ROW), "23000");
585
mysqlToSql99State.put(new Integer(
586
MysqlErrorNumbers.ER_ROW_IS_REFERENCED), "23000");
587
mysqlToSql99State.put(new Integer(
588
MysqlErrorNumbers.ER_CONNECT_TO_MASTER), "08S01");
589
mysqlToSql99State.put(new Integer(
590
MysqlErrorNumbers.ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT),
592
mysqlToSql99State.put(new Integer(
593
MysqlErrorNumbers.ER_USER_LIMIT_REACHED), "42000");
594
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_NO_DEFAULT),
596
mysqlToSql99State.put(new Integer(
597
MysqlErrorNumbers.ER_WRONG_VALUE_FOR_VAR), "42000");
598
mysqlToSql99State.put(new Integer(
599
MysqlErrorNumbers.ER_WRONG_TYPE_FOR_VAR), "42000");
600
mysqlToSql99State.put(new Integer(
601
MysqlErrorNumbers.ER_CANT_USE_OPTION_HERE), "42000");
602
mysqlToSql99State.put(new Integer(
603
MysqlErrorNumbers.ER_NOT_SUPPORTED_YET), "42000");
604
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_WRONG_FK_DEF),
606
mysqlToSql99State.put(
607
new Integer(MysqlErrorNumbers.ER_OPERAND_COLUMNS), "21000");
608
mysqlToSql99State.put(new Integer(
609
MysqlErrorNumbers.ER_SUBQUERY_NO_1_ROW), "21000");
610
mysqlToSql99State.put(new Integer(
611
MysqlErrorNumbers.ER_ILLEGAL_REFERENCE), "42S22");
612
mysqlToSql99State.put(new Integer(
613
MysqlErrorNumbers.ER_DERIVED_MUST_HAVE_ALIAS), "42000");
614
mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_SELECT_REDUCED),
616
mysqlToSql99State.put(new Integer(
617
MysqlErrorNumbers.ER_TABLENAME_NOT_ALLOWED_HERE), "42000");
618
mysqlToSql99State.put(new Integer(
619
MysqlErrorNumbers.ER_NOT_SUPPORTED_AUTH_MODE), "08004");
620
mysqlToSql99State.put(new Integer(
621
MysqlErrorNumbers.ER_SPATIAL_CANT_HAVE_NULL), "42000");
622
mysqlToSql99State.put(new Integer(
623
MysqlErrorNumbers.ER_COLLATION_CHARSET_MISMATCH), "42000");
624
mysqlToSql99State.put(new Integer(
625
MysqlErrorNumbers.ER_WARN_TOO_FEW_RECORDS), "01000");
626
mysqlToSql99State.put(new Integer(
627
MysqlErrorNumbers.ER_WARN_TOO_MANY_RECORDS), "01000");
628
mysqlToSql99State.put(new Integer(
629
MysqlErrorNumbers.ER_WARN_NULL_TO_NOTNULL), "01000");
630
mysqlToSql99State.put(new Integer(
631
MysqlErrorNumbers.ER_WARN_DATA_OUT_OF_RANGE), "01000");
632
mysqlToSql99State.put(new Integer(
633
MysqlErrorNumbers.ER_WARN_DATA_TRUNCATED), "01000");
634
mysqlToSql99State.put(new Integer(
635
MysqlErrorNumbers.ER_WRONG_NAME_FOR_INDEX), "42000");
636
mysqlToSql99State.put(new Integer(
637
MysqlErrorNumbers.ER_WRONG_NAME_FOR_CATALOG), "42000");
638
mysqlToSql99State.put(new Integer(
639
MysqlErrorNumbers.ER_UNKNOWN_STORAGE_ENGINE), "42000");
643
* Turns output of 'SHOW WARNINGS' into JDBC SQLWarning instances.
645
* If 'forTruncationOnly' is true, only looks for truncation warnings, and
646
* actually throws DataTruncation as an exception.
649
* the connection to use for getting warnings.
651
* @return the SQLWarning chain (or null if no warnings)
653
* @throws SQLException
654
* if the warnings could not be retrieved
656
static SQLWarning convertShowWarningsToSQLWarnings(Connection connection)
657
throws SQLException {
658
return convertShowWarningsToSQLWarnings(connection, 0, false);
662
* Turns output of 'SHOW WARNINGS' into JDBC SQLWarning instances.
664
* If 'forTruncationOnly' is true, only looks for truncation warnings, and
665
* actually throws DataTruncation as an exception.
668
* the connection to use for getting warnings.
669
* @param warningCountIfKnown
670
* the warning count (if known), otherwise set it to 0.
671
* @param forTruncationOnly
672
* if this method should only scan for data truncation warnings
674
* @return the SQLWarning chain (or null if no warnings)
676
* @throws SQLException
677
* if the warnings could not be retrieved, or if data truncation
678
* is being scanned for and truncations were found.
680
static SQLWarning convertShowWarningsToSQLWarnings(Connection connection,
681
int warningCountIfKnown, boolean forTruncationOnly)
682
throws SQLException {
683
java.sql.Statement stmt = null;
684
java.sql.ResultSet warnRs = null;
686
SQLWarning currentWarning = null;
689
if (warningCountIfKnown < 100) {
690
stmt = connection.createStatement();
692
if (stmt.getMaxRows() != 0) {
696
// stream large warning counts
697
stmt = connection.createStatement(
698
java.sql.ResultSet.TYPE_FORWARD_ONLY,
699
java.sql.ResultSet.CONCUR_READ_ONLY);
700
stmt.setFetchSize(Integer.MIN_VALUE);
704
* +---------+------+---------------------------------------------+ |
705
* Level | Code | Message |
706
* +---------+------+---------------------------------------------+ |
707
* Warning | 1265 | Data truncated for column 'field1' at row 1 |
708
* +---------+------+---------------------------------------------+
710
warnRs = stmt.executeQuery("SHOW WARNINGS"); //$NON-NLS-1$
712
while (warnRs.next()) {
713
int code = warnRs.getInt("Code"); //$NON-NLS-1$
715
if (forTruncationOnly) {
716
if (code == 1265 || code == 1264) {
717
DataTruncation newTruncation = new MysqlDataTruncation(
718
warnRs.getString("Message"), 0, false, false, 0, 0); //$NON-NLS-1$
720
if (currentWarning == null) {
721
currentWarning = newTruncation;
723
currentWarning.setNextWarning(newTruncation);
727
String level = warnRs.getString("Level"); //$NON-NLS-1$
728
String message = warnRs.getString("Message"); //$NON-NLS-1$
730
SQLWarning newWarning = new SQLWarning(message, SQLError
731
.mysqlToSqlState(code, connection
732
.getUseSqlStateCodes()), code);
734
if (currentWarning == null) {
735
currentWarning = newWarning;
737
currentWarning.setNextWarning(newWarning);
742
if (forTruncationOnly && (currentWarning != null)) {
743
throw currentWarning;
746
return currentWarning;
748
SQLException reThrow = null;
750
if (warnRs != null) {
753
} catch (SQLException sqlEx) {
761
} catch (SQLException sqlEx) {
762
// ideally, we'd use chained exceptions here,
763
// but we still support JDK-1.2.x with this driver
764
// which doesn't have them....
769
if (reThrow != null) {
775
public static void dumpSqlStatesMappingsAsXml() throws Exception {
776
TreeMap allErrorNumbers = new TreeMap();
777
Map mysqlErrorNumbersToNames = new HashMap();
779
Integer errorNumber = null;
782
// First create a list of all 'known' error numbers that
785
for (Iterator mysqlErrorNumbers = mysqlToSql99State.keySet().iterator(); mysqlErrorNumbers
787
errorNumber = (Integer) mysqlErrorNumbers.next();
788
allErrorNumbers.put(errorNumber, errorNumber);
791
for (Iterator mysqlErrorNumbers = mysqlToSqlState.keySet().iterator(); mysqlErrorNumbers
793
errorNumber = (Integer) mysqlErrorNumbers.next();
794
allErrorNumbers.put(errorNumber, errorNumber);
798
// Now create a list of the actual MySQL error numbers we know about
800
java.lang.reflect.Field[] possibleFields = MysqlErrorNumbers.class
801
.getDeclaredFields();
803
for (int i = 0; i < possibleFields.length; i++) {
804
String fieldName = possibleFields[i].getName();
806
if (fieldName.startsWith("ER_")) {
807
mysqlErrorNumbersToNames.put(possibleFields[i].get(null),
812
System.out.println("<ErrorMappings>");
814
for (Iterator allErrorNumbersIter = allErrorNumbers.keySet().iterator(); allErrorNumbersIter
816
errorNumber = (Integer) allErrorNumbersIter.next();
818
String sql92State = mysqlToSql99(errorNumber.intValue());
819
String oldSqlState = mysqlToXOpen(errorNumber.intValue());
821
System.out.println(" <ErrorMapping mysqlErrorNumber=\""
822
+ errorNumber + "\" mysqlErrorName=\""
823
+ mysqlErrorNumbersToNames.get(errorNumber)
824
+ "\" legacySqlState=\""
825
+ ((oldSqlState == null) ? "" : oldSqlState)
826
+ "\" sql92SqlState=\""
827
+ ((sql92State == null) ? "" : sql92State) + "\"/>");
830
System.out.println("</ErrorMappings>");
833
static String get(String stateCode) {
834
return (String) sqlStateMessages.get(stateCode);
837
private static String mysqlToSql99(int errno) {
838
Integer err = new Integer(errno);
840
if (mysqlToSql99State.containsKey(err)) {
841
return (String) mysqlToSql99State.get(err);
848
* Map MySQL error codes to X/Open or SQL-92 error codes
851
* the MySQL error code
853
* @return the corresponding X/Open or SQL-92 error code
855
static String mysqlToSqlState(int errno, boolean useSql92States) {
856
if (useSql92States) {
857
return mysqlToSql99(errno);
860
return mysqlToXOpen(errno);
863
private static String mysqlToXOpen(int errno) {
864
Integer err = new Integer(errno);
866
if (mysqlToSqlState.containsKey(err)) {
867
return (String) mysqlToSqlState.get(err);
870
return SQL_STATE_GENERAL_ERROR;
874
* SQL State Class SQLNonTransientException Subclass 08
875
* SQLNonTransientConnectionException 22 SQLDataException 23
876
* SQLIntegrityConstraintViolationException N/A
877
* SQLInvalidAuthorizationException 42 SQLSyntaxErrorException
879
* SQL State Class SQLTransientException Subclass 08
880
* SQLTransientConnectionException 40 SQLTransactionRollbackException N/A
881
* SQLTimeoutException
884
public static SQLException createSQLException(String message,
886
if (sqlState != null) {
887
if (sqlState.startsWith("08")) {
888
return new MySQLNonTransientConnectionException(message,
892
if (sqlState.startsWith("22")) {
893
return new MySQLDataException(message, sqlState);
896
if (sqlState.startsWith("23")) {
897
return new MySQLIntegrityConstraintViolationException(message,
901
if (sqlState.startsWith("42")) {
902
return new MySQLSyntaxErrorException(message, sqlState);
905
if (sqlState.startsWith("40")) {
906
return new MySQLTransactionRollbackException(message, sqlState);
910
return new SQLException(message, sqlState);
913
public static SQLException createSQLException(String message) {
914
return new SQLException(message);
917
public static SQLException createSQLException(String message,
918
String sqlState, int vendorErrorCode) {
919
if (sqlState != null) {
920
if (sqlState.startsWith("08")) {
921
return new MySQLNonTransientConnectionException(message,
922
sqlState, vendorErrorCode);
925
if (sqlState.startsWith("22")) {
926
return new MySQLDataException(message, sqlState,
930
if (sqlState.startsWith("23")) {
931
return new MySQLIntegrityConstraintViolationException(message,
932
sqlState, vendorErrorCode);
935
if (sqlState.startsWith("42")) {
936
return new MySQLSyntaxErrorException(message, sqlState,
940
if (sqlState.startsWith("40")) {
941
return new MySQLTransactionRollbackException(message, sqlState,
946
return new SQLException(message, sqlState, vendorErrorCode);