Fix handling of structure for bytea data type in ECPG
authorMichael Paquier <michael@paquier.xyz>
Mon, 27 Jul 2020 01:28:06 +0000 (10:28 +0900)
committerMichael Paquier <michael@paquier.xyz>
Mon, 27 Jul 2020 01:28:06 +0000 (10:28 +0900)
Some code paths dedicated to bytea used the structure for varchar.  This
did not lead to any actual bugs, as bytea and varchar have the same
definition, but it could become a trap if one of these definitions
changes for a new feature or a bug fix.

Issue introduced by 050710b.

Author: Shenhao Wang
Reviewed-by: Vignesh C, Michael Paquier
Discussion: https://postgr.es/m/07ac7dee1efc44f99d7f53a074420177@G08CNEXMBPEKD06.g08.fujitsu.local
Backpatch-through: 12

src/interfaces/ecpg/ecpglib/data.c
src/interfaces/ecpg/ecpglib/descriptor.c
src/interfaces/ecpg/ecpglib/execute.c

index d3db5094cfa651483ab6c1c4bab4a178e3c2ed7e..6bc91ef7eb6d92f810b91ce5cf45792500e017d2 100644 (file)
@@ -523,8 +523,8 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 
                case ECPGt_bytea:
                    {
-                       struct ECPGgeneric_varchar *variable =
-                       (struct ECPGgeneric_varchar *) (var + offset * act_tuple);
+                       struct ECPGgeneric_bytea *variable =
+                       (struct ECPGgeneric_bytea *) (var + offset * act_tuple);
                        long        dst_size,
                                    src_size,
                                    dec_size;
index f71f539bef9eee37fa595c6f347fd44f306dfadd..369c2f0867ac9dc2f16d5cd46af92201780a74c3 100644 (file)
@@ -591,8 +591,8 @@ set_desc_attr(struct descriptor_item *desc_item, struct variable *var,
 
    else
    {
-       struct ECPGgeneric_varchar *variable =
-       (struct ECPGgeneric_varchar *) (var->value);
+       struct ECPGgeneric_bytea *variable =
+       (struct ECPGgeneric_bytea *) (var->value);
 
        desc_item->is_binary = true;
        desc_item->data_len = variable->len;
index 6961d7c75b4dc7fb74b913d1febcee13904d62c2..9d61ae72506f5ef5cd0ee415723923c50e4e9082 100644 (file)
@@ -822,8 +822,8 @@ ecpg_store_input(const int lineno, const bool force_indicator, const struct vari
 
            case ECPGt_bytea:
                {
-                   struct ECPGgeneric_varchar *variable =
-                   (struct ECPGgeneric_varchar *) (var->value);
+                   struct ECPGgeneric_bytea *variable =
+                   (struct ECPGgeneric_bytea *) (var->value);
 
                    if (!(mallocedval = (char *) ecpg_alloc(variable->len, lineno)))
                        return false;
@@ -1401,7 +1401,7 @@ ecpg_build_params(struct statement *stmt)
 
            if (var->type == ECPGt_bytea)
            {
-               binary_length = ((struct ECPGgeneric_varchar *) (var->value))->len;
+               binary_length = ((struct ECPGgeneric_bytea *) (var->value))->len;
                binary_format = true;
            }
        }