Add missing const qualifier in ECPG

Started by Qingqing Zhoualmost 21 years ago5 messagespatches
Jump to latest
#1Qingqing Zhou
zhouqq@cs.toronto.edu

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 *);

#2Peter Eisentraut
peter_e@gmx.net
In reply to: Qingqing Zhou (#1)
Re: Add missing const qualifier in ECPG

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/

#3Qingqing Zhou
zhouqq@cs.toronto.edu
In reply to: Peter Eisentraut (#2)
Re: Add missing const qualifier in ECPG

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

#4Qingqing Zhou
zhouqq@cs.toronto.edu
In reply to: Peter Eisentraut (#2)
Re: Add missing const qualifier in ECPG

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 *);

#5Michael Meskes
meskes@postgresql.org
In reply to: Qingqing Zhou (#4)
Re: Add missing const qualifier in ECPG

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!