diff options
Diffstat (limited to 'src/interfaces/ecpg/test/sql/dyntest.pgc')
-rw-r--r-- | src/interfaces/ecpg/test/sql/dyntest.pgc | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/src/interfaces/ecpg/test/sql/dyntest.pgc b/src/interfaces/ecpg/test/sql/dyntest.pgc new file mode 100644 index 0000000..0222c89 --- /dev/null +++ b/src/interfaces/ecpg/test/sql/dyntest.pgc @@ -0,0 +1,199 @@ +/* dynamic SQL test program + */ + +#include <stdio.h> +#include <stdlib.h> + +exec sql include sql3types; +exec sql include sqlca; +exec sql include ../regression; + +static void +error (void) +{ + printf ("\n#%ld:%s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); + exit (1); +} + +int +main () +{ + exec sql begin declare section; + int COUNT; + int INTVAR; + int INDEX; + int INDICATOR; + int TYPE, LENGTH, OCTET_LENGTH, PRECISION, SCALE, RETURNED_OCTET_LENGTH; + int DATETIME_INTERVAL_CODE; + char NAME[120], BOOLVAR; + char STRINGVAR[1024]; + double DOUBLEVAR; + char *QUERY; + exec sql end declare section; + int done = 0; + + exec sql var BOOLVAR is bool; + + ECPGdebug (1, stderr); + + QUERY = "select * from dyntest"; + + exec sql whenever sqlerror + do + error (); + + exec sql allocate descriptor MYDESC; + + exec sql connect to REGRESSDB1; + + exec sql set datestyle to german; + + exec sql create table dyntest (name char (14), d float8, i int, + bignumber int8, b boolean, comment text, + day date); + exec sql insert into dyntest values ('first entry', 14.7, 14, 123045607890, true, 'The world''s most advanced open source database.', '1987-07-14'); + exec sql insert into dyntest values ('second entry', 1407.87, 1407, 987065403210, false, 'The elephant never forgets.', '1999-11-5'); + + exec sql prepare MYQUERY from :QUERY; + exec sql declare MYCURS cursor for MYQUERY; + + exec sql open MYCURS; + + while (1) + { + exec sql fetch in MYCURS into sql descriptor MYDESC; + + if (sqlca.sqlcode) + break; + + exec sql get descriptor MYDESC:COUNT = count; + if (!done) + { + printf ("Found %d columns\n", COUNT); + done = 1; + } + + for (INDEX = 1; INDEX <= COUNT; ++INDEX) + { + exec sql get descriptor MYDESC value :INDEX + :TYPE = type, + :LENGTH = length, + :OCTET_LENGTH = octet_length, + :RETURNED_OCTET_LENGTH = returned_octet_length, + :PRECISION = precision, + :SCALE = scale, + :NAME = name, + :INDICATOR = indicator; + printf ("%2d\t%s (type: %d length: %d precision: %d scale: %d = " , INDEX, NAME, TYPE, LENGTH, PRECISION, SCALE); + switch (TYPE) + { + case SQL3_BOOLEAN: + printf ("bool"); + break; + case SQL3_NUMERIC: + printf ("numeric(%d,%d)", PRECISION, SCALE); + break; + case SQL3_DECIMAL: + printf ("decimal(%d,%d)", PRECISION, SCALE); + break; + case SQL3_INTEGER: + printf ("integer"); + break; + case SQL3_SMALLINT: + printf ("smallint"); + break; + case SQL3_FLOAT: + printf ("float(%d,%d)", PRECISION, SCALE); + break; + case SQL3_REAL: + printf ("real"); + break; + case SQL3_DOUBLE_PRECISION: + printf ("double precision"); + break; + case SQL3_DATE_TIME_TIMESTAMP: + exec sql get descriptor MYDESC value :INDEX + :DATETIME_INTERVAL_CODE = datetime_interval_code; + switch (DATETIME_INTERVAL_CODE) + { + case SQL3_DDT_DATE: + printf ("date"); + break; + case SQL3_DDT_TIME: + printf ("time"); + break; + case SQL3_DDT_TIMESTAMP: + printf ("timestamp"); + break; + case SQL3_DDT_TIME_WITH_TIME_ZONE: + printf ("time with time zone"); + break; + case SQL3_DDT_TIMESTAMP_WITH_TIME_ZONE: + printf ("timestamp with time zone"); + break; + } + break; + case SQL3_INTERVAL: + printf ("interval"); + break; + case SQL3_CHARACTER: + if (LENGTH > 0) + printf ("char(%d)", LENGTH); + else + printf ("text"); + break; + case SQL3_CHARACTER_VARYING: + if (LENGTH > 0) + printf ("varchar(%d)", LENGTH); + else + printf ("varchar()"); + break; + default: + printf ("<SQL3 %d>", TYPE); + break; + } + printf (")\n\toctet_length: %d returned_octet_length: %d)\n\t= ", + OCTET_LENGTH, RETURNED_OCTET_LENGTH); + if (INDICATOR == -1) + printf ("NULL\n"); + else + switch (TYPE) + { + case SQL3_BOOLEAN: + exec sql get descriptor MYDESC value :INDEX :BOOLVAR = data; + printf ("%s\n", BOOLVAR ? "true" : "false"); + break; + case SQL3_INTEGER: + case SQL3_SMALLINT: + exec sql get descriptor MYDESC value :INDEX :INTVAR = data; + printf ("%d\n", INTVAR); + break; + case SQL3_DOUBLE_PRECISION: + exec sql get descriptor MYDESC value :INDEX :DOUBLEVAR = data; + printf ("%.*f\n", PRECISION, DOUBLEVAR); + break; + case SQL3_DATE_TIME_TIMESTAMP: + exec sql get descriptor MYDESC value :INDEX + :DATETIME_INTERVAL_CODE = datetime_interval_code, + :STRINGVAR = data; + printf ("%d \"%s\"\n", DATETIME_INTERVAL_CODE, STRINGVAR); + break; + case SQL3_CHARACTER: + case SQL3_CHARACTER_VARYING: + exec sql get descriptor MYDESC value :INDEX :STRINGVAR = data; + printf ("\"%s\"\n", STRINGVAR); + break; + default: + exec sql get descriptor MYDESC value :INDEX :STRINGVAR = data; + printf ("<\"%s\">\n", STRINGVAR); + break; + } + } + } + + exec sql close MYCURS; + + exec sql deallocate descriptor MYDESC; + + return 0; + } |