LCOV - code coverage report
Current view: top level - src/interfaces/ecpg/ecpglib - error.c (source / functions) Coverage Total Hit
Test: PostgreSQL 20devel Lines: 37.2 % 180 67
Test Date: 2026-07-03 19:57:34 Functions: 100.0 % 4 4
Legend: Lines:     hit not hit
Branches: + taken - not taken # not executed
Branches: 35.5 % 62 22

             Branch data     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                 :         115 : ecpg_raise(int line, int code, const char *sqlstate, const char *str)
      14                 :             : {
      15                 :         115 :     struct sqlca_t *sqlca = ECPGget_sqlca();
      16                 :             : 
      17         [ -  + ]:         115 :     if (sqlca == NULL)
      18                 :             :     {
      19                 :           0 :         ecpg_log("out of memory");
      20                 :           0 :         ECPGfree_auto_mem();
      21                 :           0 :         return;
      22                 :             :     }
      23                 :             : 
      24                 :         115 :     sqlca->sqlcode = code;
      25                 :         115 :     strncpy(sqlca->sqlstate, sqlstate, sizeof(sqlca->sqlstate));
      26                 :             : 
      27   [ +  -  -  -  :         115 :     switch (code)
          -  -  -  -  -  
          -  +  -  -  -  
          +  -  +  -  -  
          -  -  -  -  +  
                      - ]
      28                 :             :     {
      29                 :          50 :         case ECPG_NOT_FOUND:
      30                 :          50 :             snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
      31                 :             :             /*------
      32                 :             :                translator: this string will be truncated at 149 characters expanded.  */
      33                 :          50 :                      ecpg_gettext("no data found on line %d"), line);
      34                 :          50 :             break;
      35                 :             : 
      36                 :           0 :         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                 :           0 :         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                 :           0 :         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                 :           0 :         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                 :           0 :         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                 :           0 :         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                 :           0 :         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                 :           0 :         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                 :           0 :         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                 :          12 :         case ECPG_MISSING_INDICATOR:
     106                 :          12 :             snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
     107                 :             :             /*------
     108                 :             :                translator: this string will be truncated at 149 characters expanded.  */
     109                 :          12 :                      ecpg_gettext("null value without indicator on line %d"), line);
     110                 :          12 :             break;
     111                 :             : 
     112                 :           0 :         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                 :           0 :         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                 :           0 :         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                 :          43 :         case ECPG_NO_CONN:
     134                 :          43 :             snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
     135                 :             :             /*------
     136                 :             :                translator: this string will be truncated at 149 characters expanded.  */
     137                 :          43 :                      ecpg_gettext("connection \"%s\" does not exist on line %d"), str, line);
     138                 :          43 :             break;
     139                 :             : 
     140                 :           0 :         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                 :           2 :         case ECPG_INVALID_STMT:
     148                 :           2 :             snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
     149                 :             :             /*------
     150                 :             :                translator: this string will be truncated at 149 characters expanded.  */
     151                 :           2 :                      ecpg_gettext("invalid statement name \"%s\" on line %d"), str, line);
     152                 :           2 :             break;
     153                 :             : 
     154                 :           0 :         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                 :           0 :         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                 :           0 :         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                 :           0 :         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                 :           0 :         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                 :           0 :         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                 :           8 :         case ECPG_CONNECT:
     197                 :           8 :             snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
     198                 :             :             /*------
     199                 :             :                translator: this string will be truncated at 149 characters expanded.  */
     200                 :           8 :                      ecpg_gettext("could not connect to database \"%s\" on line %d"), str, line);
     201                 :           8 :             break;
     202                 :             : 
     203                 :           0 :         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                 :         115 :     sqlca->sqlerrm.sqlerrml = strlen(sqlca->sqlerrm.sqlerrmc);
     212                 :         115 :     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                 :         115 :     ECPGfree_auto_mem();
     216                 :             : }
     217                 :             : 
     218                 :             : void
     219                 :          26 : ecpg_raise_backend(int line, PGresult *result, PGconn *conn, int compat)
     220                 :             : {
     221                 :          26 :     struct sqlca_t *sqlca = ECPGget_sqlca();
     222                 :             :     char       *sqlstate;
     223                 :             :     char       *message;
     224                 :             : 
     225         [ -  + ]:          26 :     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                 :          26 :     sqlstate = PQresultErrorField(result, PG_DIAG_SQLSTATE);
     238         [ -  + ]:          26 :     if (sqlstate == NULL)
     239                 :           0 :         sqlstate = ECPG_SQLSTATE_ECPG_INTERNAL_ERROR;
     240                 :          26 :     message = PQresultErrorField(result, PG_DIAG_MESSAGE_PRIMARY);
     241         [ -  + ]:          26 :     if (message == NULL)
     242                 :           0 :         message = PQerrorMessage(conn);
     243                 :             : 
     244         [ -  + ]:          26 :     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                 :             :         }
     255                 :             :     }
     256                 :             : 
     257                 :             :     /* copy error message */
     258                 :          26 :     snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc), "%s on line %d", message, line);
     259                 :          26 :     sqlca->sqlerrm.sqlerrml = strlen(sqlca->sqlerrm.sqlerrmc);
     260                 :             : 
     261                 :             :     /* copy SQLSTATE */
     262                 :          26 :     strncpy(sqlca->sqlstate, sqlstate, sizeof(sqlca->sqlstate));
     263                 :             : 
     264                 :             :     /* assign SQLCODE for backward compatibility */
     265         [ +  + ]:          26 :     if (strncmp(sqlca->sqlstate, "23505", sizeof(sqlca->sqlstate)) == 0)
     266   [ -  +  -  - ]:           2 :         sqlca->sqlcode = INFORMIX_MODE(compat) ? ECPG_INFORMIX_DUPLICATE_KEY : ECPG_DUPLICATE_KEY;
     267         [ +  + ]:          24 :     else if (strncmp(sqlca->sqlstate, "21000", sizeof(sqlca->sqlstate)) == 0)
     268   [ -  +  -  - ]:           2 :         sqlca->sqlcode = INFORMIX_MODE(compat) ? ECPG_INFORMIX_SUBSELECT_NOT_ONE : ECPG_SUBSELECT_NOT_ONE;
     269                 :             :     else
     270                 :          22 :         sqlca->sqlcode = ECPG_PGSQL;
     271                 :             : 
     272                 :          26 :     ecpg_log("raising sqlstate %.*s (sqlcode %ld): %s\n",
     273                 :          26 :              (int) sizeof(sqlca->sqlstate), sqlca->sqlstate, sqlca->sqlcode, sqlca->sqlerrm.sqlerrmc);
     274                 :             : 
     275                 :             :     /* free all memory we have allocated for the user */
     276                 :          26 :     ECPGfree_auto_mem();
     277                 :             : }
     278                 :             : 
     279                 :             : /* filter out all error codes */
     280                 :             : bool
     281                 :        9284 : ecpg_check_PQresult(PGresult *results, int lineno, PGconn *connection, enum COMPAT_MODE compat)
     282                 :             : {
     283         [ -  + ]:        9284 :     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   [ +  -  +  +  :        9284 :     switch (PQresultStatus(results))
                +  -  - ]
     291                 :             :     {
     292                 :             : 
     293                 :        2122 :         case PGRES_TUPLES_OK:
     294                 :        2122 :             return true;
     295                 :             :             break;
     296                 :           0 :         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                 :        7134 :         case PGRES_COMMAND_OK:
     303                 :        7134 :             return true;
     304                 :             :             break;
     305                 :          26 :         case PGRES_NONFATAL_ERROR:
     306                 :             :         case PGRES_FATAL_ERROR:
     307                 :             :         case PGRES_BAD_RESPONSE:
     308                 :          26 :             ecpg_log("ecpg_check_PQresult on line %d: bad response - %s", lineno, PQresultErrorMessage(results));
     309                 :          26 :             ecpg_raise_backend(lineno, results, connection, compat);
     310                 :          26 :             PQclear(results);
     311                 :          26 :             return false;
     312                 :             :             break;
     313                 :           2 :         case PGRES_COPY_OUT:
     314                 :           2 :             return true;
     315                 :             :             break;
     316                 :           0 :         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                 :           0 :         default:
     323                 :           0 :             ecpg_log("ecpg_check_PQresult on line %d: unknown execution status type\n",
     324                 :             :                      lineno);
     325                 :           0 :             ecpg_raise_backend(lineno, results, connection, compat);
     326                 :           0 :             PQclear(results);
     327                 :           0 :             return false;
     328                 :             :             break;
     329                 :             :     }
     330                 :             : }
     331                 :             : 
     332                 :             : /* print out an error message */
     333                 :             : void
     334                 :          26 : sqlprint(void)
     335                 :             : {
     336                 :          26 :     struct sqlca_t *sqlca = ECPGget_sqlca();
     337                 :             : 
     338         [ -  + ]:          26 :     if (sqlca == NULL)
     339                 :             :     {
     340                 :           0 :         ecpg_log("out of memory");
     341                 :           0 :         return;
     342                 :             :     }
     343                 :             : 
     344                 :          26 :     sqlca->sqlerrm.sqlerrmc[sqlca->sqlerrm.sqlerrml] = '\0';
     345                 :          26 :     fprintf(stderr, ecpg_gettext("SQL error: %s\n"), sqlca->sqlerrm.sqlerrmc);
     346                 :             : }
        

Generated by: LCOV version 2.0-1