PostgreSQL Source Code git master
error.c File Reference
#include "postgres_fe.h"
#include "ecpgerrno.h"
#include "ecpglib.h"
#include "ecpglib_extern.h"
#include "ecpgtype.h"
#include "sqlca.h"
Include dependency graph for error.c:

Go to the source code of this file.

Macros

#define POSTGRES_ECPG_INTERNAL
 

Functions

void ecpg_raise (int line, int code, const char *sqlstate, const char *str)
 
void ecpg_raise_backend (int line, PGresult *result, PGconn *conn, int compat)
 
bool ecpg_check_PQresult (PGresult *results, int lineno, PGconn *connection, enum COMPAT_MODE compat)
 
void sqlprint (void)
 

Macro Definition Documentation

◆ POSTGRES_ECPG_INTERNAL

#define POSTGRES_ECPG_INTERNAL

Definition at line 3 of file error.c.

Function Documentation

◆ ecpg_check_PQresult()

bool ecpg_check_PQresult ( PGresult results,
int  lineno,
PGconn connection,
enum COMPAT_MODE  compat 
)

Definition at line 281 of file error.c.

282{
283 if (results == NULL)
284 {
285 ecpg_log("ecpg_check_PQresult on line %d: no result - %s", lineno, PQerrorMessage(connection));
286 ecpg_raise_backend(lineno, NULL, connection, compat);
287 return false;
288 }
289
290 switch (PQresultStatus(results))
291 {
292
293 case PGRES_TUPLES_OK:
294 return true;
295 break;
297 /* do nothing */
299 PQclear(results);
300 return false;
301 break;
302 case PGRES_COMMAND_OK:
303 return true;
304 break;
308 ecpg_log("ecpg_check_PQresult on line %d: bad response - %s", lineno, PQresultErrorMessage(results));
309 ecpg_raise_backend(lineno, results, connection, compat);
310 PQclear(results);
311 return false;
312 break;
313 case PGRES_COPY_OUT:
314 return true;
315 break;
316 case PGRES_COPY_IN:
317 ecpg_log("ecpg_check_PQresult on line %d: COPY IN data transfer in progress\n", lineno);
319 PQclear(results);
320 return false;
321 break;
322 default:
323 ecpg_log("ecpg_check_PQresult on line %d: unknown execution status type\n",
324 lineno);
325 ecpg_raise_backend(lineno, results, connection, compat);
326 PQclear(results);
327 return false;
328 break;
329 }
330}
enum COMPAT_MODE compat
Definition: ecpg.c:26
#define ECPG_EMPTY
Definition: ecpgerrno.h:30
#define ECPG_SQLSTATE_ECPG_INTERNAL_ERROR
void ecpg_log(const char *format,...) pg_attribute_printf(1
void ecpg_raise(int line, int code, const char *sqlstate, const char *str)
Definition: error.c:13
void ecpg_raise_backend(int line, PGresult *result, PGconn *conn, int compat)
Definition: error.c:219
char * PQerrorMessage(const PGconn *conn)
Definition: fe-connect.c:7268
ExecStatusType PQresultStatus(const PGresult *res)
Definition: fe-exec.c:3411
int PQendcopy(PGconn *conn)
Definition: fe-exec.c:2949
char * PQresultErrorMessage(const PGresult *res)
Definition: fe-exec.c:3427
@ PGRES_COPY_IN
Definition: libpq-fe.h:127
@ PGRES_COMMAND_OK
Definition: libpq-fe.h:120
@ PGRES_FATAL_ERROR
Definition: libpq-fe.h:131
@ PGRES_COPY_OUT
Definition: libpq-fe.h:126
@ PGRES_EMPTY_QUERY
Definition: libpq-fe.h:119
@ PGRES_BAD_RESPONSE
Definition: libpq-fe.h:128
@ PGRES_NONFATAL_ERROR
Definition: libpq-fe.h:130
@ PGRES_TUPLES_OK
Definition: libpq-fe.h:123

References compat, ECPG_EMPTY, ecpg_log(), ecpg_raise(), ecpg_raise_backend(), ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, PGRES_BAD_RESPONSE, PGRES_COMMAND_OK, PGRES_COPY_IN, PGRES_COPY_OUT, PGRES_EMPTY_QUERY, PGRES_FATAL_ERROR, PGRES_NONFATAL_ERROR, PGRES_TUPLES_OK, PQclear(), PQendcopy(), PQerrorMessage(), PQresultErrorMessage(), and PQresultStatus().

Referenced by deallocate_one(), ecpg_autostart_transaction(), ecpg_execute(), ecpg_is_type_an_array(), ECPGdescribe(), ECPGsetcommit(), ECPGtrans(), and prepare_common().

◆ ecpg_raise()

void ecpg_raise ( int  line,
int  code,
const char *  sqlstate,
const char *  str 
)

Definition at line 13 of file error.c.

14{
15 struct sqlca_t *sqlca = ECPGget_sqlca();
16
17 if (sqlca == NULL)
18 {
19 ecpg_log("out of memory");
21 return;
22 }
23
24 sqlca->sqlcode = code;
25 strncpy(sqlca->sqlstate, sqlstate, sizeof(sqlca->sqlstate));
26
27 switch (code)
28 {
29 case ECPG_NOT_FOUND:
30 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
31 /*------
32 translator: this string will be truncated at 149 characters expanded. */
33 ecpg_gettext("no data found on line %d"), line);
34 break;
35
37 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
38 /*------
39 translator: this string will be truncated at 149 characters expanded. */
40 ecpg_gettext("out of memory on line %d"), line);
41 break;
42
44 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
45 /*------
46 translator: this string will be truncated at 149 characters expanded. */
47 ecpg_gettext("unsupported type \"%s\" on line %d"), str, line);
48 break;
49
51 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
52 /*------
53 translator: this string will be truncated at 149 characters expanded. */
54 ecpg_gettext("too many arguments on line %d"), line);
55 break;
56
58 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
59 /*------
60 translator: this string will be truncated at 149 characters expanded. */
61 ecpg_gettext("too few arguments on line %d"), line);
62 break;
63
64 case ECPG_INT_FORMAT:
65 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
66 /*------
67 translator: this string will be truncated at 149 characters expanded. */
68 ecpg_gettext("invalid input syntax for type int: \"%s\", on line %d"), str, line);
69 break;
70
72 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
73 /*------
74 translator: this string will be truncated at 149 characters expanded. */
75 ecpg_gettext("invalid input syntax for type unsigned int: \"%s\", on line %d"), str, line);
76 break;
77
79 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
80 /*------
81 translator: this string will be truncated at 149 characters expanded. */
82 ecpg_gettext("invalid input syntax for floating-point type: \"%s\", on line %d"), str, line);
83 break;
84
86 if (str)
87 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
88 /*------
89 translator: this string will be truncated at 149 characters expanded. */
90 ecpg_gettext("invalid syntax for type boolean: \"%s\", on line %d"), str, line);
91 else
92 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
93 /*------
94 translator: this string will be truncated at 149 characters expanded. */
95 ecpg_gettext("could not convert boolean value: size mismatch, on line %d"), line);
96 break;
97
98 case ECPG_EMPTY:
99 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
100 /*------
101 translator: this string will be truncated at 149 characters expanded. */
102 ecpg_gettext("empty query on line %d"), line);
103 break;
104
106 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
107 /*------
108 translator: this string will be truncated at 149 characters expanded. */
109 ecpg_gettext("null value without indicator on line %d"), line);
110 break;
111
112 case ECPG_NO_ARRAY:
113 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
114 /*------
115 translator: this string will be truncated at 149 characters expanded. */
116 ecpg_gettext("variable does not have an array type on line %d"), line);
117 break;
118
120 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
121 /*------
122 translator: this string will be truncated at 149 characters expanded. */
123 ecpg_gettext("data read from server is not an array on line %d"), line);
124 break;
125
127 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
128 /*------
129 translator: this string will be truncated at 149 characters expanded. */
130 ecpg_gettext("inserting an array of variables is not supported on line %d"), line);
131 break;
132
133 case ECPG_NO_CONN:
134 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
135 /*------
136 translator: this string will be truncated at 149 characters expanded. */
137 ecpg_gettext("connection \"%s\" does not exist on line %d"), str, line);
138 break;
139
140 case ECPG_NOT_CONN:
141 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
142 /*------
143 translator: this string will be truncated at 149 characters expanded. */
144 ecpg_gettext("not connected to connection \"%s\" on line %d"), str, line);
145 break;
146
148 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
149 /*------
150 translator: this string will be truncated at 149 characters expanded. */
151 ecpg_gettext("invalid statement name \"%s\" on line %d"), str, line);
152 break;
153
155 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
156 /*------
157 translator: this string will be truncated at 149 characters expanded. */
158 ecpg_gettext("descriptor \"%s\" not found on line %d"), str, line);
159 break;
160
162 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
163 /*------
164 translator: this string will be truncated at 149 characters expanded. */
165 ecpg_gettext("descriptor index out of range on line %d"), line);
166 break;
167
169 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
170 /*------
171 translator: this string will be truncated at 149 characters expanded. */
172 ecpg_gettext("unrecognized descriptor item \"%s\" on line %d"), str, line);
173 break;
174
176 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
177 /*------
178 translator: this string will be truncated at 149 characters expanded. */
179 ecpg_gettext("variable does not have a numeric type on line %d"), line);
180 break;
181
183 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
184 /*------
185 translator: this string will be truncated at 149 characters expanded. */
186 ecpg_gettext("variable does not have a character type on line %d"), line);
187 break;
188
189 case ECPG_TRANS:
190 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
191 /*------
192 translator: this string will be truncated at 149 characters expanded. */
193 ecpg_gettext("error in transaction processing on line %d"), line);
194 break;
195
196 case ECPG_CONNECT:
197 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
198 /*------
199 translator: this string will be truncated at 149 characters expanded. */
200 ecpg_gettext("could not connect to database \"%s\" on line %d"), str, line);
201 break;
202
203 default:
204 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
205 /*------
206 translator: this string will be truncated at 149 characters expanded. */
207 ecpg_gettext("SQL error %d on line %d"), code, line);
208 break;
209 }
210
211 sqlca->sqlerrm.sqlerrml = strlen(sqlca->sqlerrm.sqlerrmc);
212 ecpg_log("raising sqlcode %d on line %d: %s\n", code, line, sqlca->sqlerrm.sqlerrmc);
213
214 /* free all memory we have allocated for the user */
216}
#define ECPG_CONVERT_BOOL
Definition: ecpgerrno.h:29
#define ECPG_UNKNOWN_DESCRIPTOR
Definition: ecpgerrno.h:42
#define ECPG_TOO_MANY_ARGUMENTS
Definition: ecpgerrno.h:19
#define ECPG_TOO_FEW_ARGUMENTS
Definition: ecpgerrno.h:20
#define ECPG_UNSUPPORTED
Definition: ecpgerrno.h:18
#define ECPG_ARRAY_INSERT
Definition: ecpgerrno.h:34
#define ECPG_FLOAT_FORMAT
Definition: ecpgerrno.h:24
#define ECPG_INT_FORMAT
Definition: ecpgerrno.h:22
#define ECPG_UNKNOWN_DESCRIPTOR_ITEM
Definition: ecpgerrno.h:44
#define ECPG_MISSING_INDICATOR
Definition: ecpgerrno.h:31
#define ECPG_INVALID_DESCRIPTOR_INDEX
Definition: ecpgerrno.h:43
#define ECPG_INVALID_STMT
Definition: ecpgerrno.h:39
#define ECPG_VAR_NOT_NUMERIC
Definition: ecpgerrno.h:45
#define ECPG_VAR_NOT_CHAR
Definition: ecpgerrno.h:46
#define ECPG_UINT_FORMAT
Definition: ecpgerrno.h:23
#define ECPG_OUT_OF_MEMORY
Definition: ecpgerrno.h:15
#define ECPG_NOT_CONN
Definition: ecpgerrno.h:37
#define ECPG_NOT_FOUND
Definition: ecpgerrno.h:10
#define ECPG_DATA_NOT_ARRAY
Definition: ecpgerrno.h:33
#define ECPG_TRANS
Definition: ecpgerrno.h:50
#define ECPG_NO_ARRAY
Definition: ecpgerrno.h:32
#define ECPG_NO_CONN
Definition: ecpgerrno.h:36
#define ECPG_CONNECT
Definition: ecpgerrno.h:51
#define ecpg_gettext(x)
const char * str
struct sqlca_t * ECPGget_sqlca(void)
Definition: misc.c:108
void ECPGfree_auto_mem(void)
Definition: memory.c:131
#define snprintf
Definition: port.h:238
#define sqlca
Definition: sqlca.h:59
Definition: sqlca.h:20
char sqlstate[5]
Definition: sqlca.h:53

References ECPG_ARRAY_INSERT, ECPG_CONNECT, ECPG_CONVERT_BOOL, ECPG_DATA_NOT_ARRAY, ECPG_EMPTY, ECPG_FLOAT_FORMAT, ecpg_gettext, ECPG_INT_FORMAT, ECPG_INVALID_DESCRIPTOR_INDEX, ECPG_INVALID_STMT, ecpg_log(), ECPG_MISSING_INDICATOR, ECPG_NO_ARRAY, ECPG_NO_CONN, ECPG_NOT_CONN, ECPG_NOT_FOUND, ECPG_OUT_OF_MEMORY, ECPG_TOO_FEW_ARGUMENTS, ECPG_TOO_MANY_ARGUMENTS, ECPG_TRANS, ECPG_UINT_FORMAT, ECPG_UNKNOWN_DESCRIPTOR, ECPG_UNKNOWN_DESCRIPTOR_ITEM, ECPG_UNSUPPORTED, ECPG_VAR_NOT_CHAR, ECPG_VAR_NOT_NUMERIC, ECPGfree_auto_mem(), ECPGget_sqlca(), snprintf, sqlca, sqlca_t::sqlstate, and str.

Referenced by deallocate_one(), ecpg_alloc(), ecpg_build_params(), ecpg_check_PQresult(), ecpg_do_prologue(), ecpg_find_desc(), ecpg_get_data(), ecpg_init(), ecpg_process_output(), ecpg_realloc(), ecpg_store_input(), ecpg_store_result(), ecpg_strdup(), ECPGallocate_desc(), ECPGconnect(), ECPGdeallocate(), ECPGdeallocate_desc(), ECPGdescribe(), ECPGdisconnect(), ECPGget_desc(), ECPGget_desc_header(), ECPGset_desc(), ECPGset_var(), ECPGstatus(), get_char_item(), get_int_item(), and set_int_item().

◆ ecpg_raise_backend()

void ecpg_raise_backend ( int  line,
PGresult result,
PGconn conn,
int  compat 
)

Definition at line 219 of file error.c.

220{
221 struct sqlca_t *sqlca = ECPGget_sqlca();
222 char *sqlstate;
223 char *message;
224
225 if (sqlca == NULL)
226 {
227 ecpg_log("out of memory");
229 return;
230 }
231
232 /*
233 * PQresultErrorField will return NULL if "result" is NULL, or if there is
234 * no such field, which will happen for libpq-generated errors. Fall back
235 * to PQerrorMessage in such cases.
236 */
238 if (sqlstate == NULL)
241 if (message == NULL)
242 message = PQerrorMessage(conn);
243
245 {
246 /*
247 * we might get here if the connection breaks down, so let's check for
248 * this instead of giving just the generic internal error
249 */
251 {
252 sqlstate = "57P02";
253 message = ecpg_gettext("the connection to the server was lost");
254 }
255 }
256
257 /* copy error message */
258 snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc), "%s on line %d", message, line);
259 sqlca->sqlerrm.sqlerrml = strlen(sqlca->sqlerrm.sqlerrmc);
260
261 /* copy SQLSTATE */
262 strncpy(sqlca->sqlstate, sqlstate, sizeof(sqlca->sqlstate));
263
264 /* assign SQLCODE for backward compatibility */
265 if (strncmp(sqlca->sqlstate, "23505", sizeof(sqlca->sqlstate)) == 0)
267 else if (strncmp(sqlca->sqlstate, "21000", sizeof(sqlca->sqlstate)) == 0)
269 else
270 sqlca->sqlcode = ECPG_PGSQL;
271
272 ecpg_log("raising sqlstate %.*s (sqlcode %ld): %s\n",
273 (int) sizeof(sqlca->sqlstate), sqlca->sqlstate, sqlca->sqlcode, sqlca->sqlerrm.sqlerrmc);
274
275 /* free all memory we have allocated for the user */
277}
#define ECPG_PGSQL
Definition: ecpgerrno.h:49
#define ECPG_SUBSELECT_NOT_ONE
Definition: ecpgerrno.h:53
#define ECPG_INFORMIX_SUBSELECT_NOT_ONE
Definition: ecpgerrno.h:58
#define ECPG_DUPLICATE_KEY
Definition: ecpgerrno.h:52
#define ECPG_INFORMIX_DUPLICATE_KEY
Definition: ecpgerrno.h:57
#define INFORMIX_MODE(X)
ConnStatusType PQstatus(const PGconn *conn)
Definition: fe-connect.c:7205
char * PQresultErrorField(const PGresult *res, int fieldcode)
Definition: fe-exec.c:3466
@ CONNECTION_BAD
Definition: libpq-fe.h:82
#define PG_DIAG_SQLSTATE
Definition: postgres_ext.h:57
#define PG_DIAG_MESSAGE_PRIMARY
Definition: postgres_ext.h:58
PGconn * conn
Definition: streamutil.c:53

References compat, conn, CONNECTION_BAD, ECPG_DUPLICATE_KEY, ecpg_gettext, ECPG_INFORMIX_DUPLICATE_KEY, ECPG_INFORMIX_SUBSELECT_NOT_ONE, ecpg_log(), ECPG_PGSQL, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, ECPG_SUBSELECT_NOT_ONE, ECPGfree_auto_mem(), ECPGget_sqlca(), INFORMIX_MODE, PG_DIAG_MESSAGE_PRIMARY, PG_DIAG_SQLSTATE, PQerrorMessage(), PQresultErrorField(), PQstatus(), snprintf, sqlca, and sqlca_t::sqlstate.

Referenced by ecpg_check_PQresult(), and ecpg_process_output().

◆ sqlprint()

void sqlprint ( void  )

Definition at line 334 of file error.c.

335{
336 struct sqlca_t *sqlca = ECPGget_sqlca();
337
338 if (sqlca == NULL)
339 {
340 ecpg_log("out of memory");
341 return;
342 }
343
344 sqlca->sqlerrm.sqlerrmc[sqlca->sqlerrm.sqlerrml] = '\0';
345 fprintf(stderr, ecpg_gettext("SQL error: %s\n"), sqlca->sqlerrm.sqlerrmc);
346}
#define fprintf(file, fmt, msg)
Definition: cubescan.l:21

References ecpg_gettext, ecpg_log(), ECPGget_sqlca(), fprintf, and sqlca.

Referenced by check_result_of_insert(), commitTable(), execute_test(), fn(), main(), print(), print2(), test(), and test_thread().