LCOV - differential code coverage report
Current view: top level - src/interfaces/ecpg/ecpglib - error.c (source / functions) Coverage Total Hit UBC CBC
Current: Differential Code Coverage HEAD vs 15 Lines: 37.2 % 180 67 113 67
Current Date: 2023-04-08 17:13:01 Functions: 100.0 % 4 4 4
Baseline: 15 Line coverage date bins:
Baseline Date: 2023-04-08 15:09:40 (240..) days: 37.2 % 180 67 113 67
Legend: Lines: hit not hit Function coverage date bins:
(240..) days: 100.0 % 4 4 4

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

Generated by: LCOV version v1.16-55-g56c0a2a