Re: using array of char pointers gives wrong results
От | Ashutosh Bapat |
---|---|
Тема | Re: using array of char pointers gives wrong results |
Дата | |
Msg-id | CAFjFpRe_uU1FxrPoFv1FG9p0tihk4aujaYGB1oT7gYH+nrawNQ@mail.gmail.com обсуждение исходный текст |
Ответ на | using array of char pointers gives wrong results (Ashutosh Bapat <ashutosh.bapat@enterprisedb.com>) |
Список | pgsql-hackers |
Let me bring the bug fix again to the surface. Is anybody looking at this fix?
On Tue, Apr 29, 2014 at 2:25 PM, Ashutosh Bapat <ashutosh.bapat@enterprisedb.com> wrote:
Hi,When array of char * is used as target for the FETCH statement returning more than one row, it tries to store all the result in the first element. PFA test_char_select.pgc, which fetches first 3 relnames from pg_class ordered by relname. The program prints following result
steps to compile and build the program
ecpg -c -I<ecpg_include_dir> test_char_select.pgc
cc -I<pg installation include dir> -g -c -o test_char_select.o test_char_select.c
cc -g test_char_select.o -L<pg installation lib dir> -lecpg -lpq -lpgtypes -o test_char_selectoutput./test_char_select
relname=___pg_foreign_table_columns
relname=
relname=The first three relnames should have been
postgres=# select relname from pg_class order by relname limit 3;
relname
---------------------------
_pg_foreign_data_wrappers
_pg_foreign_servers
_pg_foreign_table_columnsIt's obvious that the first element of the array is being overwritten with an offset of 1.This happens because, the array of char pointer is dumped as
/* Fetch multiple columns into one structure. */
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 3 from cur1", ECPGt_EOIT,
ECPGt_char,(strings),(long)0,(long)3,(1)*sizeof(char),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);Since the offset is 1, the next result overwrites the previous result except for the first byte.PFA patch ecpg_char_ptr_arr.patch to fix this issue. It has changes as follows1. Dump array of char pointer with right offset i.e. sizeof(char *)2. While reading array of char pointer in ecpg_do_prologue(), use the address instead of the value at that address3. The pointer arithmetic should treat such variable as char **, instead of char *ECPG regression tests do not show any failures with this patch.--Best Wishes,
Ashutosh Bapat
EnterpriseDB Corporation
The Postgres Database Company
--
Best Wishes,
Ashutosh Bapat
EnterpriseDB Corporation
The Postgres Database Company
Ashutosh Bapat
EnterpriseDB Corporation
The Postgres Database Company
В списке pgsql-hackers по дате отправления: