Age Owner Branch data TLA Line data Source code
1 : : /* src/interfaces/ecpg/ecpglib/error.c */
2 : :
3 : : #define POSTGRES_ECPG_INTERNAL
4 : : #include "postgres_fe.h"
5 : :
6 : : #include "ecpgerrno.h"
7 : : #include "ecpglib.h"
8 : : #include "ecpglib_extern.h"
9 : : #include "ecpgtype.h"
10 : : #include "sqlca.h"
11 : :
12 : : void
6903 meskes@postgresql.or 13 :CBC 56 : ecpg_raise(int line, int code, const char *sqlstate, const char *str)
14 : : {
8474 bruce@momjian.us 15 : 56 : struct sqlca_t *sqlca = ECPGget_sqlca();
16 : :
4091 meskes@postgresql.or 17 [ - + ]: 56 : if (sqlca == NULL)
18 : : {
4091 meskes@postgresql.or 19 :UBC 0 : ecpg_log("out of memory");
20 : 0 : ECPGfree_auto_mem();
21 : 0 : return;
22 : : }
23 : :
8474 bruce@momjian.us 24 :CBC 56 : sqlca->sqlcode = code;
8427 peter_e@gmx.net 25 : 56 : strncpy(sqlca->sqlstate, sqlstate, sizeof(sqlca->sqlstate));
26 : :
8565 meskes@postgresql.or 27 [ + - - - : 56 : switch (code)
- - - - -
- + - - -
+ + - + -
- - - - -
+ - ]
28 : : {
29 : 25 : case ECPG_NOT_FOUND:
8474 bruce@momjian.us 30 : 25 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
31 : : /*------
32 : : translator: this string will be truncated at 149 characters expanded. */
6677 peter_e@gmx.net 33 : 25 : ecpg_gettext("no data found on line %d"), line);
8565 meskes@postgresql.or 34 : 25 : break;
35 : :
8565 meskes@postgresql.or 36 :UBC 0 : case ECPG_OUT_OF_MEMORY:
8474 bruce@momjian.us 37 : 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
38 : : /*------
39 : : translator: this string will be truncated at 149 characters expanded. */
6677 peter_e@gmx.net 40 : 0 : ecpg_gettext("out of memory on line %d"), line);
8565 meskes@postgresql.or 41 : 0 : break;
42 : :
43 : 0 : case ECPG_UNSUPPORTED:
8474 bruce@momjian.us 44 : 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
45 : : /*------
46 : : translator: this string will be truncated at 149 characters expanded. */
3354 tgl@sss.pgh.pa.us 47 : 0 : ecpg_gettext("unsupported type \"%s\" on line %d"), str, line);
8565 meskes@postgresql.or 48 : 0 : break;
49 : :
50 : 0 : case ECPG_TOO_MANY_ARGUMENTS:
8474 bruce@momjian.us 51 : 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
52 : : /*------
53 : : translator: this string will be truncated at 149 characters expanded. */
6677 peter_e@gmx.net 54 : 0 : ecpg_gettext("too many arguments on line %d"), line);
8565 meskes@postgresql.or 55 : 0 : break;
56 : :
57 : 0 : case ECPG_TOO_FEW_ARGUMENTS:
8474 bruce@momjian.us 58 : 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
59 : : /*------
60 : : translator: this string will be truncated at 149 characters expanded. */
6677 peter_e@gmx.net 61 : 0 : ecpg_gettext("too few arguments on line %d"), line);
8565 meskes@postgresql.or 62 : 0 : break;
63 : :
64 : 0 : case ECPG_INT_FORMAT:
8474 bruce@momjian.us 65 : 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
66 : : /*------
67 : : translator: this string will be truncated at 149 characters expanded. */
6433 peter_e@gmx.net 68 : 0 : ecpg_gettext("invalid input syntax for type int: \"%s\", on line %d"), str, line);
8565 meskes@postgresql.or 69 : 0 : break;
70 : :
71 : 0 : case ECPG_UINT_FORMAT:
8474 bruce@momjian.us 72 : 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
73 : : /*------
74 : : translator: this string will be truncated at 149 characters expanded. */
6433 peter_e@gmx.net 75 : 0 : ecpg_gettext("invalid input syntax for type unsigned int: \"%s\", on line %d"), str, line);
8565 meskes@postgresql.or 76 : 0 : break;
77 : :
78 : 0 : case ECPG_FLOAT_FORMAT:
8474 bruce@momjian.us 79 : 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
80 : : /*------
81 : : translator: this string will be truncated at 149 characters expanded. */
6433 peter_e@gmx.net 82 : 0 : ecpg_gettext("invalid input syntax for floating-point type: \"%s\", on line %d"), str, line);
8565 meskes@postgresql.or 83 : 0 : break;
84 : :
85 : 0 : case ECPG_CONVERT_BOOL:
6433 peter_e@gmx.net 86 [ # # ]: 0 : if (str)
87 : 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
88 : : /*------
89 : : translator: this string will be truncated at 149 characters expanded. */
90 : 0 : ecpg_gettext("invalid syntax for type boolean: \"%s\", on line %d"), str, line);
91 : : else
92 : 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
93 : : /*------
94 : : translator: this string will be truncated at 149 characters expanded. */
95 : 0 : ecpg_gettext("could not convert boolean value: size mismatch, on line %d"), line);
8565 meskes@postgresql.or 96 : 0 : break;
97 : :
98 : 0 : case ECPG_EMPTY:
8474 bruce@momjian.us 99 : 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
100 : : /*------
101 : : translator: this string will be truncated at 149 characters expanded. */
6677 peter_e@gmx.net 102 : 0 : ecpg_gettext("empty query on line %d"), line);
8565 meskes@postgresql.or 103 : 0 : break;
104 : :
8565 meskes@postgresql.or 105 :CBC 6 : case ECPG_MISSING_INDICATOR:
8474 bruce@momjian.us 106 : 6 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
107 : : /*------
108 : : translator: this string will be truncated at 149 characters expanded. */
3354 tgl@sss.pgh.pa.us 109 : 6 : ecpg_gettext("null value without indicator on line %d"), line);
8565 meskes@postgresql.or 110 : 6 : break;
111 : :
8565 meskes@postgresql.or 112 :UBC 0 : case ECPG_NO_ARRAY:
8474 bruce@momjian.us 113 : 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
114 : : /*------
115 : : translator: this string will be truncated at 149 characters expanded. */
6432 peter_e@gmx.net 116 : 0 : ecpg_gettext("variable does not have an array type on line %d"), line);
8565 meskes@postgresql.or 117 : 0 : break;
118 : :
119 : 0 : case ECPG_DATA_NOT_ARRAY:
8474 bruce@momjian.us 120 : 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
121 : : /*------
122 : : translator: this string will be truncated at 149 characters expanded. */
6433 peter_e@gmx.net 123 : 0 : ecpg_gettext("data read from server is not an array on line %d"), line);
8565 meskes@postgresql.or 124 : 0 : break;
125 : :
126 : 0 : case ECPG_ARRAY_INSERT:
8474 bruce@momjian.us 127 : 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
128 : : /*------
129 : : translator: this string will be truncated at 149 characters expanded. */
6286 130 : 0 : ecpg_gettext("inserting an array of variables is not supported on line %d"), line);
8565 meskes@postgresql.or 131 : 0 : break;
132 : :
17 michael@paquier.xyz 133 :CBC 2 : case ECPG_BYTEA_FORMAT:
134 : 2 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
135 : : /*------
136 : : translator: this string will be truncated at 149 characters expanded. */
137 : 2 : ecpg_gettext("invalid input syntax for type bytea: \"%s\", on line %d"), str, line);
138 : 2 : break;
139 : :
8565 meskes@postgresql.or 140 : 20 : case ECPG_NO_CONN:
8474 bruce@momjian.us 141 : 20 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
142 : : /*------
143 : : translator: this string will be truncated at 149 characters expanded. */
6286 144 : 20 : ecpg_gettext("connection \"%s\" does not exist on line %d"), str, line);
8565 meskes@postgresql.or 145 : 20 : break;
146 : :
8565 meskes@postgresql.or 147 :UBC 0 : case ECPG_NOT_CONN:
8474 bruce@momjian.us 148 : 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
149 : : /*------
150 : : translator: this string will be truncated at 149 characters expanded. */
6286 151 : 0 : ecpg_gettext("not connected to connection \"%s\" on line %d"), str, line);
8565 meskes@postgresql.or 152 : 0 : break;
153 : :
8565 meskes@postgresql.or 154 :CBC 1 : case ECPG_INVALID_STMT:
8474 bruce@momjian.us 155 : 1 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
156 : : /*------
157 : : translator: this string will be truncated at 149 characters expanded. */
6286 158 : 1 : ecpg_gettext("invalid statement name \"%s\" on line %d"), str, line);
8565 meskes@postgresql.or 159 : 1 : break;
160 : :
8565 meskes@postgresql.or 161 :UBC 0 : case ECPG_UNKNOWN_DESCRIPTOR:
8474 bruce@momjian.us 162 : 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
163 : : /*------
164 : : translator: this string will be truncated at 149 characters expanded. */
6286 165 : 0 : ecpg_gettext("descriptor \"%s\" not found on line %d"), str, line);
8565 meskes@postgresql.or 166 : 0 : break;
167 : :
168 : 0 : case ECPG_INVALID_DESCRIPTOR_INDEX:
8474 bruce@momjian.us 169 : 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
170 : : /*------
171 : : translator: this string will be truncated at 149 characters expanded. */
3354 tgl@sss.pgh.pa.us 172 : 0 : ecpg_gettext("descriptor index out of range on line %d"), line);
8565 meskes@postgresql.or 173 : 0 : break;
174 : :
175 : 0 : case ECPG_UNKNOWN_DESCRIPTOR_ITEM:
8474 bruce@momjian.us 176 : 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
177 : : /*------
178 : : translator: this string will be truncated at 149 characters expanded. */
6286 179 : 0 : ecpg_gettext("unrecognized descriptor item \"%s\" on line %d"), str, line);
8565 meskes@postgresql.or 180 : 0 : break;
181 : :
182 : 0 : case ECPG_VAR_NOT_NUMERIC:
8474 bruce@momjian.us 183 : 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
184 : : /*------
185 : : translator: this string will be truncated at 149 characters expanded. */
6286 186 : 0 : ecpg_gettext("variable does not have a numeric type on line %d"), line);
8565 meskes@postgresql.or 187 : 0 : break;
188 : :
189 : 0 : case ECPG_VAR_NOT_CHAR:
8474 bruce@momjian.us 190 : 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
191 : : /*------
192 : : translator: this string will be truncated at 149 characters expanded. */
6286 193 : 0 : ecpg_gettext("variable does not have a character type on line %d"), line);
8565 meskes@postgresql.or 194 : 0 : break;
195 : :
196 : 0 : case ECPG_TRANS:
8474 bruce@momjian.us 197 : 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
198 : : /*------
199 : : translator: this string will be truncated at 149 characters expanded. */
3354 tgl@sss.pgh.pa.us 200 : 0 : ecpg_gettext("error in transaction processing on line %d"), line);
8565 meskes@postgresql.or 201 : 0 : break;
202 : :
8565 meskes@postgresql.or 203 :CBC 2 : case ECPG_CONNECT:
8474 bruce@momjian.us 204 : 2 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
205 : : /*------
206 : : translator: this string will be truncated at 149 characters expanded. */
6286 207 : 2 : ecpg_gettext("could not connect to database \"%s\" on line %d"), str, line);
8565 meskes@postgresql.or 208 : 2 : break;
209 : :
8565 meskes@postgresql.or 210 :UBC 0 : default:
8474 bruce@momjian.us 211 : 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
212 : : /*------
213 : : translator: this string will be truncated at 149 characters expanded. */
6286 214 : 0 : ecpg_gettext("SQL error %d on line %d"), code, line);
8565 meskes@postgresql.or 215 : 0 : break;
216 : : }
217 : :
8474 bruce@momjian.us 218 :CBC 56 : sqlca->sqlerrm.sqlerrml = strlen(sqlca->sqlerrm.sqlerrmc);
6677 peter_e@gmx.net 219 : 56 : ecpg_log("raising sqlcode %d on line %d: %s\n", code, line, sqlca->sqlerrm.sqlerrmc);
220 : :
221 : : /* free all memory we have allocated for the user */
8565 meskes@postgresql.or 222 : 56 : ECPGfree_auto_mem();
223 : : }
224 : :
225 : : void
6903 226 : 13 : ecpg_raise_backend(int line, PGresult *result, PGconn *conn, int compat)
227 : : {
8427 peter_e@gmx.net 228 : 13 : struct sqlca_t *sqlca = ECPGget_sqlca();
229 : : char *sqlstate;
230 : : char *message;
231 : :
4091 meskes@postgresql.or 232 [ - + ]: 13 : if (sqlca == NULL)
233 : : {
4091 meskes@postgresql.or 234 :UBC 0 : ecpg_log("out of memory");
235 : 0 : ECPGfree_auto_mem();
236 : 0 : return;
237 : : }
238 : :
239 : : /*
240 : : * PQresultErrorField will return NULL if "result" is NULL, or if there is
241 : : * no such field, which will happen for libpq-generated errors. Fall back
242 : : * to PQerrorMessage in such cases.
243 : : */
1543 tgl@sss.pgh.pa.us 244 :CBC 13 : sqlstate = PQresultErrorField(result, PG_DIAG_SQLSTATE);
245 [ - + ]: 13 : if (sqlstate == NULL)
8420 peter_e@gmx.net 246 :UBC 0 : sqlstate = ECPG_SQLSTATE_ECPG_INTERNAL_ERROR;
1543 tgl@sss.pgh.pa.us 247 :CBC 13 : message = PQresultErrorField(result, PG_DIAG_MESSAGE_PRIMARY);
248 [ - + ]: 13 : if (message == NULL)
8420 peter_e@gmx.net 249 :UBC 0 : message = PQerrorMessage(conn);
250 : :
6016 meskes@postgresql.or 251 [ - + ]:CBC 13 : if (strcmp(sqlstate, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR) == 0)
252 : : {
253 : : /*
254 : : * we might get here if the connection breaks down, so let's check for
255 : : * this instead of giving just the generic internal error
256 : : */
6019 meskes@postgresql.or 257 [ # # ]:UBC 0 : if (PQstatus(conn) == CONNECTION_BAD)
258 : : {
259 : 0 : sqlstate = "57P02";
260 : 0 : message = ecpg_gettext("the connection to the server was lost");
261 : : }
262 : : }
263 : :
264 : : /* copy error message */
6677 peter_e@gmx.net 265 :CBC 13 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc), "%s on line %d", message, line);
8427 266 : 13 : sqlca->sqlerrm.sqlerrml = strlen(sqlca->sqlerrm.sqlerrmc);
267 : :
268 : : /* copy SQLSTATE */
8420 269 : 13 : strncpy(sqlca->sqlstate, sqlstate, sizeof(sqlca->sqlstate));
270 : :
271 : : /* assign SQLCODE for backward compatibility */
8424 bruce@momjian.us 272 [ + + ]: 13 : if (strncmp(sqlca->sqlstate, "23505", sizeof(sqlca->sqlstate)) == 0)
8427 peter_e@gmx.net 273 [ - + - - ]: 1 : sqlca->sqlcode = INFORMIX_MODE(compat) ? ECPG_INFORMIX_DUPLICATE_KEY : ECPG_DUPLICATE_KEY;
7468 meskes@postgresql.or 274 [ + + ]: 12 : else if (strncmp(sqlca->sqlstate, "21000", sizeof(sqlca->sqlstate)) == 0)
8427 peter_e@gmx.net 275 [ - + - - ]: 1 : sqlca->sqlcode = INFORMIX_MODE(compat) ? ECPG_INFORMIX_SUBSELECT_NOT_ONE : ECPG_SUBSELECT_NOT_ONE;
276 : : else
277 : 11 : sqlca->sqlcode = ECPG_PGSQL;
278 : :
5465 279 : 13 : ecpg_log("raising sqlstate %.*s (sqlcode %ld): %s\n",
5464 280 : 13 : (int) sizeof(sqlca->sqlstate), sqlca->sqlstate, sqlca->sqlcode, sqlca->sqlerrm.sqlerrmc);
281 : :
282 : : /* free all memory we have allocated for the user */
8427 283 : 13 : ECPGfree_auto_mem();
284 : : }
285 : :
286 : : /* filter out all error codes */
287 : : bool
6860 bruce@momjian.us 288 : 4643 : ecpg_check_PQresult(PGresult *results, int lineno, PGconn *connection, enum COMPAT_MODE compat)
289 : : {
6953 meskes@postgresql.or 290 [ - + ]: 4643 : if (results == NULL)
291 : : {
6019 meskes@postgresql.or 292 :UBC 0 : ecpg_log("ecpg_check_PQresult on line %d: no result - %s", lineno, PQerrorMessage(connection));
6903 293 : 0 : ecpg_raise_backend(lineno, NULL, connection, compat);
3297 peter_e@gmx.net 294 : 0 : return false;
295 : : }
296 : :
6953 meskes@postgresql.or 297 [ + - + + :CBC 4643 : switch (PQresultStatus(results))
+ - - ]
298 : : {
299 : :
300 : 1063 : case PGRES_TUPLES_OK:
3297 peter_e@gmx.net 301 : 1063 : return true;
302 : : break;
6953 meskes@postgresql.or 303 :UBC 0 : case PGRES_EMPTY_QUERY:
304 : : /* do nothing */
6903 305 : 0 : ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
6953 306 : 0 : PQclear(results);
3297 peter_e@gmx.net 307 : 0 : return false;
308 : : break;
6953 meskes@postgresql.or 309 :CBC 3566 : case PGRES_COMMAND_OK:
3297 peter_e@gmx.net 310 : 3566 : return true;
311 : : break;
6953 meskes@postgresql.or 312 : 13 : case PGRES_NONFATAL_ERROR:
313 : : case PGRES_FATAL_ERROR:
314 : : case PGRES_BAD_RESPONSE:
6019 315 : 13 : ecpg_log("ecpg_check_PQresult on line %d: bad response - %s", lineno, PQresultErrorMessage(results));
6903 316 : 13 : ecpg_raise_backend(lineno, results, connection, compat);
6953 317 : 13 : PQclear(results);
3297 peter_e@gmx.net 318 : 13 : return false;
319 : : break;
6953 meskes@postgresql.or 320 : 1 : case PGRES_COPY_OUT:
3297 peter_e@gmx.net 321 : 1 : return true;
322 : : break;
6953 meskes@postgresql.or 323 :UBC 0 : case PGRES_COPY_IN:
6677 peter_e@gmx.net 324 : 0 : ecpg_log("ecpg_check_PQresult on line %d: COPY IN data transfer in progress\n", lineno);
6953 meskes@postgresql.or 325 : 0 : PQendcopy(connection);
326 : 0 : PQclear(results);
3297 peter_e@gmx.net 327 : 0 : return false;
328 : : break;
6953 meskes@postgresql.or 329 : 0 : default:
6677 peter_e@gmx.net 330 : 0 : ecpg_log("ecpg_check_PQresult on line %d: unknown execution status type\n",
331 : : lineno);
6903 meskes@postgresql.or 332 : 0 : ecpg_raise_backend(lineno, results, connection, compat);
6953 333 : 0 : PQclear(results);
3297 peter_e@gmx.net 334 : 0 : return false;
335 : : break;
336 : : }
337 : : }
338 : :
339 : : /* print out an error message */
340 : : void
8565 meskes@postgresql.or 341 :CBC 15 : sqlprint(void)
342 : : {
8474 bruce@momjian.us 343 : 15 : struct sqlca_t *sqlca = ECPGget_sqlca();
344 : :
4091 meskes@postgresql.or 345 [ - + ]: 15 : if (sqlca == NULL)
346 : : {
4091 meskes@postgresql.or 347 :UBC 0 : ecpg_log("out of memory");
348 : 0 : return;
349 : : }
350 : :
8474 bruce@momjian.us 351 :CBC 15 : sqlca->sqlerrm.sqlerrmc[sqlca->sqlerrm.sqlerrml] = '\0';
6433 peter_e@gmx.net 352 : 15 : fprintf(stderr, ecpg_gettext("SQL error: %s\n"), sqlca->sqlerrm.sqlerrmc);
353 : : }
|