@@ -288,48 +288,52 @@ ECPGis_type_an_array(int type,const struct statement * stmt,const struct variabl
288288
289289 if ((stmt -> connection -> cache_head )== NULL )
290290 {
291+ /* Text like types are not an array for ecpg, but postgres counts them as
292+ an array. This define reminds you to not 'correct' these values. */
293+ #define not_an_array_in_ecpg false
294+
291295 /* populate cache with well known types to speed things up */
292- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), BOOLOID , false, stmt -> lineno );
293- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), BYTEAOID , true , stmt -> lineno );
294- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), CHAROID , false, stmt -> lineno );
295- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), NAMEOID , true , stmt -> lineno );
296- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), INT8OID , false, stmt -> lineno );
297- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), INT2OID , false, stmt -> lineno );
298- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), INT2VECTOROID , true, stmt -> lineno );
299- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), INT4OID , false, stmt -> lineno );
300- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), REGPROCOID , false, stmt -> lineno );
301- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), TEXTOID , true , stmt -> lineno );
302- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), OIDOID , false, stmt -> lineno );
303- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), TIDOID , false, stmt -> lineno );
304- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), XIDOID , false, stmt -> lineno );
305- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), CIDOID , false, stmt -> lineno );
306- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), OIDVECTOROID , true, stmt -> lineno );
307- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), POINTOID , true, stmt -> lineno );
308- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), LSEGOID , true, stmt -> lineno );
309- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), PATHOID , true , stmt -> lineno );
310- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), BOXOID , true, stmt -> lineno );
311- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), POLYGONOID , false, stmt -> lineno );
312- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), LINEOID , true, stmt -> lineno );
313- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), FLOAT4OID , false, stmt -> lineno );
314- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), FLOAT8OID , false, stmt -> lineno );
315- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), ABSTIMEOID , false, stmt -> lineno );
316- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), RELTIMEOID , false, stmt -> lineno );
317- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), TINTERVALOID , false, stmt -> lineno );
318- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), UNKNOWNOID , true , stmt -> lineno );
319- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), CIRCLEOID , false, stmt -> lineno );
320- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), CASHOID , false, stmt -> lineno );
321- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), INETOID , false, stmt -> lineno );
322- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), CIDROID , false, stmt -> lineno );
323- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), BPCHAROID , false, stmt -> lineno );
324- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), VARCHAROID , false, stmt -> lineno );
325- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), DATEOID , false, stmt -> lineno );
326- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), TIMEOID , false, stmt -> lineno );
327- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), TIMESTAMPOID , false, stmt -> lineno );
328- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), INTERVALOID , false, stmt -> lineno );
329- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), TIMETZOID , false, stmt -> lineno );
330- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), ZPBITOID , false, stmt -> lineno );
331- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), VARBITOID , false, stmt -> lineno );
332- ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), NUMERICOID , false, stmt -> lineno );
296+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), BOOLOID , false, stmt -> lineno );
297+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), BYTEAOID , not_an_array_in_ecpg , stmt -> lineno );
298+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), CHAROID , false, stmt -> lineno );
299+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), NAMEOID , not_an_array_in_ecpg , stmt -> lineno );
300+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), INT8OID , false, stmt -> lineno );
301+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), INT2OID , false, stmt -> lineno );
302+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), INT2VECTOROID , true, stmt -> lineno );
303+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), INT4OID , false, stmt -> lineno );
304+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), REGPROCOID , false, stmt -> lineno );
305+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), TEXTOID , not_an_array_in_ecpg , stmt -> lineno );
306+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), OIDOID , false, stmt -> lineno );
307+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), TIDOID , false, stmt -> lineno );
308+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), XIDOID , false, stmt -> lineno );
309+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), CIDOID , false, stmt -> lineno );
310+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), OIDVECTOROID , true, stmt -> lineno );
311+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), POINTOID , true, stmt -> lineno );
312+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), LSEGOID , true, stmt -> lineno );
313+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), PATHOID , not_an_array_in_ecpg , stmt -> lineno );
314+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), BOXOID , true, stmt -> lineno );
315+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), POLYGONOID , false, stmt -> lineno );
316+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), LINEOID , true, stmt -> lineno );
317+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), FLOAT4OID , false, stmt -> lineno );
318+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), FLOAT8OID , false, stmt -> lineno );
319+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), ABSTIMEOID , false, stmt -> lineno );
320+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), RELTIMEOID , false, stmt -> lineno );
321+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), TINTERVALOID , false, stmt -> lineno );
322+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), UNKNOWNOID , not_an_array_in_ecpg , stmt -> lineno );
323+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), CIRCLEOID , false, stmt -> lineno );
324+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), CASHOID , false, stmt -> lineno );
325+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), INETOID , false, stmt -> lineno );
326+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), CIDROID , false, stmt -> lineno );
327+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), BPCHAROID , false, stmt -> lineno );
328+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), VARCHAROID , false, stmt -> lineno );
329+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), DATEOID , false, stmt -> lineno );
330+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), TIMEOID , false, stmt -> lineno );
331+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), TIMESTAMPOID , false, stmt -> lineno );
332+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), INTERVALOID , false, stmt -> lineno );
333+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), TIMETZOID , false, stmt -> lineno );
334+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), ZPBITOID , false, stmt -> lineno );
335+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), VARBITOID , false, stmt -> lineno );
336+ ECPGtypeinfocache_push (& (stmt -> connection -> cache_head ), NUMERICOID , false, stmt -> lineno );
333337 }
334338
335339 for (cache_entry = (stmt -> connection -> cache_head );cache_entry != NULL ;cache_entry = cache_entry -> next )
@@ -630,13 +634,27 @@ ECPGexecute(struct statement * stmt)
630634 {
631635 strncpy (mallocedval , "'{" , sizeof ("'{" ));
632636
633- for (element = 0 ; element < var -> arrsize ; element ++ )
634- sprintf (mallocedval + strlen (mallocedval ), "%c," , (((char * ) var -> value )[element ]) ? 't' : 'f' );
637+ if (var -> offset == sizeof (char ))
638+ for (element = 0 ; element < var -> arrsize ; element ++ )
639+ sprintf (mallocedval + strlen (mallocedval ), "%c," , (((char * ) var -> value )[element ]) ? 't' : 'f' );
640+ // this is necessary since sizeof(C++'s bool)==sizeof(int)
641+ else if (var -> offset == sizeof (int ))
642+ for (element = 0 ; element < var -> arrsize ; element ++ )
643+ sprintf (mallocedval + strlen (mallocedval ), "%c," , (((int * ) var -> value )[element ]) ? 't' : 'f' );
644+ else
645+ ECPGraise (stmt -> lineno , ECPG_CONVERT_BOOL , "different size" );
635646
636647 strncpy (mallocedval + strlen (mallocedval ) - 1 , "}'" , sizeof ("}'" ));
637648 }
638649 else
639- sprintf (mallocedval , "'%c'" , (* ((char * ) var -> value )) ? 't' : 'f' );
650+ {
651+ if (var -> offset == sizeof (char ))
652+ sprintf (mallocedval , "'%c'" , (* ((char * ) var -> value )) ? 't' : 'f' );
653+ else if (var -> offset == sizeof (int ))
654+ sprintf (mallocedval , "'%c'" , (* ((int * ) var -> value )) ? 't' : 'f' );
655+ else
656+ ECPGraise (stmt -> lineno , ECPG_CONVERT_BOOL , "different size" );
657+ }
640658
641659 tobeinserted = mallocedval ;
642660 break ;
@@ -1006,7 +1024,7 @@ ECPGdo(int lineno, const char *connection_name, char *query,...)
10061024 *
10071025 * Copyright (c) 2000, Christof Petig <christof.petig@wtal.de>
10081026 *
1009- * $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/execute.c,v 1.16 2001/01/02 22:03:02 momjian Exp $
1027+ * $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/execute.c,v 1.17 2001/01/31 16:12:34 meskes Exp $
10101028 */
10111029
10121030PGconn * ECPG_internal_get_connection (char * name );
0 commit comments