Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
Postgres FD Implementation
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Abuhujair Javed
Postgres FD Implementation
Commits
bf69b535
Commit
bf69b535
authored
Jan 15, 2010
by
Michael Meskes
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Applied patch by Boszormenyi Zoltan <zb@cybertec.at> to add DESCRIBE [OUTPUT] statement to ecpg.
parent
40f908bd
Changes
22
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
2443 additions
and
45 deletions
+2443
-45
src/interfaces/ecpg/ecpglib/descriptor.c
src/interfaces/ecpg/ecpglib/descriptor.c
+147
-9
src/interfaces/ecpg/ecpglib/extern.h
src/interfaces/ecpg/ecpglib/extern.h
+13
-1
src/interfaces/ecpg/ecpglib/prepare.c
src/interfaces/ecpg/ecpglib/prepare.c
+7
-17
src/interfaces/ecpg/include/ecpglib.h
src/interfaces/ecpg/include/ecpglib.h
+2
-2
src/interfaces/ecpg/preproc/ecpg.addons
src/interfaces/ecpg/preproc/ecpg.addons
+2
-2
src/interfaces/ecpg/preproc/ecpg.trailer
src/interfaces/ecpg/preproc/ecpg.trailer
+36
-12
src/interfaces/ecpg/preproc/ecpg.type
src/interfaces/ecpg/preproc/ecpg.type
+2
-1
src/interfaces/ecpg/test/compat_informix/Makefile
src/interfaces/ecpg/test/compat_informix/Makefile
+1
-0
src/interfaces/ecpg/test/compat_informix/describe.pgc
src/interfaces/ecpg/test/compat_informix/describe.pgc
+199
-0
src/interfaces/ecpg/test/ecpg_schedule
src/interfaces/ecpg/test/ecpg_schedule
+2
-0
src/interfaces/ecpg/test/ecpg_schedule_tcp
src/interfaces/ecpg/test/ecpg_schedule_tcp
+2
-0
src/interfaces/ecpg/test/expected/compat_informix-describe.c
src/interfaces/ecpg/test/expected/compat_informix-describe.c
+467
-0
src/interfaces/ecpg/test/expected/compat_informix-describe.stderr
...rfaces/ecpg/test/expected/compat_informix-describe.stderr
+112
-0
src/interfaces/ecpg/test/expected/compat_informix-describe.stdout
...rfaces/ecpg/test/expected/compat_informix-describe.stdout
+24
-0
src/interfaces/ecpg/test/expected/preproc-describe.c
src/interfaces/ecpg/test/expected/preproc-describe.c
+481
-0
src/interfaces/ecpg/test/expected/preproc-describe.stderr
src/interfaces/ecpg/test/expected/preproc-describe.stderr
+140
-0
src/interfaces/ecpg/test/expected/preproc-describe.stdout
src/interfaces/ecpg/test/expected/preproc-describe.stdout
+4
-0
src/interfaces/ecpg/test/expected/sql-describe.c
src/interfaces/ecpg/test/expected/sql-describe.c
+465
-0
src/interfaces/ecpg/test/expected/sql-describe.stderr
src/interfaces/ecpg/test/expected/sql-describe.stderr
+112
-0
src/interfaces/ecpg/test/expected/sql-describe.stdout
src/interfaces/ecpg/test/expected/sql-describe.stdout
+24
-0
src/interfaces/ecpg/test/sql/Makefile
src/interfaces/ecpg/test/sql/Makefile
+2
-1
src/interfaces/ecpg/test/sql/describe.pgc
src/interfaces/ecpg/test/sql/describe.pgc
+199
-0
No files found.
src/interfaces/ecpg/ecpglib/descriptor.c
View file @
bf69b535
/* dynamic SQL support routines
*
* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/descriptor.c,v 1.3
3 2009/08/07 10:51:20
meskes Exp $
* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/descriptor.c,v 1.3
4 2010/01/15 10:44:34
meskes Exp $
*/
#define POSTGRES_ECPG_INTERNAL
...
...
@@ -13,6 +13,7 @@
#include "ecpgerrno.h"
#include "extern.h"
#include "sqlca.h"
#include "sqlda.h"
#include "sql3types.h"
static
void
descriptor_free
(
struct
descriptor
*
desc
);
...
...
@@ -226,6 +227,12 @@ get_char_item(int lineno, void *var, enum ECPGttype vartype, char *value, int va
return
(
true
);
}
#define RETURN_IF_NO_DATA if (ntuples < 1) \
{ \
ecpg_raise(lineno, ECPG_NOT_FOUND, ECPG_SQLSTATE_NO_DATA, NULL); \
return (false); \
}
bool
ECPGget_desc
(
int
lineno
,
const
char
*
desc_name
,
int
index
,...)
{
...
...
@@ -244,11 +251,6 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
return
(
false
);
ntuples
=
PQntuples
(
ECPGresult
);
if
(
ntuples
<
1
)
{
ecpg_raise
(
lineno
,
ECPG_NOT_FOUND
,
ECPG_SQLSTATE_NO_DATA
,
NULL
);
return
(
false
);
}
if
(
index
<
1
||
index
>
PQnfields
(
ECPGresult
))
{
...
...
@@ -283,6 +285,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
switch
(
type
)
{
case
(
ECPGd_indicator
):
RETURN_IF_NO_DATA
;
data_var
.
ind_type
=
vartype
;
data_var
.
ind_pointer
=
var
;
data_var
.
ind_varcharsize
=
varcharsize
;
...
...
@@ -295,6 +298,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
break
;
case
ECPGd_data
:
RETURN_IF_NO_DATA
;
data_var
.
type
=
vartype
;
data_var
.
pointer
=
var
;
data_var
.
varcharsize
=
varcharsize
;
...
...
@@ -377,6 +381,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
case
ECPGd_ret_length
:
case
ECPGd_ret_octet
:
RETURN_IF_NO_DATA
;
/*
* this is like ECPGstore_result
*/
...
...
@@ -480,6 +485,7 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
sqlca
->
sqlerrd
[
2
]
=
ntuples
;
return
(
true
);
}
#undef RETURN_IF_NO_DATA
bool
ECPGset_desc_header
(
int
lineno
,
const
char
*
desc_name
,
int
count
)
...
...
@@ -723,8 +729,140 @@ ecpg_find_desc(int line, const char *name)
}
bool
ECPGdescribe
(
int
line
,
bool
input
,
const
char
*
statement
,
...)
ECPGdescribe
(
int
line
,
int
compat
,
bool
input
,
const
char
*
connection_name
,
const
char
*
stmt_name
,
...)
{
ecpg_log
(
"ECPGdescribe called on line %d for %s: %s
\n
"
,
line
,
input
?
"input"
:
"output"
,
statement
);
return
false
;
bool
ret
=
false
;
struct
connection
*
con
;
struct
prepared_statement
*
prep
;
PGresult
*
res
;
va_list
args
;
/* DESCRIBE INPUT is not yet supported */
if
(
input
)
return
ret
;
con
=
ecpg_get_connection
(
connection_name
);
if
(
!
con
)
return
false
;
prep
=
ecpg_find_prepared_statement
(
stmt_name
,
con
,
NULL
);
if
(
!
prep
)
return
ret
;
va_start
(
args
,
stmt_name
);
for
(;;)
{
enum
ECPGttype
type
,
dummy_type
;
void
*
ptr
,
*
dummy_ptr
;
long
dummy
;
/* variable type */
type
=
va_arg
(
args
,
enum
ECPGttype
);
if
(
type
==
ECPGt_EORT
)
break
;
/* rest of variable parameters*/
ptr
=
va_arg
(
args
,
void
*
);
dummy
=
va_arg
(
args
,
long
);
dummy
=
va_arg
(
args
,
long
);
dummy
=
va_arg
(
args
,
long
);
/* variable indicator */
dummy_type
=
va_arg
(
args
,
enum
ECPGttype
);
dummy_ptr
=
va_arg
(
args
,
void
*
);
dummy
=
va_arg
(
args
,
long
);
dummy
=
va_arg
(
args
,
long
);
dummy
=
va_arg
(
args
,
long
);
switch
(
type
)
{
case
ECPGt_descriptor
:
{
char
*
name
=
ptr
;
struct
descriptor
*
desc
=
ecpg_find_desc
(
line
,
name
);
if
(
desc
==
NULL
)
break
;
res
=
PQdescribePrepared
(
con
->
connection
,
stmt_name
);
if
(
!
ecpg_check_PQresult
(
res
,
line
,
con
->
connection
,
compat
))
break
;
if
(
desc
->
result
!=
NULL
)
PQclear
(
desc
->
result
);
desc
->
result
=
res
;
ret
=
true
;
break
;
}
case
ECPGt_sqlda
:
{
if
(
INFORMIX_MODE
(
compat
))
{
struct
sqlda_compat
**
_sqlda
=
ptr
;
struct
sqlda_compat
*
sqlda
;
res
=
PQdescribePrepared
(
con
->
connection
,
stmt_name
);
if
(
!
ecpg_check_PQresult
(
res
,
line
,
con
->
connection
,
compat
))
break
;
sqlda
=
ecpg_build_compat_sqlda
(
line
,
res
,
-
1
,
compat
);
if
(
sqlda
)
{
struct
sqlda_compat
*
sqlda_old
=
*
_sqlda
;
struct
sqlda_compat
*
sqlda_old1
;
while
(
sqlda_old
)
{
sqlda_old1
=
sqlda_old
->
desc_next
;
free
(
sqlda_old
);
sqlda_old
=
sqlda_old1
;
}
*
_sqlda
=
sqlda
;
ret
=
true
;
}
PQclear
(
res
);
}
else
{
struct
sqlda_struct
**
_sqlda
=
ptr
;
struct
sqlda_struct
*
sqlda
;
res
=
PQdescribePrepared
(
con
->
connection
,
stmt_name
);
if
(
!
ecpg_check_PQresult
(
res
,
line
,
con
->
connection
,
compat
))
break
;
sqlda
=
ecpg_build_native_sqlda
(
line
,
res
,
-
1
,
compat
);
if
(
sqlda
)
{
struct
sqlda_struct
*
sqlda_old
=
*
_sqlda
;
struct
sqlda_struct
*
sqlda_old1
;
while
(
sqlda_old
)
{
sqlda_old1
=
sqlda_old
->
desc_next
;
free
(
sqlda_old
);
sqlda_old
=
sqlda_old1
;
}
*
_sqlda
=
sqlda
;
ret
=
true
;
}
PQclear
(
res
);
}
break
;
}
default:
/* nothing else may come */
;
}
}
va_end
(
args
);
return
ret
;
}
src/interfaces/ecpg/ecpglib/extern.h
View file @
bf69b535
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/extern.h,v 1.3
6 2010/01/05 16:38:23
meskes Exp $ */
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/extern.h,v 1.3
7 2010/01/15 10:44:34
meskes Exp $ */
#ifndef _ECPG_LIB_EXTERN_H
#define _ECPG_LIB_EXTERN_H
...
...
@@ -60,6 +60,15 @@ struct statement
struct
variable
*
outlist
;
};
/* structure to store prepared statements for a connection */
struct
prepared_statement
{
char
*
name
;
bool
prepared
;
struct
statement
*
stmt
;
struct
prepared_statement
*
next
;
};
/* structure to store connections */
struct
connection
{
...
...
@@ -139,6 +148,9 @@ struct descriptor *ecpggetdescp(int, char *);
struct
descriptor
*
ecpg_find_desc
(
int
line
,
const
char
*
name
);
struct
prepared_statement
*
ecpg_find_prepared_statement
(
const
char
*
,
struct
connection
*
,
struct
prepared_statement
**
);
bool
ecpg_store_result
(
const
PGresult
*
results
,
int
act_field
,
const
struct
statement
*
stmt
,
struct
variable
*
var
);
bool
ecpg_store_input
(
const
int
,
const
bool
,
const
struct
variable
*
,
char
**
,
bool
);
...
...
src/interfaces/ecpg/ecpglib/prepare.c
View file @
bf69b535
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/prepare.c,v 1.3
3 2009/10/15 10:20:15
meskes Exp $ */
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/prepare.c,v 1.3
4 2010/01/15 10:44:34
meskes Exp $ */
#define POSTGRES_ECPG_INTERNAL
#include "postgres_fe.h"
...
...
@@ -11,14 +11,6 @@
#include "extern.h"
#include "sqlca.h"
struct
prepared_statement
{
char
*
name
;
bool
prepared
;
struct
statement
*
stmt
;
struct
prepared_statement
*
next
;
};
#define STMTID_SIZE 32
typedef
struct
...
...
@@ -35,8 +27,6 @@ static const int stmtCacheNBuckets = 2039; /* # buckets - a prime # */
static
const
int
stmtCacheEntPerBucket
=
8
;
/* # entries/bucket */
static
stmtCacheEntry
stmtCacheEntries
[
16384
]
=
{{
0
,
{
0
},
0
,
0
,
0
}};
static
struct
prepared_statement
*
find_prepared_statement
(
const
char
*
name
,
struct
connection
*
con
,
struct
prepared_statement
**
prev
);
static
bool
deallocate_one
(
int
lineno
,
enum
COMPAT_MODE
c
,
struct
connection
*
con
,
struct
prepared_statement
*
prev
,
struct
prepared_statement
*
this
);
...
...
@@ -126,7 +116,7 @@ ECPGprepare(int lineno, const char *connection_name, const bool questionmarks, c
return
false
;
/* check if we already have prepared this statement */
this
=
find_prepared_statement
(
name
,
con
,
&
prev
);
this
=
ecpg_
find_prepared_statement
(
name
,
con
,
&
prev
);
if
(
this
&&
!
deallocate_one
(
lineno
,
ECPG_COMPAT_PGSQL
,
con
,
prev
,
this
))
return
false
;
...
...
@@ -179,8 +169,8 @@ ECPGprepare(int lineno, const char *connection_name, const bool questionmarks, c
return
true
;
}
st
atic
st
ruct
prepared_statement
*
find_prepared_statement
(
const
char
*
name
,
struct
prepared_statement
*
ecpg_
find_prepared_statement
(
const
char
*
name
,
struct
connection
*
con
,
struct
prepared_statement
**
prev_
)
{
struct
prepared_statement
*
this
,
...
...
@@ -262,7 +252,7 @@ ECPGdeallocate(int lineno, int c, const char *connection_name, const char *name)
if
(
!
ecpg_init
(
con
,
connection_name
,
lineno
))
return
false
;
this
=
find_prepared_statement
(
name
,
con
,
&
prev
);
this
=
ecpg_
find_prepared_statement
(
name
,
con
,
&
prev
);
if
(
this
)
return
deallocate_one
(
lineno
,
c
,
con
,
prev
,
this
);
...
...
@@ -297,7 +287,7 @@ ecpg_prepared(const char *name, struct connection * con)
{
struct
prepared_statement
*
this
;
this
=
find_prepared_statement
(
name
,
con
,
NULL
);
this
=
ecpg_
find_prepared_statement
(
name
,
con
,
NULL
);
return
this
?
this
->
stmt
->
command
:
NULL
;
}
...
...
@@ -394,7 +384,7 @@ ecpg_freeStmtCacheEntry(int lineno, int compat, int entNo) /* entry # to free *
con
=
ecpg_get_connection
(
entry
->
connection
);
/* free the 'prepared_statement' list entry */
this
=
find_prepared_statement
(
entry
->
stmtID
,
con
,
&
prev
);
this
=
ecpg_
find_prepared_statement
(
entry
->
stmtID
,
con
,
&
prev
);
if
(
this
&&
!
deallocate_one
(
lineno
,
compat
,
con
,
prev
,
this
))
return
(
-
1
);
...
...
src/interfaces/ecpg/include/ecpglib.h
View file @
bf69b535
/*
* this is a small part of c.h since we don't want to leak all postgres
* definitions into ecpg programs
* $PostgreSQL: pgsql/src/interfaces/ecpg/include/ecpglib.h,v 1.8
0 2009/09/18 13:13:32
meskes Exp $
* $PostgreSQL: pgsql/src/interfaces/ecpg/include/ecpglib.h,v 1.8
1 2010/01/15 10:44:36
meskes Exp $
*/
#ifndef _ECPGLIB_H
...
...
@@ -83,7 +83,7 @@ bool ECPGset_desc(int, const char *, int,...);
void
ECPGset_noind_null
(
enum
ECPGttype
,
void
*
);
bool
ECPGis_noind_null
(
enum
ECPGttype
,
void
*
);
bool
ECPGdescribe
(
int
,
bool
,
const
char
*
,
...);
bool
ECPGdescribe
(
int
,
int
,
bool
,
const
char
*
,
const
char
*
,
...);
/* dynamic result allocation */
void
ECPGfree_auto_mem
(
void
);
...
...
src/interfaces/ecpg/preproc/ecpg.addons
View file @
bf69b535
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.addons,v 1.1
3 2010/01/05 16:38:23
meskes Exp $ */
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.addons,v 1.1
4 2010/01/15 10:44:37
meskes Exp $ */
ECPG: stmtClosePortalStmt block
{
if (INFORMIX_MODE)
...
...
@@ -84,7 +84,7 @@ ECPG: stmtViewStmt rule
}
| ECPGDescribe
{
fprintf(yyout, "{ ECPGdescribe(__LINE__, %
s,"
, $1);
fprintf(yyout, "{ ECPGdescribe(__LINE__, %
d, %s,", compat
, $1);
dump_variables(argsresult, 1);
fputs("ECPGt_EORT);", yyout);
fprintf(yyout, "}");
...
...
src/interfaces/ecpg/preproc/ecpg.trailer
View file @
bf69b535
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.trailer,v 1.1
7 2010/01/05 16:38:23
meskes Exp $ */
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.trailer,v 1.1
8 2010/01/15 10:44:37
meskes Exp $ */
statements: /*EMPTY*/
| statements statement
...
...
@@ -994,6 +994,13 @@ into_descriptor: INTO SQL_SQL SQL_DESCRIPTOR quoted_ident_stringvar
}
;
into_sqlda: INTO name
{
add_variable_to_head(&argsresult, sqlda_variable($2), &no_indicator);
$$ = EMPTY;
}
;
using_list: UsingValue | UsingValue ',' using_list;
UsingValue: UsingConst
...
...
@@ -1019,28 +1026,45 @@ UsingConst: Iconst { $$ = $1; }
;
/*
* We accept
descibe but do nothing with it
so far.
* We accept
DESCRIBE [OUTPUT] but do nothing with DESCRIBE INPUT
so far.
*/
ECPGDescribe: SQL_DESCRIBE INPUT_P name using_descriptor
ECPGDescribe: SQL_DESCRIBE INPUT_P
prepared_
name using_descriptor
{
const char *con = connection ? connection : "NULL";
mmerror(PARSE_ERROR, ET_WARNING, "using unsupported DESCRIBE statement");
$$ = (char *) mm_alloc(sizeof("1,
ECPGprepared_statement(, \"\", __LINE__)
") + strlen(con) + strlen($3));
sprintf($$, "1,
ECPGprepared_statement(%s, \"%s\", __LINE__)
", con, $3);
$$ = (char *) mm_alloc(sizeof("1,
,
") + strlen(con) + strlen($3));
sprintf($$, "1,
%s, %s
", con, $3);
}
| SQL_DESCRIBE opt_output name using_descriptor
| SQL_DESCRIBE opt_output
prepared_
name using_descriptor
{
const char *con = connection ? connection : "NULL";
mmerror(PARSE_ERROR, ET_WARNING, "using unsupported DESCRIBE statement");
$$ = (char *) mm_alloc(sizeof("0, ECPGprepared_statement(, \"\", __LINE__)") + strlen(con) + strlen($3));
sprintf($$, "0, ECPGprepared_statement(%s, \"%s\", __LINE__)", con, $3);
struct variable *var;
var = argsinsert->variable;
remove_variable_from_list(&argsinsert, var);
add_variable_to_head(&argsresult, var, &no_indicator);
$$ = (char *) mm_alloc(sizeof("0, , ") + strlen(con) + strlen($3));
sprintf($$, "0, %s, %s", con, $3);
}
| SQL_DESCRIBE opt_output name into_descriptor
| SQL_DESCRIBE opt_output prepared_name into_descriptor
{
const char *con = connection ? connection : "NULL";
$$ = (char *) mm_alloc(sizeof("0, , ") + strlen(con) + strlen($3));
sprintf($$, "0, %s, %s", con, $3);
}
| SQL_DESCRIBE INPUT_P prepared_name into_sqlda
{
const char *con = connection ? connection : "NULL";
mmerror(PARSE_ERROR, ET_WARNING, "using unsupported DESCRIBE statement");
$$ = (char *) mm_alloc(sizeof("0, ECPGprepared_statement(, \"\", __LINE__)") + strlen(con) + strlen($3));
sprintf($$, "0, ECPGprepared_statement(%s, \"%s\", __LINE__)", con, $3);
$$ = (char *) mm_alloc(sizeof("1, , ") + strlen(con) + strlen($3));
sprintf($$, "1, %s, %s", con, $3);
}
| SQL_DESCRIBE opt_output prepared_name into_sqlda
{
const char *con = connection ? connection : "NULL";
$$ = (char *) mm_alloc(sizeof("0, , ") + strlen(con) + strlen($3));
sprintf($$, "0, %s, %s", con, $3);
}
;
...
...
src/interfaces/ecpg/preproc/ecpg.type
View file @
bf69b535
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.type,v 1.
5 2010/01/05 16:38:23
meskes Exp $ */
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.type,v 1.
6 2010/01/15 10:44:37
meskes Exp $ */
%type <str> ECPGAllocateDescr
%type <str> ECPGCKeywords
%type <str> ECPGColId
...
...
@@ -72,6 +72,7 @@
%type <str> execute_rest
%type <str> indicator
%type <str> into_descriptor
%type <str> into_sqlda
%type <str> Iresult
%type <str> on_off
%type <str> opt_bit_field
...
...
src/interfaces/ecpg/test/compat_informix/Makefile
View file @
bf69b535
...
...
@@ -17,6 +17,7 @@ TESTS = test_informix test_informix.c \
rfmtlong rfmtlong.c
\
rnull rnull.c
\
sqlda sqlda.c
\
describe describe.c
\
charfuncs charfuncs.c
all
:
$(TESTS)
...
...
src/interfaces/ecpg/test/compat_informix/describe.pgc
0 → 100644
View file @
bf69b535
#include <stdlib.h>
#include <string.h>
exec sql include ../regression;
exec sql include sqlda.h;
exec sql whenever sqlerror stop;
sqlda_t *sqlda1, *sqlda2, *sqlda3;
int
main (void)
{
exec sql begin declare section;
char *stmt1 = "SELECT id, t FROM descr_t1";
char *stmt2 = "SELECT id, t FROM descr_t1 WHERE id = -1";
int i, count1, count2;
char field_name1[30] = "not set";
char field_name2[30] = "not set";
exec sql end declare section;
char msg[128];
ECPGdebug(1, stderr);
strcpy(msg, "connect");
exec sql connect to REGRESSDB1;
strcpy(msg, "set");
exec sql set datestyle to iso;
strcpy(msg, "create");
exec sql create table descr_t1(id serial primary key, t text);
strcpy(msg, "insert");
exec sql insert into descr_t1(id, t) values (default, 'a');
exec sql insert into descr_t1(id, t) values (default, 'b');
exec sql insert into descr_t1(id, t) values (default, 'c');
exec sql insert into descr_t1(id, t) values (default, 'd');
strcpy(msg, "commit");
exec sql commit;
/*
* Test DESCRIBE with a query producing tuples.
* DESCRIPTOR and SQL DESCRIPTOR are NOT the same in
* Informix-compat mode.
*/
strcpy(msg, "allocate");
exec sql allocate descriptor desc1;
exec sql allocate descriptor desc2;
strcpy(msg, "prepare");
exec sql prepare st_id1 FROM :stmt1;
sqlda1 = sqlda2 = sqlda3 = NULL;
strcpy(msg, "describe");
exec sql describe st_id1 into sql descriptor desc1;
exec sql describe st_id1 using sql descriptor desc2;
exec sql describe st_id1 into descriptor sqlda1;
exec sql describe st_id1 using descriptor sqlda2;
exec sql describe st_id1 into sqlda3;
if (sqlda1 == NULL)
{
printf("sqlda1 NULL\n");
exit(1);
}
if (sqlda2 == NULL)
{
printf("sqlda2 NULL\n");
exit(1);
}
if (sqlda3 == NULL)
{
printf("sqlda3 NULL\n");
exit(1);
}
strcpy(msg, "get descriptor");
exec sql get descriptor desc1 :count1 = count;
exec sql get descriptor desc1 :count2 = count;
if (count1 != count2)
{
printf("count1 (%d) != count2 (%d)\n", count1, count2);
exit(1);
}
if (count1 != sqlda1->sqld)
{
printf("count1 (%d) != sqlda1->sqld (%d)\n", count1, sqlda1->sqld);
exit(1);
}
if (count1 != sqlda2->sqld)
{
printf("count1 (%d) != sqlda2->sqld (%d)\n", count1, sqlda2->sqld);
exit(1);
}
if (count1 != sqlda3->sqld)
{
printf("count1 (%d) != sqlda3->sqld (%d)\n", count1, sqlda3->sqld);
exit(1);
}
for (i = 1; i <= count1; i++)
{
exec sql get descriptor desc1 value :i :field_name1 = name;
exec sql get descriptor desc2 value :i :field_name2 = name;
printf("%d\n\tfield_name1 '%s'\n\tfield_name2 '%s'\n\t"
"sqlda1 '%s'\n\tsqlda2 '%s'\n\tsqlda3 '%s'\n",
i, field_name1, field_name2,
sqlda1->sqlvar[i-1].sqlname,
sqlda2->sqlvar[i-1].sqlname,
sqlda3->sqlvar[i-1].sqlname);
}
strcpy(msg, "deallocate");
exec sql deallocate descriptor desc1;
exec sql deallocate descriptor desc2;
free(sqlda1);
free(sqlda2);
free(sqlda3);
exec sql deallocate prepare st_id1;
/* Test DESCRIBE with a query not producing tuples */
strcpy(msg, "allocate");
exec sql allocate descriptor desc1;
exec sql allocate descriptor desc2;
strcpy(msg, "prepare");
exec sql prepare st_id2 FROM :stmt2;
sqlda1 = sqlda2 = sqlda3 = NULL;
strcpy(msg, "describe");
exec sql describe st_id2 into sql descriptor desc1;
exec sql describe st_id2 using sql descriptor desc2;
exec sql describe st_id2 into descriptor sqlda1;
exec sql describe st_id2 using descriptor sqlda2;
exec sql describe st_id2 into sqlda3;
if (sqlda1 == NULL || sqlda1 == NULL || sqlda2 == NULL)
exit(1);
strcpy(msg, "get descriptor");
exec sql get descriptor desc1 :count1 = count;
exec sql get descriptor desc1 :count2 = count;
if (!( count1 == count2 &&
count1 == sqlda1->sqld &&
count1 == sqlda2->sqld &&
count1 == sqlda3->sqld))
exit(1);
for (i = 1; i <= count1; i++)
{
exec sql get descriptor desc1 value :i :field_name1 = name;
exec sql get descriptor desc2 value :i :field_name2 = name;
printf("%d\n\tfield_name1 '%s'\n\tfield_name2 '%s'\n\t"
"sqlda1 '%s'\n\tsqlda2 '%s'\n\tsqlda3 '%s'\n",
i, field_name1, field_name2,
sqlda1->sqlvar[i-1].sqlname,
sqlda2->sqlvar[i-1].sqlname,
sqlda3->sqlvar[i-1].sqlname);
}
strcpy(msg, "deallocate");
exec sql deallocate descriptor desc1;
exec sql deallocate descriptor desc2;
free(sqlda1);
free(sqlda2);
free(sqlda3);
exec sql deallocate prepare st_id2;
/* End test */
strcpy(msg, "drop");
exec sql drop table descr_t1;
strcpy(msg, "commit");
exec sql commit;
strcpy(msg, "disconnect");
exec sql disconnect;
return (0);
}
src/interfaces/ecpg/test/ecpg_schedule
View file @
bf69b535
...
...
@@ -4,6 +4,7 @@ test: compat_informix/rfmtdate
test: compat_informix/rfmtlong
test: compat_informix/rnull
test: compat_informix/sqlda
test: compat_informix/describe
test: compat_informix/test_informix
test: compat_informix/test_informix2
test: connect/test2
...
...
@@ -31,6 +32,7 @@ test: sql/copystdout
test: sql/define
test: sql/desc
test: sql/sqlda
test: sql/describe
test: sql/dynalloc
test: sql/dynalloc2
test: sql/dyntest
...
...
src/interfaces/ecpg/test/ecpg_schedule_tcp
View file @
bf69b535
...
...
@@ -4,6 +4,7 @@ test: compat_informix/rfmtdate
test: compat_informix/rfmtlong
test: compat_informix/rnull
test: compat_informix/sqlda
test: compat_informix/describe
test: compat_informix/test_informix
test: compat_informix/test_informix2
test: connect/test2
...
...
@@ -31,6 +32,7 @@ test: sql/copystdout
test: sql/define
test: sql/desc
test: sql/sqlda
test: sql/describe
test: sql/dynalloc
test: sql/dynalloc2
test: sql/dyntest
...
...
src/interfaces/ecpg/test/expected/compat_informix-describe.c
0 → 100644
View file @
bf69b535
This diff is collapsed.
Click to expand it.
src/interfaces/ecpg/test/expected/compat_informix-describe.stderr
0 → 100644
View file @
bf69b535
[NO_PID]: ECPGdebug: set to 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGconnect: opening database regress1 on <DEFAULT> port <DEFAULT>
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 30: query: set datestyle to iso; with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 30: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 30: OK: SET
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 33: query: create table descr_t1 ( id serial primary key , t text ); with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 33: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 33: OK: CREATE TABLE
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 36: query: insert into descr_t1 ( id , t ) values ( default , 'a' ); with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 36: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 36: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 37: query: insert into descr_t1 ( id , t ) values ( default , 'b' ); with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 37: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 37: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 38: query: insert into descr_t1 ( id , t ) values ( default , 'c' ); with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 38: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 38: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 39: query: insert into descr_t1 ( id , t ) values ( default , 'd' ); with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 39: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 39: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGtrans on line 42: action "commit"; connection "regress1"
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGprepare on line 55: name st_id1; query: "SELECT id, t FROM descr_t1"
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_compat_sqlda on line 63 sqld = 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_compat_sqlda on line 64 sqld = 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_compat_sqlda on line 65 sqld = 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc_header: found 2 attributes
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc_header: found 2 attributes
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = id
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = id
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = t
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = t
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGdeallocate on line 132: name st_id1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGprepare on line 141: name st_id2; query: "SELECT id, t FROM descr_t1 WHERE id = -1"
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_compat_sqlda on line 149 sqld = 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_compat_sqlda on line 150 sqld = 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_compat_sqlda on line 151 sqld = 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc_header: found 2 attributes
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc_header: found 2 attributes
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = id
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = id
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = t
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = t
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGdeallocate on line 185: name st_id2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 190: query: drop table descr_t1; with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 190: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 190: OK: DROP TABLE
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGtrans on line 193: action "commit"; connection "regress1"
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_finish: connection regress1 closed
[NO_PID]: sqlca: code: 0, state: 00000
src/interfaces/ecpg/test/expected/compat_informix-describe.stdout
0 → 100644
View file @
bf69b535
1
field_name1 'id'
field_name2 'id'
sqlda1 'id'
sqlda2 'id'
sqlda3 'id'
2
field_name1 't'
field_name2 't'
sqlda1 't'
sqlda2 't'
sqlda3 't'
1
field_name1 'id'
field_name2 'id'
sqlda1 'id'
sqlda2 'id'
sqlda3 'id'
2
field_name1 't'
field_name2 't'
sqlda1 't'
sqlda2 't'
sqlda3 't'
src/interfaces/ecpg/test/expected/preproc-describe.c
0 → 100644
View file @
bf69b535
This diff is collapsed.
Click to expand it.
src/interfaces/ecpg/test/expected/preproc-describe.stderr
0 → 100644
View file @
bf69b535
[NO_PID]: ECPGdebug: set to 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGconnect: opening database regress1 on <DEFAULT> port <DEFAULT>
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 29: query: set datestyle to iso; with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 29: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 29: OK: SET
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 32: query: create table t1 ( id serial primary key , t text ); with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 32: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 32: OK: CREATE TABLE
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 35: query: insert into t1 ( id , t ) values ( default , 'a' ); with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 35: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 35: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 36: query: insert into t1 ( id , t ) values ( default , 'b' ); with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 36: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 36: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 37: query: insert into t1 ( id , t ) values ( default , 'c' ); with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 37: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 37: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 38: query: insert into t1 ( id , t ) values ( default , 'd' ); with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 38: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 38: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGtrans on line 41: action "commit"; connection "regress1"
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGprepare on line 55: name st_id1; query: "SELECT id, t FROM t1"
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc_header: found 2 attributes
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc_header: found 2 attributes
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc_header: found 2 attributes
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc_header: found 2 attributes
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = id
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = id
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = id
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = id
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = t
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = t
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = t
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = t
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGdeallocate on line 88: name st_id1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGprepare on line 99: name st_id2; query: "SELECT id, t FROM t1 WHERE id = -1"
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc_header: found 2 attributes
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc_header: found 2 attributes
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc_header: found 2 attributes
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc_header: found 2 attributes
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = id
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = id
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = id
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = id
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = t
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = t
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = t
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = t
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGdeallocate on line 132: name st_id2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 138: query: drop table t1; with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 138: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 138: OK: DROP TABLE
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGtrans on line 141: action "commit"; connection "regress1"
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_finish: connection regress1 closed
[NO_PID]: sqlca: code: 0, state: 00000
src/interfaces/ecpg/test/expected/preproc-describe.stdout
0 → 100644
View file @
bf69b535
field_name 1 'id' 2 'id' 3 'id' 4 'id'
field_name 1 't' 2 't' 3 't' 4 't'
field_name 1 'id' 2 'id' 3 'id' 4 'id'
field_name 1 't' 2 't' 3 't' 4 't'
src/interfaces/ecpg/test/expected/sql-describe.c
0 → 100644
View file @
bf69b535
This diff is collapsed.
Click to expand it.
src/interfaces/ecpg/test/expected/sql-describe.stderr
0 → 100644
View file @
bf69b535
[NO_PID]: ECPGdebug: set to 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGconnect: opening database regress1 on <DEFAULT> port <DEFAULT>
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 30: query: set datestyle to iso; with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 30: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 30: OK: SET
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 33: query: create table descr_t2 ( id serial primary key , t text ); with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 33: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 33: OK: CREATE TABLE
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 36: query: insert into descr_t2 ( id , t ) values ( default , 'a' ); with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 36: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 36: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 37: query: insert into descr_t2 ( id , t ) values ( default , 'b' ); with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 37: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 37: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 38: query: insert into descr_t2 ( id , t ) values ( default , 'c' ); with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 38: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 38: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 39: query: insert into descr_t2 ( id , t ) values ( default , 'd' ); with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 39: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 39: OK: INSERT 0 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGtrans on line 42: action "commit"; connection "regress1"
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGprepare on line 55: name st_id1; query: "SELECT id, t FROM descr_t2"
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_native_sqlda on line 63 sqld = 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_native_sqlda on line 64 sqld = 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_native_sqlda on line 65 sqld = 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc_header: found 2 attributes
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc_header: found 2 attributes
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = id
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = id
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = t
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = t
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGdeallocate on line 132: name st_id1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGprepare on line 141: name st_id2; query: "SELECT id, t FROM descr_t2 WHERE id = -1"
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_native_sqlda on line 149 sqld = 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_native_sqlda on line 150 sqld = 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_build_native_sqlda on line 151 sqld = 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc_header: found 2 attributes
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc_header: found 2 attributes
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = id
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = id
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = t
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: reading items for tuple 2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGget_desc: NAME = t
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGdeallocate on line 185: name st_id2
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 190: query: drop table descr_t2; with 0 parameter(s) on connection regress1
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 190: using PQexec
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_execute on line 190: OK: DROP TABLE
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ECPGtrans on line 193: action "commit"; connection "regress1"
[NO_PID]: sqlca: code: 0, state: 00000
[NO_PID]: ecpg_finish: connection regress1 closed
[NO_PID]: sqlca: code: 0, state: 00000
src/interfaces/ecpg/test/expected/sql-describe.stdout
0 → 100644
View file @
bf69b535
1
field_name1 'id'
field_name2 'id'
sqlda1 'id'
sqlda2 'id'
sqlda3 'id'
2
field_name1 't'
field_name2 't'
sqlda1 't'
sqlda2 't'
sqlda3 't'
1
field_name1 'id'
field_name2 'id'
sqlda1 'id'
sqlda2 'id'
sqlda3 'id'
2
field_name1 't'
field_name2 't'
sqlda1 't'
sqlda2 't'
sqlda3 't'
src/interfaces/ecpg/test/sql/Makefile
View file @
bf69b535
...
...
@@ -9,6 +9,8 @@ TESTS = array array.c \
copystdout copystdout.c
\
define define.c
\
desc desc.c
\
sqlda sqlda.c
\
describe describe.c
\
dyntest dyntest.c
\
dynalloc dynalloc.c
\
dynalloc2 dynalloc2.c
\
...
...
@@ -20,7 +22,6 @@ TESTS = array array.c \
parser parser.c
\
quote quote.c
\
show show.c
\
sqlda sqlda.c
\
insupd insupd.c
all
:
$(TESTS)
...
...
src/interfaces/ecpg/test/sql/describe.pgc
0 → 100644
View file @
bf69b535
#include <stdlib.h>
#include <string.h>
exec sql include ../regression;
exec sql include sqlda.h;
exec sql whenever sqlerror stop;
sqlda_t *sqlda1, *sqlda2, *sqlda3;
int
main (void)
{
exec sql begin declare section;
char *stmt1 = "SELECT id, t FROM descr_t2";
char *stmt2 = "SELECT id, t FROM descr_t2 WHERE id = -1";
int i, count1, count2;
char field_name1[30] = "not set";
char field_name2[30] = "not set";
exec sql end declare section;
char msg[128];
ECPGdebug(1, stderr);
strcpy(msg, "connect");
exec sql connect to REGRESSDB1;
strcpy(msg, "set");
exec sql set datestyle to iso;
strcpy(msg, "create");
exec sql create table descr_t2(id serial primary key, t text);
strcpy(msg, "insert");
exec sql insert into descr_t2(id, t) values (default, 'a');
exec sql insert into descr_t2(id, t) values (default, 'b');
exec sql insert into descr_t2(id, t) values (default, 'c');
exec sql insert into descr_t2(id, t) values (default, 'd');
strcpy(msg, "commit");
exec sql commit;
/*
* Test DESCRIBE with a query producing tuples.
* DESCRIPTOR and SQL DESCRIPTOR are NOT the same in
* Informix-compat mode.
*/
strcpy(msg, "allocate");
exec sql allocate descriptor desc1;
exec sql allocate descriptor desc2;
strcpy(msg, "prepare");
exec sql prepare st_id1 FROM :stmt1;
sqlda1 = sqlda2 = sqlda3 = NULL;
strcpy(msg, "describe");
exec sql describe st_id1 into sql descriptor desc1;
exec sql describe st_id1 using sql descriptor desc2;
exec sql describe st_id1 into descriptor sqlda1;
exec sql describe st_id1 using descriptor sqlda2;
exec sql describe st_id1 into sqlda3;
if (sqlda1 == NULL)
{
printf("sqlda1 NULL\n");
exit(1);
}
if (sqlda2 == NULL)
{
printf("sqlda2 NULL\n");
exit(1);
}
if (sqlda3 == NULL)
{
printf("sqlda3 NULL\n");
exit(1);
}
strcpy(msg, "get descriptor");
exec sql get descriptor desc1 :count1 = count;
exec sql get descriptor desc1 :count2 = count;
if (count1 != count2)
{
printf("count1 (%d) != count2 (%d)\n", count1, count2);
exit(1);
}
if (count1 != sqlda1->sqld)
{
printf("count1 (%d) != sqlda1->sqld (%d)\n", count1, sqlda1->sqld);
exit(1);
}
if (count1 != sqlda2->sqld)
{
printf("count1 (%d) != sqlda2->sqld (%d)\n", count1, sqlda2->sqld);
exit(1);
}
if (count1 != sqlda3->sqld)
{
printf("count1 (%d) != sqlda3->sqld (%d)\n", count1, sqlda3->sqld);
exit(1);
}
for (i = 1; i <= count1; i++)
{
exec sql get descriptor desc1 value :i :field_name1 = name;
exec sql get descriptor desc2 value :i :field_name2 = name;
printf("%d\n\tfield_name1 '%s'\n\tfield_name2 '%s'\n\t"
"sqlda1 '%s'\n\tsqlda2 '%s'\n\tsqlda3 '%s'\n",
i, field_name1, field_name2,
sqlda1->sqlvar[i-1].sqlname.data,
sqlda2->sqlvar[i-1].sqlname.data,
sqlda3->sqlvar[i-1].sqlname.data);
}
strcpy(msg, "deallocate");
exec sql deallocate descriptor desc1;
exec sql deallocate descriptor desc2;
free(sqlda1);
free(sqlda2);
free(sqlda3);
exec sql deallocate prepare st_id1;
/* Test DESCRIBE with a query not producing tuples */
strcpy(msg, "allocate");
exec sql allocate descriptor desc1;
exec sql allocate descriptor desc2;
strcpy(msg, "prepare");
exec sql prepare st_id2 FROM :stmt2;
sqlda1 = sqlda2 = sqlda3 = NULL;
strcpy(msg, "describe");
exec sql describe st_id2 into sql descriptor desc1;
exec sql describe st_id2 using sql descriptor desc2;
exec sql describe st_id2 into descriptor sqlda1;
exec sql describe st_id2 using descriptor sqlda2;
exec sql describe st_id2 into sqlda3;
if (sqlda1 == NULL || sqlda1 == NULL || sqlda2 == NULL)
exit(1);
strcpy(msg, "get descriptor");
exec sql get descriptor desc1 :count1 = count;
exec sql get descriptor desc1 :count2 = count;
if (!( count1 == count2 &&
count1 == sqlda1->sqld &&
count1 == sqlda2->sqld &&
count1 == sqlda3->sqld))
exit(1);
for (i = 1; i <= count1; i++)
{
exec sql get descriptor desc1 value :i :field_name1 = name;
exec sql get descriptor desc2 value :i :field_name2 = name;
printf("%d\n\tfield_name1 '%s'\n\tfield_name2 '%s'\n\t"
"sqlda1 '%s'\n\tsqlda2 '%s'\n\tsqlda3 '%s'\n",
i, field_name1, field_name2,
sqlda1->sqlvar[i-1].sqlname.data,
sqlda2->sqlvar[i-1].sqlname.data,
sqlda3->sqlvar[i-1].sqlname.data);
}
strcpy(msg, "deallocate");
exec sql deallocate descriptor desc1;
exec sql deallocate descriptor desc2;
free(sqlda1);
free(sqlda2);
free(sqlda3);
exec sql deallocate prepare st_id2;
/* End test */
strcpy(msg, "drop");
exec sql drop table descr_t2;
strcpy(msg, "commit");
exec sql commit;
strcpy(msg, "disconnect");
exec sql disconnect;
return (0);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment