00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <config.h>
00023
00024 #include <algorithm>
00025
00026 #include <drizzled/error.h>
00027 #include <drizzled/error/sql_state.h>
00028
00029 using namespace std;
00030
00031 namespace drizzled
00032 {
00033
00034 namespace error
00035 {
00036
00037 struct sql_state_t
00038 {
00039 drizzled::error_t drizzle_errno;
00040 const char *odbc_state;
00041 const char *jdbc_state;
00042 };
00043
00044 sql_state_t sqlstate_map[]=
00045 {
00046 { ER_DUP_KEY ,"23000", "" },
00047 { ER_OUTOFMEMORY ,"HY001", "S1001" },
00048 { ER_OUT_OF_SORTMEMORY ,"HY001", "S1001" },
00049 { ER_CON_COUNT_ERROR ,"08004", "" },
00050 { ER_BAD_HOST_ERROR ,"08S01", "" },
00051 { ER_HANDSHAKE_ERROR ,"08S01", "" },
00052 { ER_DBACCESS_DENIED_ERROR ,"42000", "" },
00053 { ER_ACCESS_DENIED_ERROR ,"28000", "" },
00054 { ER_NO_DB_ERROR ,"3D000", "" },
00055 { ER_UNKNOWN_COM_ERROR ,"08S01", "" },
00056 { ER_BAD_NULL_ERROR ,"23000", "" },
00057 { ER_BAD_DB_ERROR ,"42000", "" },
00058 { ER_TABLE_EXISTS_ERROR ,"42S01", "" },
00059 { ER_BAD_TABLE_ERROR ,"42S02", "" },
00060 { ER_NON_UNIQ_ERROR ,"23000", "" },
00061 { ER_SERVER_SHUTDOWN ,"08S01", "" },
00062 { ER_BAD_FIELD_ERROR ,"42S22", "S0022" },
00063 { ER_WRONG_FIELD_WITH_GROUP ,"42000", "S1009" },
00064 { ER_WRONG_GROUP_FIELD ,"42000", "S1009" },
00065 { ER_WRONG_SUM_SELECT ,"42000", "S1009" },
00066 { ER_WRONG_VALUE_COUNT ,"21S01", "" },
00067 { ER_TOO_LONG_IDENT ,"42000", "S1009" },
00068 { ER_DUP_FIELDNAME ,"42S21", "S1009" },
00069 { ER_DUP_KEYNAME ,"42000", "S1009" },
00070 { ER_DUP_ENTRY ,"23000", "S1009" },
00071 { ER_WRONG_FIELD_SPEC ,"42000", "S1009" },
00072 { ER_PARSE_ERROR ,"42000", "s1009" },
00073 { ER_EMPTY_QUERY ,"42000", "" },
00074 { ER_NONUNIQ_TABLE ,"42000", "S1009" },
00075 { ER_INVALID_DEFAULT ,"42000", "S1009" },
00076 { ER_MULTIPLE_PRI_KEY ,"42000", "S1009" },
00077 { ER_TOO_MANY_KEYS ,"42000", "S1009" },
00078 { ER_TOO_MANY_KEY_PARTS ,"42000", "S1009" },
00079 { ER_TOO_LONG_KEY ,"42000", "S1009" },
00080 { ER_KEY_COLUMN_DOES_NOT_EXITS ,"42000", "S1009" },
00081 { ER_BLOB_USED_AS_KEY ,"42000", "S1009" },
00082 { ER_TOO_BIG_FIELDLENGTH ,"42000", "S1009" },
00083 { ER_WRONG_AUTO_KEY ,"42000", "S1009" },
00084 { ER_FORCING_CLOSE ,"08S01", "" },
00085 { ER_IPSOCK_ERROR ,"08S01", "" },
00086 { ER_NO_SUCH_INDEX ,"42S12", "S1009" },
00087 { ER_WRONG_FIELD_TERMINATORS ,"42000", "S1009" },
00088 { ER_BLOBS_AND_NO_TERMINATED ,"42000", "S1009" },
00089 { ER_CANT_REMOVE_ALL_FIELDS ,"42000", "" },
00090 { ER_CANT_DROP_FIELD_OR_KEY ,"42000", "" },
00091 { ER_BLOB_CANT_HAVE_DEFAULT ,"42000", "" },
00092 { ER_WRONG_DB_NAME ,"42000", "" },
00093 { ER_WRONG_TABLE_NAME ,"42000", "" },
00094 { ER_TOO_BIG_SELECT ,"42000", "" },
00095 { ER_UNKNOWN_PROCEDURE ,"42000", "" },
00096 { ER_WRONG_PARAMCOUNT_TO_PROCEDURE ,"42000", "" },
00097 { ER_UNKNOWN_TABLE ,"42S02", "" },
00098 { ER_FIELD_SPECIFIED_TWICE ,"42000", "" },
00099 { ER_UNSUPPORTED_EXTENSION ,"42000", "" },
00100 { ER_TABLE_MUST_HAVE_COLUMNS ,"42000", "" },
00101 { ER_TOO_BIG_ROWSIZE ,"42000", "" },
00102 { ER_WRONG_OUTER_JOIN ,"42000", "" },
00103 { ER_NULL_COLUMN_IN_INDEX ,"42000", "" },
00104 { ER_WRONG_VALUE_COUNT_ON_ROW ,"21S01", "" },
00105 { ER_MIX_OF_GROUP_FUNC_AND_FIELDS ,"42000", "" },
00106 { ER_TABLE_UNKNOWN ,"42S02", "" },
00107 { ER_SYNTAX_ERROR ,"42000", "" },
00108 { ER_NET_PACKET_TOO_LARGE ,"08S01", "" },
00109 { ER_NET_PACKETS_OUT_OF_ORDER ,"08S01", "" },
00110 { ER_TABLE_CANT_HANDLE_BLOB ,"42000", "" },
00111 { ER_TABLE_CANT_HANDLE_AUTO_INCREMENT ,"42000", "" },
00112 { ER_WRONG_COLUMN_NAME ,"42000", "" },
00113 { ER_WRONG_KEY_COLUMN ,"42000", "" },
00114 { ER_DUP_UNIQUE ,"23000", "" },
00115 { ER_BLOB_KEY_WITHOUT_LENGTH ,"42000", "" },
00116 { ER_PRIMARY_CANT_HAVE_NULL ,"42000", "" },
00117 { ER_TOO_MANY_ROWS ,"42000", "" },
00118 { ER_REQUIRES_PRIMARY_KEY ,"42000", "" },
00119 { ER_KEY_DOES_NOT_EXITS ,"42000", "S1009" },
00120 { ER_CHECK_NO_SUCH_TABLE ,"42000", "" },
00121 { ER_CHECK_NOT_IMPLEMENTED ,"42000", "" },
00122 { ER_NEW_ABORTING_CONNECTION ,"08S01", "" },
00123 { ER_READ_ONLY_TRANSACTION ,"25000", "" },
00124 { ER_LOCK_DEADLOCK ,"40001", "" },
00125 { ER_NO_REFERENCED_ROW ,"23000", "" },
00126 { ER_ROW_IS_REFERENCED ,"23000", "" },
00127 { ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT ,"21000", "" },
00128 { ER_NO_DEFAULT ,"42000", "" },
00129 { ER_WRONG_VALUE_FOR_VAR ,"42000", "" },
00130 { ER_WRONG_TYPE_FOR_VAR ,"42000", "" },
00131 { ER_CANT_USE_OPTION_HERE ,"42000", "" },
00132 { ER_NOT_SUPPORTED_YET ,"42000", "" },
00133 { ER_WRONG_FK_DEF ,"42000", "" },
00134 { ER_OPERAND_COLUMNS ,"21000", "" },
00135 { ER_SUBQUERY_NO_1_ROW ,"21000", "" },
00136 { ER_ILLEGAL_REFERENCE ,"42S22", "" },
00137 { ER_DERIVED_MUST_HAVE_ALIAS ,"42000", "" },
00138 { ER_SELECT_REDUCED ,"01000", "" },
00139 { ER_TABLENAME_NOT_ALLOWED_HERE ,"42000", "" },
00140 { ER_SPATIAL_CANT_HAVE_NULL ,"42000", "" },
00141 { ER_COLLATION_CHARSET_MISMATCH ,"42000", "" },
00142 { ER_WARN_TOO_FEW_RECORDS ,"01000", "" },
00143 { ER_WARN_TOO_MANY_RECORDS ,"01000", "" },
00144 { ER_WARN_NULL_TO_NOTNULL ,"22004", "" },
00145 { ER_WARN_DATA_OUT_OF_RANGE ,"22003", "" },
00146 { ER_WARN_DATA_TRUNCATED ,"01000", "" },
00147 { ER_WRONG_NAME_FOR_INDEX ,"42000", "" },
00148 { ER_WRONG_NAME_FOR_CATALOG ,"42000", "" },
00149 { ER_UNKNOWN_STORAGE_ENGINE ,"42000", "" },
00150 { ER_TRUNCATED_WRONG_VALUE ,"22007", "" },
00151 { ER_SP_DOES_NOT_EXIST ,"42000", "" },
00152 { ER_QUERY_INTERRUPTED ,"70100", "" },
00153 { ER_DIVISION_BY_ZERO ,"22012", "" },
00154 { ER_ILLEGAL_VALUE_FOR_TYPE ,"22007", "" },
00155 { ER_XAER_RMFAIL ,"XAE07", "" },
00156 { ER_DATA_TOO_LONG ,"22001", "" },
00157 { ER_SP_NO_RETSET ,"0A000", "" },
00158 { ER_CANT_CREATE_GEOMETRY_OBJECT ,"22003", "" },
00159 { ER_TOO_BIG_SCALE ,"42000", "S1009" },
00160 { ER_TOO_BIG_PRECISION ,"42000", "S1009" },
00161 { ER_M_BIGGER_THAN_D ,"42000", "S1009" },
00162 { ER_TOO_BIG_DISPLAYWIDTH ,"42000", "S1009" },
00163 { ER_DATETIME_FUNCTION_OVERFLOW ,"22008", "" },
00164 { ER_ROW_IS_REFERENCED_2 ,"23000", "" },
00165 { ER_NO_REFERENCED_ROW_2 ,"23000", "" },
00166 { ER_NON_GROUPING_FIELD_USED ,"42000", "" },
00167 { ER_FOREIGN_DUPLICATE_KEY ,"23000", "S1009" },
00168 { ER_CANT_CHANGE_TX_ISOLATION ,"25001", "" },
00169 { ER_WRONG_PARAMCOUNT_TO_FUNCTION ,"42000", "" },
00170 { ER_WRONG_PARAMETERS_TO_NATIVE_FCT ,"42000", "" },
00171 { ER_DUP_ENTRY_WITH_KEY_NAME ,"23000", "S1009" },
00172 };
00173
00174 static bool compare_errno_map(sql_state_t a,
00175 sql_state_t b)
00176 {
00177 return (a.drizzle_errno < b.drizzle_errno);
00178 }
00179
00180 const char *convert_to_sqlstate(drizzled::error_t drizzle_errno)
00181 {
00182
00183 sql_state_t drizzle_err_state= {drizzle_errno, NULL, NULL};
00184 sql_state_t* result=
00185 lower_bound(&sqlstate_map[0],
00186 &sqlstate_map[sizeof(sqlstate_map)/sizeof(*sqlstate_map)],
00187 drizzle_err_state, compare_errno_map);
00188
00189 if ((*result).drizzle_errno == drizzle_errno)
00190 return (*result).odbc_state;
00191
00192
00193 return "HY000";
00194 }
00195
00196 }
00197 }