Thread: Add missing const qualifier in ECPG
Add missing const qualifier to (char *) parameters in ECPG. Per reported by Tomasz Ostrowski. Regards, Qingqing --- Index: ecpglib/descriptor.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/interfaces/ecpg/ecpglib/descriptor.c,v retrieving revision 1.12 diff -c -r1.12 descriptor.c *** ecpglib/descriptor.c 29 Aug 2004 05:06:59 -0000 1.12 --- ecpglib/descriptor.c 12 Nov 2005 22:11:18 -0000 *************** *** 49,55 **** } bool ! ECPGget_desc_header(int lineno, char *desc_name, int *count) { PGresult *ECPGresult; struct sqlca_t *sqlca = ECPGget_sqlca(); --- 49,55 ---- } bool ! ECPGget_desc_header(int lineno, const char *desc_name, int *count) { PGresult *ECPGresult; struct sqlca_t *sqlca = ECPGget_sqlca(); *************** *** 188,194 **** } bool ! ECPGget_desc(int lineno, char *desc_name, int index,...) { va_list args; PGresult *ECPGresult; --- 188,194 ---- } bool ! ECPGget_desc(int lineno, const char *desc_name, int index,...) { va_list args; PGresult *ECPGresult; *************** *** 431,437 **** } bool ! ECPGset_desc_header(int lineno, char *desc_name, int count) { struct descriptor *desc; --- 431,437 ---- } bool ! ECPGset_desc_header(int lineno, const char *desc_name, int count) { struct descriptor *desc; *************** *** 452,458 **** } bool ! ECPGset_desc(int lineno, char *desc_name, int index,...) { va_list args; struct descriptor *desc; --- 452,458 ---- } bool ! ECPGset_desc(int lineno, const char *desc_name, int index,...) { va_list args; struct descriptor *desc; Index: ecpglib/execute.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/interfaces/ecpg/ecpglib/execute.c,v retrieving revision 1.43 diff -c -r1.43 execute.c *** ecpglib/execute.c 15 Oct 2005 02:49:47 -0000 1.43 --- ecpglib/execute.c 12 Nov 2005 22:11:18 -0000 *************** *** 141,147 **** * ind_offset - indicator offset */ static bool ! create_statement(int lineno, int compat, int force_indicator, struct connection * connection, struct statement ** stmt,char *query, va_list ap) { struct variable **list = &((*stmt)->inlist); enum ECPGttype type; --- 141,148 ---- * ind_offset - indicator offset */ static bool ! create_statement(int lineno, int compat, int force_indicator, struct connection * connection, struct statement ** stmt,const char ! *query, va_list ap) { struct variable **list = &((*stmt)->inlist); enum ECPGttype type; *************** *** 149,155 **** if (!(*stmt = (struct statement *) ECPGalloc(sizeof(struct statement), lineno))) return false; ! (*stmt)->command = query; (*stmt)->connection = connection; (*stmt)->lineno = lineno; (*stmt)->compat = compat; --- 150,156 ---- if (!(*stmt = (struct statement *) ECPGalloc(sizeof(struct statement), lineno))) return false; ! (*stmt)->command = (char *)query; (*stmt)->connection = connection; (*stmt)->lineno = lineno; (*stmt)->compat = compat; *************** *** 1359,1365 **** } bool ! ECPGdo(int lineno, int compat, int force_indicator, const char *connection_name, char *query,...) { va_list args; struct statement *stmt; --- 1360,1366 ---- } bool ! ECPGdo(int lineno, int compat, int force_indicator, const char *connection_name, const char *query,...) { va_list args; struct statement *stmt; *************** *** 1417,1423 **** ECPGdo_descriptor(int line, const char *connection, const char *descriptor, const char *query) { ! return ECPGdo(line, ECPG_COMPAT_PGSQL, true, connection, (char *) query, ECPGt_EOIT, ECPGt_descriptor, descriptor, 0L, 0L, 0L, ECPGt_NO_INDICATOR, NULL, 0L, 0L, 0L, ECPGt_EORT); } --- 1418,1424 ---- ECPGdo_descriptor(int line, const char *connection, const char *descriptor, const char *query) { ! return ECPGdo(line, ECPG_COMPAT_PGSQL, true, connection, query, ECPGt_EOIT, ECPGt_descriptor, descriptor, 0L, 0L, 0L, ECPGt_NO_INDICATOR, NULL, 0L, 0L, 0L, ECPGt_EORT); } Index: ecpglib/prepare.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/interfaces/ecpg/ecpglib/prepare.c,v retrieving revision 1.14 diff -c -r1.14 prepare.c *** ecpglib/prepare.c 15 Oct 2005 02:49:47 -0000 1.14 --- ecpglib/prepare.c 12 Nov 2005 22:11:18 -0000 *************** *** 60,66 **** /* handle the EXEC SQL PREPARE statement */ bool ! ECPGprepare(int lineno, char *name, char *variable) { struct statement *stmt; struct prepared_statement *this; --- 60,66 ---- /* handle the EXEC SQL PREPARE statement */ bool ! ECPGprepare(int lineno, const char *name, const char *variable) { struct statement *stmt; struct prepared_statement *this; *************** *** 112,118 **** /* handle the EXEC SQL DEALLOCATE PREPARE statement */ bool ! ECPGdeallocate(int lineno, int c, char *name) { bool ret = ECPGdeallocate_one(lineno, name); enum COMPAT_MODE compat = c; --- 112,118 ---- /* handle the EXEC SQL DEALLOCATE PREPARE statement */ bool ! ECPGdeallocate(int lineno, int c, const char *name) { bool ret = ECPGdeallocate_one(lineno, name); enum COMPAT_MODE compat = c; *************** *** 133,139 **** } bool ! ECPGdeallocate_one(int lineno, char *name) { struct prepared_statement *this, *prev; --- 133,139 ---- } bool ! ECPGdeallocate_one(int lineno, const char *name) { struct prepared_statement *this, *prev; Index: include/ecpglib.h =================================================================== RCS file: /projects/cvsroot/pgsql/src/interfaces/ecpg/include/ecpglib.h,v retrieving revision 1.63 diff -c -r1.63 ecpglib.h *** include/ecpglib.h 5 Jul 2004 09:45:53 -0000 1.63 --- include/ecpglib.h 12 Nov 2005 22:11:18 -0000 *************** *** 48,59 **** bool ECPGsetcommit(int, const char *, const char *); bool ECPGsetconn(int, const char *); bool ECPGconnect(int, int, const char *, const char *, const char *, const char *, int); ! bool ECPGdo(int, int, int, const char *, char *,...); bool ECPGtrans(int, const char *, const char *); bool ECPGdisconnect(int, const char *); ! bool ECPGprepare(int, char *, char *); ! bool ECPGdeallocate(int, int, char *); ! bool ECPGdeallocate_one(int, char *); bool ECPGdeallocate_all(int); char *ECPGprepared_statement(const char *); --- 48,59 ---- bool ECPGsetcommit(int, const char *, const char *); bool ECPGsetconn(int, const char *); bool ECPGconnect(int, int, const char *, const char *, const char *, const char *, int); ! bool ECPGdo(int, int, int, const char *, const char *,...); bool ECPGtrans(int, const char *, const char *); bool ECPGdisconnect(int, const char *); ! bool ECPGprepare(int, const char *, const char *); ! bool ECPGdeallocate(int, int, const char *); ! bool ECPGdeallocate_one(int, const char *); bool ECPGdeallocate_all(int); char *ECPGprepared_statement(const char *); *************** *** 75,84 **** bool ECPGallocate_desc(int line, const char *name); void ECPGraise(int line, int code, const char *sqlstate, const char *str); void ECPGraise_backend(int line, PGresult *result, PGconn *conn, int compat); ! bool ECPGget_desc_header(int, char *, int *); ! bool ECPGget_desc(int, char *, int,...); ! bool ECPGset_desc_header(int, char *, int); ! bool ECPGset_desc(int, char *, int,...); void ECPGset_noind_null(enum ECPGttype, void *); bool ECPGis_noind_null(enum ECPGttype, void *); --- 75,84 ---- bool ECPGallocate_desc(int line, const char *name); void ECPGraise(int line, int code, const char *sqlstate, const char *str); void ECPGraise_backend(int line, PGresult *result, PGconn *conn, int compat); ! bool ECPGget_desc_header(int, const char *, int *); ! bool ECPGget_desc(int, const char *, int,...); ! bool ECPGset_desc_header(int, const char *, int); ! bool ECPGset_desc(int, const char *, int,...); void ECPGset_noind_null(enum ECPGttype, void *); bool ECPGis_noind_null(enum ECPGttype, void *);
Qingqing Zhou wrote: > *************** > *** 149,155 **** > if (!(*stmt = (struct statement *) ECPGalloc(sizeof(struct > statement), lineno))) return false; > > ! (*stmt)->command = query; > (*stmt)->connection = connection; > (*stmt)->lineno = lineno; > (*stmt)->compat = compat; > --- 150,156 ---- > if (!(*stmt = (struct statement *) ECPGalloc(sizeof(struct > statement), lineno))) return false; > > ! (*stmt)->command = (char *)query; > (*stmt)->connection = connection; > (*stmt)->lineno = lineno; > (*stmt)->compat = compat; This sort of "cheating" should be avoided. -- Peter Eisentraut http://developer.postgresql.org/~petere/
On Sat, 12 Nov 2005, Peter Eisentraut wrote: > Qingqing Zhou wrote: > > *************** > > *** 149,155 **** > > if (!(*stmt = (struct statement *) ECPGalloc(sizeof(struct > > statement), lineno))) return false; > > > > ! (*stmt)->command = query; > > (*stmt)->connection = connection; > > (*stmt)->lineno = lineno; > > (*stmt)->compat = compat; > > --- 150,156 ---- > > if (!(*stmt = (struct statement *) ECPGalloc(sizeof(struct > > statement), lineno))) return false; > > > > ! (*stmt)->command = (char *)query; > > (*stmt)->connection = connection; > > (*stmt)->lineno = lineno; > > (*stmt)->compat = compat; > > This sort of "cheating" should be avoided. > Yeah ... this is a "cheating" trade ... :-) *** 1417,1423 **** ECPGdo_descriptor(int line, const char *connection, const char *descriptor, const char *query) { ! return ECPGdo(line, ECPG_COMPAT_PGSQL, true, connection, (char *) query, ECPGt_EOIT, ECPGt_descriptor, descriptor, 0L, 0L, 0L, ECPGt_NO_INDICATOR, NULL, 0L, 0L, 0L, ECPGt_EORT); } --- 1418,1424 ---- ECPGdo_descriptor(int line, const char *connection, const char *descriptor, const char *query) { ! return ECPGdo(line, ECPG_COMPAT_PGSQL, true, connection, query, ECPGt_EOIT, ECPGt_descriptor, descriptor, 0L, 0L, 0L, ECPGt_NO_INDICATOR, NULL, 0L, 0L, 0L, ECPGt_EORT); } Regards, Qingqing
On Sun, 13 Nov 2005, Peter Eisentraut wrote: > > > > ! (*stmt)->command = (char *)query; > > (*stmt)->connection = connection; > > (*stmt)->lineno = lineno; > > (*stmt)->compat = compat; > > This sort of "cheating" should be avoided. > According to Peter's comment, revised patch is attached. It duplicates the values of the query string and free it at the end of the query. There is another question -- seems we allow strdup() fails silently in various places. Shall we do something about it? Regards, Qingqing --- Index: ecpglib/descriptor.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/interfaces/ecpg/ecpglib/descriptor.c,v retrieving revision 1.12 diff -c -r1.12 descriptor.c *** ecpglib/descriptor.c 29 Aug 2004 05:06:59 -0000 1.12 --- ecpglib/descriptor.c 16 Nov 2005 00:40:57 -0000 *************** *** 49,55 **** } bool ! ECPGget_desc_header(int lineno, char *desc_name, int *count) { PGresult *ECPGresult; struct sqlca_t *sqlca = ECPGget_sqlca(); --- 49,55 ---- } bool ! ECPGget_desc_header(int lineno, const char *desc_name, int *count) { PGresult *ECPGresult; struct sqlca_t *sqlca = ECPGget_sqlca(); *************** *** 188,194 **** } bool ! ECPGget_desc(int lineno, char *desc_name, int index,...) { va_list args; PGresult *ECPGresult; --- 188,194 ---- } bool ! ECPGget_desc(int lineno, const char *desc_name, int index,...) { va_list args; PGresult *ECPGresult; *************** *** 431,437 **** } bool ! ECPGset_desc_header(int lineno, char *desc_name, int count) { struct descriptor *desc; --- 431,437 ---- } bool ! ECPGset_desc_header(int lineno, const char *desc_name, int count) { struct descriptor *desc; *************** *** 452,458 **** } bool ! ECPGset_desc(int lineno, char *desc_name, int index,...) { va_list args; struct descriptor *desc; --- 452,458 ---- } bool ! ECPGset_desc(int lineno, const char *desc_name, int index,...) { va_list args; struct descriptor *desc; Index: ecpglib/execute.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/interfaces/ecpg/ecpglib/execute.c,v retrieving revision 1.43 diff -c -r1.43 execute.c *** ecpglib/execute.c 15 Oct 2005 02:49:47 -0000 1.43 --- ecpglib/execute.c 16 Nov 2005 00:40:57 -0000 *************** *** 141,147 **** * ind_offset - indicator offset */ static bool ! create_statement(int lineno, int compat, int force_indicator, struct connection * connection, struct statement ** stmt,char *query, va_list ap) { struct variable **list = &((*stmt)->inlist); enum ECPGttype type; --- 141,148 ---- * ind_offset - indicator offset */ static bool ! create_statement(int lineno, int compat, int force_indicator, struct connection * connection, struct statement ** stmt,const char ! *query, va_list ap) { struct variable **list = &((*stmt)->inlist); enum ECPGttype type; *************** *** 149,155 **** if (!(*stmt = (struct statement *) ECPGalloc(sizeof(struct statement), lineno))) return false; ! (*stmt)->command = query; (*stmt)->connection = connection; (*stmt)->lineno = lineno; (*stmt)->compat = compat; --- 150,156 ---- if (!(*stmt = (struct statement *) ECPGalloc(sizeof(struct statement), lineno))) return false; ! (*stmt)->command = strdup(query); (*stmt)->connection = connection; (*stmt)->lineno = lineno; (*stmt)->compat = compat; *************** *** 224,229 **** --- 225,231 ---- return; free_variable(stmt->inlist); free_variable(stmt->outlist); + ECPGfree(stmt->command); ECPGfree(stmt); } *************** *** 1359,1365 **** } bool ! ECPGdo(int lineno, int compat, int force_indicator, const char *connection_name, char *query,...) { va_list args; struct statement *stmt; --- 1361,1367 ---- } bool ! ECPGdo(int lineno, int compat, int force_indicator, const char *connection_name, const char *query,...) { va_list args; struct statement *stmt; *************** *** 1417,1423 **** ECPGdo_descriptor(int line, const char *connection, const char *descriptor, const char *query) { ! return ECPGdo(line, ECPG_COMPAT_PGSQL, true, connection, (char *) query, ECPGt_EOIT, ECPGt_descriptor, descriptor, 0L, 0L, 0L, ECPGt_NO_INDICATOR, NULL, 0L, 0L, 0L, ECPGt_EORT); } --- 1419,1425 ---- ECPGdo_descriptor(int line, const char *connection, const char *descriptor, const char *query) { ! return ECPGdo(line, ECPG_COMPAT_PGSQL, true, connection, query, ECPGt_EOIT, ECPGt_descriptor, descriptor, 0L, 0L, 0L, ECPGt_NO_INDICATOR, NULL, 0L, 0L, 0L, ECPGt_EORT); } Index: ecpglib/memory.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/interfaces/ecpg/ecpglib/memory.c,v retrieving revision 1.7 diff -c -r1.7 memory.c *** ecpglib/memory.c 15 Oct 2005 02:49:47 -0000 1.7 --- ecpglib/memory.c 16 Nov 2005 00:40:57 -0000 *************** *** 11,17 **** void ECPGfree(void *ptr) { ! free(ptr); } char * --- 11,18 ---- void ECPGfree(void *ptr) { ! if (ptr) ! free(ptr); } char * Index: ecpglib/prepare.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/interfaces/ecpg/ecpglib/prepare.c,v retrieving revision 1.14 diff -c -r1.14 prepare.c *** ecpglib/prepare.c 15 Oct 2005 02:49:47 -0000 1.14 --- ecpglib/prepare.c 16 Nov 2005 00:40:57 -0000 *************** *** 60,66 **** /* handle the EXEC SQL PREPARE statement */ bool ! ECPGprepare(int lineno, char *name, char *variable) { struct statement *stmt; struct prepared_statement *this; --- 60,66 ---- /* handle the EXEC SQL PREPARE statement */ bool ! ECPGprepare(int lineno, const char *name, const char *variable) { struct statement *stmt; struct prepared_statement *this; *************** *** 112,118 **** /* handle the EXEC SQL DEALLOCATE PREPARE statement */ bool ! ECPGdeallocate(int lineno, int c, char *name) { bool ret = ECPGdeallocate_one(lineno, name); enum COMPAT_MODE compat = c; --- 112,118 ---- /* handle the EXEC SQL DEALLOCATE PREPARE statement */ bool ! ECPGdeallocate(int lineno, int c, const char *name) { bool ret = ECPGdeallocate_one(lineno, name); enum COMPAT_MODE compat = c; *************** *** 133,139 **** } bool ! ECPGdeallocate_one(int lineno, char *name) { struct prepared_statement *this, *prev; --- 133,139 ---- } bool ! ECPGdeallocate_one(int lineno, const char *name) { struct prepared_statement *this, *prev; Index: include/ecpglib.h =================================================================== RCS file: /projects/cvsroot/pgsql/src/interfaces/ecpg/include/ecpglib.h,v retrieving revision 1.63 diff -c -r1.63 ecpglib.h *** include/ecpglib.h 5 Jul 2004 09:45:53 -0000 1.63 --- include/ecpglib.h 16 Nov 2005 00:40:57 -0000 *************** *** 48,59 **** bool ECPGsetcommit(int, const char *, const char *); bool ECPGsetconn(int, const char *); bool ECPGconnect(int, int, const char *, const char *, const char *, const char *, int); ! bool ECPGdo(int, int, int, const char *, char *,...); bool ECPGtrans(int, const char *, const char *); bool ECPGdisconnect(int, const char *); ! bool ECPGprepare(int, char *, char *); ! bool ECPGdeallocate(int, int, char *); ! bool ECPGdeallocate_one(int, char *); bool ECPGdeallocate_all(int); char *ECPGprepared_statement(const char *); --- 48,59 ---- bool ECPGsetcommit(int, const char *, const char *); bool ECPGsetconn(int, const char *); bool ECPGconnect(int, int, const char *, const char *, const char *, const char *, int); ! bool ECPGdo(int, int, int, const char *, const char *,...); bool ECPGtrans(int, const char *, const char *); bool ECPGdisconnect(int, const char *); ! bool ECPGprepare(int, const char *, const char *); ! bool ECPGdeallocate(int, int, const char *); ! bool ECPGdeallocate_one(int, const char *); bool ECPGdeallocate_all(int); char *ECPGprepared_statement(const char *); *************** *** 75,84 **** bool ECPGallocate_desc(int line, const char *name); void ECPGraise(int line, int code, const char *sqlstate, const char *str); void ECPGraise_backend(int line, PGresult *result, PGconn *conn, int compat); ! bool ECPGget_desc_header(int, char *, int *); ! bool ECPGget_desc(int, char *, int,...); ! bool ECPGset_desc_header(int, char *, int); ! bool ECPGset_desc(int, char *, int,...); void ECPGset_noind_null(enum ECPGttype, void *); bool ECPGis_noind_null(enum ECPGttype, void *); --- 75,84 ---- bool ECPGallocate_desc(int line, const char *name); void ECPGraise(int line, int code, const char *sqlstate, const char *str); void ECPGraise_backend(int line, PGresult *result, PGconn *conn, int compat); ! bool ECPGget_desc_header(int, const char *, int *); ! bool ECPGget_desc(int, const char *, int,...); ! bool ECPGset_desc_header(int, const char *, int); ! bool ECPGset_desc(int, const char *, int,...); void ECPGset_noind_null(enum ECPGttype, void *); bool ECPGis_noind_null(enum ECPGttype, void *);
I just applied most of your patch to 8.0, 8.1 and HEAD. The only thing I didn't is: diff -c -r1.7 memory.c *** ecpglib/memory.c 15 Oct 2005 02:49:47 -0000 1.7 --- ecpglib/memory.c 16 Nov 2005 00:40:57 -0000 *************** *** 11,17 **** void ECPGfree(void *ptr) { ! free(ptr); } char * --- 11,18 ---- void ECPGfree(void *ptr) { ! if (ptr) ! free(ptr); } char * Is there a reason why you changed this? Acocrding to the docs free(NULL) does nothing anyway. Also you mentioned: ... seems we allow strdup() fails silently in various places. Shall we do something about it? ... Yes! Thanks for pointing this out. I already committed a patch that changes alls strdup() calls to ECPGstrdup() calls that correctly raise an error condition. Michael -- Michael Meskes Email: Michael at Fam-Meskes dot De, Michael at Meskes dot (De|Com|Net|Org) ICQ: 179140304, AIM/Yahoo: michaelmeskes, Jabber: meskes@jabber.org Go SF 49ers! Go Rhein Fire! Use Debian GNU/Linux! Use PostgreSQL!