mirror of
https://github.com/postgres/postgres.git
synced 2025-08-18 12:22:09 +03:00
This will only actually exercise the "long long" code paths on platforms where "long" is 32 bits --- otherwise, the SQL bigint type maps to plain "long", and we will test that code path instead. But that's probably sufficient coverage, and anyway we weren't testing either code path before. Dang Minh Huong, tweaked a bit by me Discussion: https://postgr.es/m/151935568942.1461.14623890240535309745@wrigleys.postgresql.org
540 lines
12 KiB
C
540 lines
12 KiB
C
/* Processed by ecpg (regression mode) */
|
|
/* These include files are added by the preprocessor */
|
|
#include <ecpglib.h>
|
|
#include <ecpgerrno.h>
|
|
#include <sqlca.h>
|
|
/* End of automatic include section */
|
|
#define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y))
|
|
|
|
#line 1 "sqlda.pgc"
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <limits.h>
|
|
|
|
|
|
#line 1 "regression.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#line 5 "sqlda.pgc"
|
|
|
|
|
|
|
|
#line 1 "sqlda.h"
|
|
#ifndef ECPG_SQLDA_H
|
|
#define ECPG_SQLDA_H
|
|
|
|
#ifdef _ECPG_INFORMIX_H
|
|
|
|
#include "sqlda-compat.h"
|
|
typedef struct sqlvar_compat sqlvar_t;
|
|
typedef struct sqlda_compat sqlda_t;
|
|
|
|
#else
|
|
|
|
#include "sqlda-native.h"
|
|
typedef struct sqlvar_struct sqlvar_t;
|
|
typedef struct sqlda_struct sqlda_t;
|
|
|
|
#endif
|
|
|
|
#endif /* ECPG_SQLDA_H */
|
|
|
|
#line 7 "sqlda.pgc"
|
|
|
|
|
|
#line 1 "pgtypes_numeric.h"
|
|
#ifndef PGTYPES_NUMERIC
|
|
#define PGTYPES_NUMERIC
|
|
|
|
#define NUMERIC_POS 0x0000
|
|
#define NUMERIC_NEG 0x4000
|
|
#define NUMERIC_NAN 0xC000
|
|
#define NUMERIC_NULL 0xF000
|
|
#define NUMERIC_MAX_PRECISION 1000
|
|
#define NUMERIC_MAX_DISPLAY_SCALE NUMERIC_MAX_PRECISION
|
|
#define NUMERIC_MIN_DISPLAY_SCALE 0
|
|
#define NUMERIC_MIN_SIG_DIGITS 16
|
|
|
|
#define DECSIZE 30
|
|
|
|
typedef unsigned char NumericDigit;
|
|
typedef struct
|
|
{
|
|
int ndigits; /* number of digits in digits[] - can be 0! */
|
|
int weight; /* weight of first digit */
|
|
int rscale; /* result scale */
|
|
int dscale; /* display scale */
|
|
int sign; /* NUMERIC_POS, NUMERIC_NEG, or NUMERIC_NAN */
|
|
NumericDigit *buf; /* start of alloc'd space for digits[] */
|
|
NumericDigit *digits; /* decimal digits */
|
|
} numeric;
|
|
|
|
typedef struct
|
|
{
|
|
int ndigits; /* number of digits in digits[] - can be 0! */
|
|
int weight; /* weight of first digit */
|
|
int rscale; /* result scale */
|
|
int dscale; /* display scale */
|
|
int sign; /* NUMERIC_POS, NUMERIC_NEG, or NUMERIC_NAN */
|
|
NumericDigit digits[DECSIZE]; /* decimal digits */
|
|
} decimal;
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif
|
|
|
|
numeric *PGTYPESnumeric_new(void);
|
|
decimal *PGTYPESdecimal_new(void);
|
|
void PGTYPESnumeric_free(numeric *);
|
|
void PGTYPESdecimal_free(decimal *);
|
|
numeric *PGTYPESnumeric_from_asc(char *, char **);
|
|
char *PGTYPESnumeric_to_asc(numeric *, int);
|
|
int PGTYPESnumeric_add(numeric *, numeric *, numeric *);
|
|
int PGTYPESnumeric_sub(numeric *, numeric *, numeric *);
|
|
int PGTYPESnumeric_mul(numeric *, numeric *, numeric *);
|
|
int PGTYPESnumeric_div(numeric *, numeric *, numeric *);
|
|
int PGTYPESnumeric_cmp(numeric *, numeric *);
|
|
int PGTYPESnumeric_from_int(signed int, numeric *);
|
|
int PGTYPESnumeric_from_long(signed long int, numeric *);
|
|
int PGTYPESnumeric_copy(numeric *, numeric *);
|
|
int PGTYPESnumeric_from_double(double, numeric *);
|
|
int PGTYPESnumeric_to_double(numeric *, double *);
|
|
int PGTYPESnumeric_to_int(numeric *, int *);
|
|
int PGTYPESnumeric_to_long(numeric *, long *);
|
|
int PGTYPESnumeric_to_decimal(numeric *, decimal *);
|
|
int PGTYPESnumeric_from_decimal(decimal *, numeric *);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* PGTYPES_NUMERIC */
|
|
|
|
#line 8 "sqlda.pgc"
|
|
|
|
|
|
/* exec sql whenever sqlerror stop ; */
|
|
#line 10 "sqlda.pgc"
|
|
|
|
|
|
/* These shouldn't be under DECLARE SECTION */
|
|
sqlda_t *inp_sqlda, *outp_sqlda, *outp_sqlda1;
|
|
|
|
static void
|
|
dump_sqlda(sqlda_t *sqlda)
|
|
{
|
|
int i;
|
|
|
|
if (sqlda == NULL)
|
|
{
|
|
printf("dump_sqlda called with NULL sqlda\n");
|
|
return;
|
|
}
|
|
|
|
for (i = 0; i < sqlda->sqld; i++)
|
|
{
|
|
if (sqlda->sqlvar[i].sqlind && *(sqlda->sqlvar[i].sqlind) == -1)
|
|
printf("name sqlda descriptor: '%s' value NULL'\n", sqlda->sqlvar[i].sqlname.data);
|
|
else
|
|
switch (sqlda->sqlvar[i].sqltype)
|
|
{
|
|
case ECPGt_char:
|
|
printf("name sqlda descriptor: '%s' value '%s'\n", sqlda->sqlvar[i].sqlname.data, sqlda->sqlvar[i].sqldata);
|
|
break;
|
|
case ECPGt_int:
|
|
printf("name sqlda descriptor: '%s' value %d\n", sqlda->sqlvar[i].sqlname.data, *(int *)sqlda->sqlvar[i].sqldata);
|
|
break;
|
|
case ECPGt_long:
|
|
printf("name sqlda descriptor: '%s' value %ld\n", sqlda->sqlvar[i].sqlname.data, *(long int *)sqlda->sqlvar[i].sqldata);
|
|
break;
|
|
#ifdef HAVE_LONG_LONG_INT
|
|
case ECPGt_long_long:
|
|
printf("name sqlda descriptor: '%s' value %lld\n", sqlda->sqlvar[i].sqlname.data, *(long long int *)sqlda->sqlvar[i].sqldata);
|
|
break;
|
|
#endif
|
|
case ECPGt_double:
|
|
printf("name sqlda descriptor: '%s' value %lf\n", sqlda->sqlvar[i].sqlname.data, *(double *)sqlda->sqlvar[i].sqldata);
|
|
break;
|
|
case ECPGt_numeric:
|
|
{
|
|
char *val;
|
|
|
|
val = PGTYPESnumeric_to_asc((numeric*)sqlda->sqlvar[i].sqldata, -1);
|
|
printf("name sqlda descriptor: '%s' value NUMERIC '%s'\n", sqlda->sqlvar[i].sqlname.data, val);
|
|
free(val);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
int
|
|
main (void)
|
|
{
|
|
/* exec sql begin declare section */
|
|
|
|
|
|
|
|
|
|
|
|
#line 67 "sqlda.pgc"
|
|
char * stmt1 = "SELECT * FROM t1" ;
|
|
|
|
#line 68 "sqlda.pgc"
|
|
char * stmt2 = "SELECT * FROM t1 WHERE id = ?" ;
|
|
|
|
#line 69 "sqlda.pgc"
|
|
int rec ;
|
|
|
|
#line 70 "sqlda.pgc"
|
|
int id ;
|
|
/* exec sql end declare section */
|
|
#line 71 "sqlda.pgc"
|
|
|
|
|
|
char msg[128];
|
|
|
|
ECPGdebug(1, stderr);
|
|
|
|
strcpy(msg, "connect");
|
|
{ ECPGconnect(__LINE__, 0, "regress1" , NULL, NULL , "regress1", 0);
|
|
#line 78 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 78 "sqlda.pgc"
|
|
|
|
|
|
strcpy(msg, "set");
|
|
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "set datestyle to iso", ECPGt_EOIT, ECPGt_EORT);
|
|
#line 81 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 81 "sqlda.pgc"
|
|
|
|
|
|
strcpy(msg, "create");
|
|
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table t1 ( id integer , t text , d1 numeric , d2 float8 , c char ( 10 ) , big bigint )", ECPGt_EOIT, ECPGt_EORT);
|
|
#line 91 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 91 "sqlda.pgc"
|
|
|
|
|
|
strcpy(msg, "insert");
|
|
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into t1 values ( 1 , 'a' , 1.0 , 1 , 'a' , 1111111111111111111 ) , ( 2 , null , null , null , null , null ) , ( 4 , 'd' , 4.0 , 4 , 'd' , 4444444444444444444 )", ECPGt_EOIT, ECPGt_EORT);
|
|
#line 97 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 97 "sqlda.pgc"
|
|
|
|
|
|
strcpy(msg, "commit");
|
|
{ ECPGtrans(__LINE__, NULL, "commit");
|
|
#line 100 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 100 "sqlda.pgc"
|
|
|
|
|
|
/* SQLDA test for getting all records from a table */
|
|
|
|
outp_sqlda = NULL;
|
|
|
|
strcpy(msg, "prepare");
|
|
{ ECPGprepare(__LINE__, NULL, 0, "st_id1", stmt1);
|
|
#line 107 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 107 "sqlda.pgc"
|
|
|
|
|
|
strcpy(msg, "declare");
|
|
/* declare mycur1 cursor for $1 */
|
|
#line 110 "sqlda.pgc"
|
|
|
|
|
|
strcpy(msg, "open");
|
|
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur1 cursor for $1",
|
|
ECPGt_char_variable,(ECPGprepared_statement(NULL, "st_id1", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
|
|
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
|
|
#line 113 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 113 "sqlda.pgc"
|
|
|
|
|
|
/* exec sql whenever not found break ; */
|
|
#line 115 "sqlda.pgc"
|
|
|
|
|
|
rec = 0;
|
|
while (1)
|
|
{
|
|
strcpy(msg, "fetch");
|
|
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch 1 from mycur1", ECPGt_EOIT,
|
|
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
|
|
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
|
|
#line 121 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode == ECPG_NOT_FOUND) break;
|
|
#line 121 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 121 "sqlda.pgc"
|
|
|
|
|
|
printf("FETCH RECORD %d\n", ++rec);
|
|
dump_sqlda(outp_sqlda);
|
|
}
|
|
|
|
/* exec sql whenever not found continue ; */
|
|
#line 127 "sqlda.pgc"
|
|
|
|
|
|
strcpy(msg, "close");
|
|
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur1", ECPGt_EOIT, ECPGt_EORT);
|
|
#line 130 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 130 "sqlda.pgc"
|
|
|
|
|
|
strcpy(msg, "deallocate");
|
|
{ ECPGdeallocate(__LINE__, 0, NULL, "st_id1");
|
|
#line 133 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 133 "sqlda.pgc"
|
|
|
|
|
|
free(outp_sqlda);
|
|
|
|
/* SQLDA test for getting ALL records into the sqlda list */
|
|
|
|
outp_sqlda = NULL;
|
|
|
|
strcpy(msg, "prepare");
|
|
{ ECPGprepare(__LINE__, NULL, 0, "st_id2", stmt1);
|
|
#line 142 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 142 "sqlda.pgc"
|
|
|
|
|
|
strcpy(msg, "declare");
|
|
/* declare mycur2 cursor for $1 */
|
|
#line 145 "sqlda.pgc"
|
|
|
|
|
|
strcpy(msg, "open");
|
|
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "declare mycur2 cursor for $1",
|
|
ECPGt_char_variable,(ECPGprepared_statement(NULL, "st_id2", __LINE__)),(long)1,(long)1,(1)*sizeof(char),
|
|
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
|
|
#line 148 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 148 "sqlda.pgc"
|
|
|
|
|
|
strcpy(msg, "fetch");
|
|
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "fetch all from mycur2", ECPGt_EOIT,
|
|
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
|
|
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
|
|
#line 151 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 151 "sqlda.pgc"
|
|
|
|
|
|
outp_sqlda1 = outp_sqlda;
|
|
rec = 0;
|
|
while (outp_sqlda1)
|
|
{
|
|
sqlda_t *ptr;
|
|
printf("FETCH RECORD %d\n", ++rec);
|
|
dump_sqlda(outp_sqlda1);
|
|
|
|
ptr = outp_sqlda1;
|
|
outp_sqlda1 = outp_sqlda1->desc_next;
|
|
free(ptr);
|
|
}
|
|
|
|
strcpy(msg, "close");
|
|
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "close mycur2", ECPGt_EOIT, ECPGt_EORT);
|
|
#line 167 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 167 "sqlda.pgc"
|
|
|
|
|
|
strcpy(msg, "deallocate");
|
|
{ ECPGdeallocate(__LINE__, 0, NULL, "st_id2");
|
|
#line 170 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 170 "sqlda.pgc"
|
|
|
|
|
|
/* SQLDA test for getting one record using an input descriptor */
|
|
|
|
/*
|
|
* Input sqlda has to be built manually
|
|
* sqlda_t contains 1 sqlvar_t structure already.
|
|
*/
|
|
inp_sqlda = (sqlda_t *)malloc(sizeof(sqlda_t));
|
|
memset(inp_sqlda, 0, sizeof(sqlda_t));
|
|
inp_sqlda->sqln = 1;
|
|
|
|
inp_sqlda->sqlvar[0].sqltype = ECPGt_int;
|
|
inp_sqlda->sqlvar[0].sqldata = (char *)&id;
|
|
|
|
printf("EXECUTE RECORD 4\n");
|
|
|
|
id = 4;
|
|
|
|
outp_sqlda = NULL;
|
|
|
|
strcpy(msg, "prepare");
|
|
{ ECPGprepare(__LINE__, NULL, 0, "st_id3", stmt2);
|
|
#line 192 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 192 "sqlda.pgc"
|
|
|
|
|
|
strcpy(msg, "execute");
|
|
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_execute, "st_id3",
|
|
ECPGt_sqlda, &inp_sqlda, 0L, 0L, 0L,
|
|
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
|
|
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
|
|
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
|
|
#line 195 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 195 "sqlda.pgc"
|
|
|
|
|
|
dump_sqlda(outp_sqlda);
|
|
|
|
strcpy(msg, "deallocate");
|
|
{ ECPGdeallocate(__LINE__, 0, NULL, "st_id3");
|
|
#line 200 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 200 "sqlda.pgc"
|
|
|
|
|
|
free(inp_sqlda);
|
|
free(outp_sqlda);
|
|
|
|
/* SQLDA test for getting one record using an input descriptor
|
|
* on a named connection
|
|
*/
|
|
|
|
{ ECPGconnect(__LINE__, 0, "regress1" , NULL, NULL , "con2", 0);
|
|
#line 209 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 209 "sqlda.pgc"
|
|
|
|
|
|
/*
|
|
* Input sqlda has to be built manually
|
|
* sqlda_t contains 1 sqlvar_t structure already.
|
|
*/
|
|
inp_sqlda = (sqlda_t *)malloc(sizeof(sqlda_t));
|
|
memset(inp_sqlda, 0, sizeof(sqlda_t));
|
|
inp_sqlda->sqln = 1;
|
|
|
|
inp_sqlda->sqlvar[0].sqltype = ECPGt_int;
|
|
inp_sqlda->sqlvar[0].sqldata = (char *)&id;
|
|
|
|
printf("EXECUTE RECORD 4\n");
|
|
|
|
id = 4;
|
|
|
|
outp_sqlda = NULL;
|
|
|
|
strcpy(msg, "prepare");
|
|
{ ECPGprepare(__LINE__, "con2", 0, "st_id4", stmt2);
|
|
#line 229 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 229 "sqlda.pgc"
|
|
|
|
|
|
strcpy(msg, "execute");
|
|
{ ECPGdo(__LINE__, 0, 1, "con2", 0, ECPGst_execute, "st_id4",
|
|
ECPGt_sqlda, &inp_sqlda, 0L, 0L, 0L,
|
|
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
|
|
ECPGt_sqlda, &outp_sqlda, 0L, 0L, 0L,
|
|
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
|
|
#line 232 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 232 "sqlda.pgc"
|
|
|
|
|
|
dump_sqlda(outp_sqlda);
|
|
|
|
strcpy(msg, "commit");
|
|
{ ECPGtrans(__LINE__, "con2", "commit");
|
|
#line 237 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 237 "sqlda.pgc"
|
|
|
|
|
|
strcpy(msg, "deallocate");
|
|
{ ECPGdeallocate(__LINE__, 0, NULL, "st_id4");
|
|
#line 240 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 240 "sqlda.pgc"
|
|
|
|
|
|
free(inp_sqlda);
|
|
free(outp_sqlda);
|
|
|
|
strcpy(msg, "disconnect");
|
|
{ ECPGdisconnect(__LINE__, "con2");
|
|
#line 246 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 246 "sqlda.pgc"
|
|
|
|
|
|
/* End test */
|
|
|
|
strcpy(msg, "drop");
|
|
{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table t1", ECPGt_EOIT, ECPGt_EORT);
|
|
#line 251 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 251 "sqlda.pgc"
|
|
|
|
|
|
strcpy(msg, "commit");
|
|
{ ECPGtrans(__LINE__, NULL, "commit");
|
|
#line 254 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 254 "sqlda.pgc"
|
|
|
|
|
|
strcpy(msg, "disconnect");
|
|
{ ECPGdisconnect(__LINE__, "CURRENT");
|
|
#line 257 "sqlda.pgc"
|
|
|
|
if (sqlca.sqlcode < 0) exit (1);}
|
|
#line 257 "sqlda.pgc"
|
|
|
|
|
|
return (0);
|
|
}
|