LCOV - code coverage report
Current view: top level - src/interfaces/ecpg/ecpglib - error.c (source / functions) Coverage Total Hit
Test: Code coverage Lines: 0.0 % 157 0
Test Date: 2026-01-26 10:56:24 Functions: 0.0 % 4 0
Legend: Lines:     hit not hit

            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
      13            0 : ecpg_raise(int line, int code, const char *sqlstate, const char *str)
      14              : {
      15            0 :         struct sqlca_t *sqlca = ECPGget_sqlca();
      16              : 
      17            0 :         if (sqlca == NULL)
      18              :         {
      19            0 :                 ecpg_log("out of memory");
      20            0 :                 ECPGfree_auto_mem();
      21            0 :                 return;
      22              :         }
      23              : 
      24            0 :         sqlca->sqlcode = code;
      25            0 :         strncpy(sqlca->sqlstate, sqlstate, sizeof(sqlca->sqlstate));
      26              : 
      27            0 :         switch (code)
      28              :         {
      29              :                 case ECPG_NOT_FOUND:
      30            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
      31              :                         /*------
      32              :                            translator: this string will be truncated at 149 characters expanded.  */
      33            0 :                                          ecpg_gettext("no data found on line %d"), line);
      34            0 :                         break;
      35              : 
      36              :                 case ECPG_OUT_OF_MEMORY:
      37            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
      38              :                         /*------
      39              :                            translator: this string will be truncated at 149 characters expanded.  */
      40            0 :                                          ecpg_gettext("out of memory on line %d"), line);
      41            0 :                         break;
      42              : 
      43              :                 case ECPG_UNSUPPORTED:
      44            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
      45              :                         /*------
      46              :                            translator: this string will be truncated at 149 characters expanded.  */
      47            0 :                                          ecpg_gettext("unsupported type \"%s\" on line %d"), str, line);
      48            0 :                         break;
      49              : 
      50              :                 case ECPG_TOO_MANY_ARGUMENTS:
      51            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
      52              :                         /*------
      53              :                            translator: this string will be truncated at 149 characters expanded.  */
      54            0 :                                          ecpg_gettext("too many arguments on line %d"), line);
      55            0 :                         break;
      56              : 
      57              :                 case ECPG_TOO_FEW_ARGUMENTS:
      58            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
      59              :                         /*------
      60              :                            translator: this string will be truncated at 149 characters expanded.  */
      61            0 :                                          ecpg_gettext("too few arguments on line %d"), line);
      62            0 :                         break;
      63              : 
      64              :                 case ECPG_INT_FORMAT:
      65            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
      66              :                         /*------
      67              :                            translator: this string will be truncated at 149 characters expanded.  */
      68            0 :                                          ecpg_gettext("invalid input syntax for type int: \"%s\", on line %d"), str, line);
      69            0 :                         break;
      70              : 
      71              :                 case ECPG_UINT_FORMAT:
      72            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
      73              :                         /*------
      74              :                            translator: this string will be truncated at 149 characters expanded.  */
      75            0 :                                          ecpg_gettext("invalid input syntax for type unsigned int: \"%s\", on line %d"), str, line);
      76            0 :                         break;
      77              : 
      78              :                 case ECPG_FLOAT_FORMAT:
      79            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
      80              :                         /*------
      81              :                            translator: this string will be truncated at 149 characters expanded.  */
      82            0 :                                          ecpg_gettext("invalid input syntax for floating-point type: \"%s\", on line %d"), str, line);
      83            0 :                         break;
      84              : 
      85              :                 case ECPG_CONVERT_BOOL:
      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);
      96            0 :                         break;
      97              : 
      98              :                 case ECPG_EMPTY:
      99            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
     100              :                         /*------
     101              :                            translator: this string will be truncated at 149 characters expanded.  */
     102            0 :                                          ecpg_gettext("empty query on line %d"), line);
     103            0 :                         break;
     104              : 
     105              :                 case ECPG_MISSING_INDICATOR:
     106            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
     107              :                         /*------
     108              :                            translator: this string will be truncated at 149 characters expanded.  */
     109            0 :                                          ecpg_gettext("null value without indicator on line %d"), line);
     110            0 :                         break;
     111              : 
     112              :                 case ECPG_NO_ARRAY:
     113            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
     114              :                         /*------
     115              :                            translator: this string will be truncated at 149 characters expanded.  */
     116            0 :                                          ecpg_gettext("variable does not have an array type on line %d"), line);
     117            0 :                         break;
     118              : 
     119              :                 case ECPG_DATA_NOT_ARRAY:
     120            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
     121              :                         /*------
     122              :                            translator: this string will be truncated at 149 characters expanded.  */
     123            0 :                                          ecpg_gettext("data read from server is not an array on line %d"), line);
     124            0 :                         break;
     125              : 
     126              :                 case ECPG_ARRAY_INSERT:
     127            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
     128              :                         /*------
     129              :                            translator: this string will be truncated at 149 characters expanded.  */
     130            0 :                                          ecpg_gettext("inserting an array of variables is not supported on line %d"), line);
     131            0 :                         break;
     132              : 
     133              :                 case ECPG_NO_CONN:
     134            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
     135              :                         /*------
     136              :                            translator: this string will be truncated at 149 characters expanded.  */
     137            0 :                                          ecpg_gettext("connection \"%s\" does not exist on line %d"), str, line);
     138            0 :                         break;
     139              : 
     140              :                 case ECPG_NOT_CONN:
     141            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
     142              :                         /*------
     143              :                            translator: this string will be truncated at 149 characters expanded.  */
     144            0 :                                          ecpg_gettext("not connected to connection \"%s\" on line %d"), str, line);
     145            0 :                         break;
     146              : 
     147              :                 case ECPG_INVALID_STMT:
     148            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
     149              :                         /*------
     150              :                            translator: this string will be truncated at 149 characters expanded.  */
     151            0 :                                          ecpg_gettext("invalid statement name \"%s\" on line %d"), str, line);
     152            0 :                         break;
     153              : 
     154              :                 case ECPG_UNKNOWN_DESCRIPTOR:
     155            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
     156              :                         /*------
     157              :                            translator: this string will be truncated at 149 characters expanded.  */
     158            0 :                                          ecpg_gettext("descriptor \"%s\" not found on line %d"), str, line);
     159            0 :                         break;
     160              : 
     161              :                 case ECPG_INVALID_DESCRIPTOR_INDEX:
     162            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
     163              :                         /*------
     164              :                            translator: this string will be truncated at 149 characters expanded.  */
     165            0 :                                          ecpg_gettext("descriptor index out of range on line %d"), line);
     166            0 :                         break;
     167              : 
     168              :                 case ECPG_UNKNOWN_DESCRIPTOR_ITEM:
     169            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
     170              :                         /*------
     171              :                            translator: this string will be truncated at 149 characters expanded.  */
     172            0 :                                          ecpg_gettext("unrecognized descriptor item \"%s\" on line %d"), str, line);
     173            0 :                         break;
     174              : 
     175              :                 case ECPG_VAR_NOT_NUMERIC:
     176            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
     177              :                         /*------
     178              :                            translator: this string will be truncated at 149 characters expanded.  */
     179            0 :                                          ecpg_gettext("variable does not have a numeric type on line %d"), line);
     180            0 :                         break;
     181              : 
     182              :                 case ECPG_VAR_NOT_CHAR:
     183            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
     184              :                         /*------
     185              :                            translator: this string will be truncated at 149 characters expanded.  */
     186            0 :                                          ecpg_gettext("variable does not have a character type on line %d"), line);
     187            0 :                         break;
     188              : 
     189              :                 case ECPG_TRANS:
     190            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
     191              :                         /*------
     192              :                            translator: this string will be truncated at 149 characters expanded.  */
     193            0 :                                          ecpg_gettext("error in transaction processing on line %d"), line);
     194            0 :                         break;
     195              : 
     196              :                 case ECPG_CONNECT:
     197            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
     198              :                         /*------
     199              :                            translator: this string will be truncated at 149 characters expanded.  */
     200            0 :                                          ecpg_gettext("could not connect to database \"%s\" on line %d"), str, line);
     201            0 :                         break;
     202              : 
     203              :                 default:
     204            0 :                         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
     205              :                         /*------
     206              :                            translator: this string will be truncated at 149 characters expanded.  */
     207            0 :                                          ecpg_gettext("SQL error %d on line %d"), code, line);
     208            0 :                         break;
     209              :         }
     210              : 
     211            0 :         sqlca->sqlerrm.sqlerrml = strlen(sqlca->sqlerrm.sqlerrmc);
     212            0 :         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 */
     215            0 :         ECPGfree_auto_mem();
     216            0 : }
     217              : 
     218              : void
     219            0 : ecpg_raise_backend(int line, PGresult *result, PGconn *conn, int compat)
     220              : {
     221            0 :         struct sqlca_t *sqlca = ECPGget_sqlca();
     222            0 :         char       *sqlstate;
     223            0 :         char       *message;
     224              : 
     225            0 :         if (sqlca == NULL)
     226              :         {
     227            0 :                 ecpg_log("out of memory");
     228            0 :                 ECPGfree_auto_mem();
     229            0 :                 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              :          */
     237            0 :         sqlstate = PQresultErrorField(result, PG_DIAG_SQLSTATE);
     238            0 :         if (sqlstate == NULL)
     239            0 :                 sqlstate = ECPG_SQLSTATE_ECPG_INTERNAL_ERROR;
     240            0 :         message = PQresultErrorField(result, PG_DIAG_MESSAGE_PRIMARY);
     241            0 :         if (message == NULL)
     242            0 :                 message = PQerrorMessage(conn);
     243              : 
     244            0 :         if (strcmp(sqlstate, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR) == 0)
     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              :                  */
     250            0 :                 if (PQstatus(conn) == CONNECTION_BAD)
     251              :                 {
     252            0 :                         sqlstate = "57P02";
     253            0 :                         message = ecpg_gettext("the connection to the server was lost");
     254            0 :                 }
     255            0 :         }
     256              : 
     257              :         /* copy error message */
     258            0 :         snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc), "%s on line %d", message, line);
     259            0 :         sqlca->sqlerrm.sqlerrml = strlen(sqlca->sqlerrm.sqlerrmc);
     260              : 
     261              :         /* copy SQLSTATE */
     262            0 :         strncpy(sqlca->sqlstate, sqlstate, sizeof(sqlca->sqlstate));
     263              : 
     264              :         /* assign SQLCODE for backward compatibility */
     265            0 :         if (strncmp(sqlca->sqlstate, "23505", sizeof(sqlca->sqlstate)) == 0)
     266            0 :                 sqlca->sqlcode = INFORMIX_MODE(compat) ? ECPG_INFORMIX_DUPLICATE_KEY : ECPG_DUPLICATE_KEY;
     267            0 :         else if (strncmp(sqlca->sqlstate, "21000", sizeof(sqlca->sqlstate)) == 0)
     268            0 :                 sqlca->sqlcode = INFORMIX_MODE(compat) ? ECPG_INFORMIX_SUBSELECT_NOT_ONE : ECPG_SUBSELECT_NOT_ONE;
     269              :         else
     270            0 :                 sqlca->sqlcode = ECPG_PGSQL;
     271              : 
     272            0 :         ecpg_log("raising sqlstate %.*s (sqlcode %ld): %s\n",
     273            0 :                          (int) sizeof(sqlca->sqlstate), sqlca->sqlstate, sqlca->sqlcode, sqlca->sqlerrm.sqlerrmc);
     274              : 
     275              :         /* free all memory we have allocated for the user */
     276            0 :         ECPGfree_auto_mem();
     277            0 : }
     278              : 
     279              : /* filter out all error codes */
     280              : bool
     281            0 : ecpg_check_PQresult(PGresult *results, int lineno, PGconn *connection, enum COMPAT_MODE compat)
     282              : {
     283            0 :         if (results == NULL)
     284              :         {
     285            0 :                 ecpg_log("ecpg_check_PQresult on line %d: no result - %s", lineno, PQerrorMessage(connection));
     286            0 :                 ecpg_raise_backend(lineno, NULL, connection, compat);
     287            0 :                 return false;
     288              :         }
     289              : 
     290            0 :         switch (PQresultStatus(results))
     291              :         {
     292              : 
     293              :                 case PGRES_TUPLES_OK:
     294            0 :                         return true;
     295              :                         break;
     296              :                 case PGRES_EMPTY_QUERY:
     297              :                         /* do nothing */
     298            0 :                         ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
     299            0 :                         PQclear(results);
     300            0 :                         return false;
     301              :                         break;
     302              :                 case PGRES_COMMAND_OK:
     303            0 :                         return true;
     304              :                         break;
     305              :                 case PGRES_NONFATAL_ERROR:
     306              :                 case PGRES_FATAL_ERROR:
     307              :                 case PGRES_BAD_RESPONSE:
     308            0 :                         ecpg_log("ecpg_check_PQresult on line %d: bad response - %s", lineno, PQresultErrorMessage(results));
     309            0 :                         ecpg_raise_backend(lineno, results, connection, compat);
     310            0 :                         PQclear(results);
     311            0 :                         return false;
     312              :                         break;
     313              :                 case PGRES_COPY_OUT:
     314            0 :                         return true;
     315              :                         break;
     316              :                 case PGRES_COPY_IN:
     317            0 :                         ecpg_log("ecpg_check_PQresult on line %d: COPY IN data transfer in progress\n", lineno);
     318            0 :                         PQendcopy(connection);
     319            0 :                         PQclear(results);
     320            0 :                         return false;
     321              :                         break;
     322              :                 default:
     323            0 :                         ecpg_log("ecpg_check_PQresult on line %d: unknown execution status type\n",
     324            0 :                                          lineno);
     325            0 :                         ecpg_raise_backend(lineno, results, connection, compat);
     326            0 :                         PQclear(results);
     327            0 :                         return false;
     328              :                         break;
     329              :         }
     330            0 : }
     331              : 
     332              : /* print out an error message */
     333              : void
     334            0 : sqlprint(void)
     335              : {
     336            0 :         struct sqlca_t *sqlca = ECPGget_sqlca();
     337              : 
     338            0 :         if (sqlca == NULL)
     339              :         {
     340            0 :                 ecpg_log("out of memory");
     341            0 :                 return;
     342              :         }
     343              : 
     344            0 :         sqlca->sqlerrm.sqlerrmc[sqlca->sqlerrm.sqlerrml] = '\0';
     345            0 :         fprintf(stderr, ecpg_gettext("SQL error: %s\n"), sqlca->sqlerrm.sqlerrmc);
     346            0 : }
        

Generated by: LCOV version 2.3.2-1