aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/interfaces/ecpg/ecpglib/descriptor.c16
-rw-r--r--src/interfaces/ecpg/ecpglib/execute.c4
-rw-r--r--src/interfaces/ecpg/preproc/ecpg.c22
-rw-r--r--src/interfaces/ecpg/preproc/extern.h5
-rw-r--r--src/interfaces/ecpg/preproc/preproc.y6
5 files changed, 38 insertions, 15 deletions
diff --git a/src/interfaces/ecpg/ecpglib/descriptor.c b/src/interfaces/ecpg/ecpglib/descriptor.c
index 88d07c0b8dd..0a4ecf86fc7 100644
--- a/src/interfaces/ecpg/ecpglib/descriptor.c
+++ b/src/interfaces/ecpg/ecpglib/descriptor.c
@@ -1,6 +1,6 @@
/* dynamic SQL support routines
*
- * $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/descriptor.c,v 1.21 2007/04/27 06:56:11 meskes Exp $
+ * $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/descriptor.c,v 1.22 2007/06/11 11:52:08 meskes Exp $
*/
#define POSTGRES_ECPG_INTERNAL
@@ -547,7 +547,7 @@ ECPGset_desc(int lineno, const char *desc_name, int index,...)
ECPGfree(var);
return false;
}
-
+ ECPGfree(desc_item->data); /* free() takes care of a potential NULL value */
desc_item->data = (char *) tobeinserted;
tobeinserted = NULL;
break;
@@ -607,6 +607,18 @@ ECPGdeallocate_desc(int line, const char *name)
{
if (!strcmp(name, i->name))
{
+ struct descriptor_item *desc_item;
+
+ for (desc_item = i->items; desc_item;)
+ {
+ struct descriptor_item *di;
+
+ ECPGfree(desc_item->data);
+ di = desc_item;
+ desc_item = desc_item->next;
+ ECPGfree(di);
+ }
+
*lastptr = i->next;
ECPGfree(i->name);
PQclear(i->result);
diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c
index 79e3e1bafbf..5c3ecf6461f 100644
--- a/src/interfaces/ecpg/ecpglib/execute.c
+++ b/src/interfaces/ecpg/ecpglib/execute.c
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.66 2007/04/27 06:56:11 meskes Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.67 2007/06/11 11:52:08 meskes Exp $ */
/*
* The aim is to get a simpler inteface to the database routines.
@@ -48,7 +48,7 @@ quote_postgres(char *arg, bool quote, int lineno)
* will be quoted once they are inserted in a statement
*/
if (!quote)
- return res = ECPGstrdup(arg, lineno);
+ return arg;
else
{
length = strlen(arg);
diff --git a/src/interfaces/ecpg/preproc/ecpg.c b/src/interfaces/ecpg/preproc/ecpg.c
index e419a199db7..e5439a9622e 100644
--- a/src/interfaces/ecpg/preproc/ecpg.c
+++ b/src/interfaces/ecpg/preproc/ecpg.c
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.98 2007/03/17 19:25:23 meskes Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.99 2007/06/11 11:52:08 meskes Exp $ */
/* New main for ecpg, the PostgreSQL embedded SQL precompiler. */
/* (C) Michael Meskes <meskes@postgresql.org> Feb 5th, 1998 */
@@ -20,6 +20,8 @@ int ret_value = 0,
header_mode = false,
regression_mode = false;
+char *output_filename;
+
enum COMPAT_MODE compat = ECPG_COMPAT_PGSQL;
struct _include_path *include_paths = NULL;
@@ -135,6 +137,7 @@ main(int argc, char *const argv[])
find_my_exec(argv[0], my_exec_path);
+ output_filename = NULL;
while ((c = getopt_long(argc, argv, "vcio:I:tD:dC:r:h?", ecpg_options, NULL)) != -1)
{
switch (c)
@@ -163,14 +166,18 @@ main(int argc, char *const argv[])
regression_mode = true;
break;
case 'o':
- if (strcmp(optarg, "-") == 0)
+ output_filename = optarg;
+ if (strcmp(output_filename, "-") == 0)
yyout = stdout;
else
- yyout = fopen(optarg, PG_BINARY_W);
+ yyout = fopen(output_filename, PG_BINARY_W);
- if (yyout == NULL)
+ if (yyout == NULL)
+ {
fprintf(stderr, "%s: could not open file \"%s\": %s\n",
- progname, optarg, strerror(errno));
+ progname, output_filename, strerror(errno));
+ output_filename = NULL;
+ }
else
out_option = 1;
break;
@@ -269,8 +276,7 @@ main(int argc, char *const argv[])
/* after the options there must not be anything but filenames */
for (fnr = optind; fnr < argc; fnr++)
{
- char *output_filename = NULL,
- *ptr2ext;
+ char *ptr2ext;
/* If argv[fnr] is "-" we have to read from stdin */
if (strcmp(argv[fnr], "-") == 0)
@@ -467,7 +473,7 @@ main(int argc, char *const argv[])
fclose(yyout);
}
- if (output_filename)
+ if (output_filename && out_option == 0)
free(output_filename);
free(input_filename);
diff --git a/src/interfaces/ecpg/preproc/extern.h b/src/interfaces/ecpg/preproc/extern.h
index 1d0835d706e..4a2cfaf747c 100644
--- a/src/interfaces/ecpg/preproc/extern.h
+++ b/src/interfaces/ecpg/preproc/extern.h
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/extern.h,v 1.65 2007/03/17 19:25:23 meskes Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/extern.h,v 1.66 2007/06/11 11:52:08 meskes Exp $ */
#ifndef _ECPG_PREPROC_EXTERN_H
#define _ECPG_PREPROC_EXTERN_H
@@ -37,6 +37,7 @@ extern int yylineno,
yyleng;
extern FILE *yyin,
*yyout;
+extern char *output_filename;
extern struct _include_path *include_paths;
extern struct cursor *cur;
@@ -93,7 +94,7 @@ extern ScanKeyword *ScanKeywordLookup(char *text);
extern void scanner_init(const char *);
extern void parser_init(void);
extern void scanner_finish(void);
-int filtered_base_yylex(void);
+extern int filtered_base_yylex(void);
/* return codes */
diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y
index 69c8d7de011..80dc3765827 100644
--- a/src/interfaces/ecpg/preproc/preproc.y
+++ b/src/interfaces/ecpg/preproc/preproc.y
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.343 2007/05/10 09:53:17 meskes Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.344 2007/06/11 11:52:08 meskes Exp $ */
/* Copyright comment */
%{
@@ -99,6 +99,10 @@ mmerror(int error_code, enum errortype type, char * error, ...)
ret_value = error_code;
break;
case ET_FATAL:
+ fclose(yyin);
+ fclose(yyout);
+ if (unlink(output_filename) != 0)
+ fprintf(stderr, "Could not remove ourput file %s!\n", output_filename);
exit(error_code);
}
}