@ -1295,64 +1295,52 @@ build_tuplestore_recursively(char *key_fld,
int ret ;
int proc ;
int serial_column ;
StringInfo branchstr = NULL ;
StringInfo chk_branchstr = NULL ;
StringInfo chk_current_key = NULL ;
char * * values ;
char * current_key ;
char * current_key_parent ;
char current_level [ INT32_STRLEN ] ;
char serial_str [ INT32_STRLEN ] ;
char * current_branch ;
HeapTuple tuple ;
if ( max_depth > 0 & & level > max_depth )
return tupstore ;
/* start a new branch */
branchstr = makeStringInfo ( ) ;
/* need these to check for recursion */
chk_branchstr = makeStringInfo ( ) ;
chk_current_key = makeStringInfo ( ) ;
/* Build initial sql statement */
if ( ! show_serial )
{
appendStringInfo ( sql , " SELECT %s, %s FROM %s WHERE %s = '%s' AND %s IS NOT NULL " ,
appendStringInfo ( sql , " SELECT %s, %s FROM %s WHERE %s = '%s' AND %s IS NOT NULL AND %s <> %s " ,
key_fld ,
parent_key_fld ,
relname ,
parent_key_fld ,
start_with ,
key_fld ) ;
key_fld , key_fld , parent_key_fld ) ;
serial_column = 0 ;
}
else
{
appendStringInfo ( sql , " SELECT %s, %s FROM %s WHERE %s = '%s' AND %s IS NOT NULL ORDER BY %s " ,
appendStringInfo ( sql , " SELECT %s, %s FROM %s WHERE %s = '%s' AND %s IS NOT NULL AND %s <> %s ORDER BY %s " ,
key_fld ,
parent_key_fld ,
relname ,
parent_key_fld ,
start_with ,
key_fld ,
key_fld , key_fld , parent_key_fld ,
orderby_fld ) ;
serial_column = 1 ;
}
/* Retrieve the desired rows */
ret = SPI_exec ( sql - > data , 0 ) ;
proc = SPI_processed ;
/* Check for qualifying tuples */
if ( ( ret = = SPI_OK_SELECT ) & & ( proc > 0 ) )
{
HeapTuple tuple ;
HeapTuple spi_tuple ;
SPITupleTable * tuptable = SPI_tuptable ;
TupleDesc spi_tupdesc = tuptable - > tupdesc ;
int i ;
char * current_key ;
char * current_key_parent ;
char current_level [ INT32_STRLEN ] ;
char serial_str [ INT32_STRLEN ] ;
char * current_branch ;
char * * values ;
StringInfo branchstr = NULL ;
StringInfo chk_branchstr = NULL ;
StringInfo chk_current_key = NULL ;
/* start a new branch */
branchstr = makeStringInfo ( ) ;
/* need these to check for recursion */
chk_branchstr = makeStringInfo ( ) ;
chk_current_key = makeStringInfo ( ) ;
if ( show_branch )
values = ( char * * ) palloc ( ( CONNECTBY_NCOLS + serial_column ) * sizeof ( char * ) ) ;
else
@ -1361,19 +1349,6 @@ build_tuplestore_recursively(char *key_fld,
/* First time through, do a little setup */
if ( level = = 0 )
{
/*
* Check that return tupdesc is compatible with the one we got
* from the query , but only at level 0 - - no need to check
* more than once
*/
if ( ! compatConnectbyTupleDescs ( tupdesc , spi_tupdesc ) )
ereport ( ERROR ,
( errcode ( ERRCODE_SYNTAX_ERROR ) ,
errmsg ( " invalid return type " ) ,
errdetail ( " Return and SQL tuple descriptions are " \
" incompatible. " ) ) ) ;
/* root value is the one we initially start with */
values [ 0 ] = start_with ;
@ -1414,6 +1389,35 @@ build_tuplestore_recursively(char *key_fld,
level + + ;
}
/* Retrieve the desired rows */
ret = SPI_exec ( sql - > data , 0 ) ;
proc = SPI_processed ;
/* Check for qualifying tuples */
if ( ( ret = = SPI_OK_SELECT ) & & ( proc > 0 ) )
{
HeapTuple spi_tuple ;
SPITupleTable * tuptable = SPI_tuptable ;
TupleDesc spi_tupdesc = tuptable - > tupdesc ;
int i ;
/* First time through, do a little more setup */
if ( level = = 0 )
{
/*
* Check that return tupdesc is compatible with the one we got
* from the query , but only at level 0 - - no need to check
* more than once
*/
if ( ! compatConnectbyTupleDescs ( tupdesc , spi_tupdesc ) )
ereport ( ERROR ,
( errcode ( ERRCODE_SYNTAX_ERROR ) ,
errmsg ( " invalid return type " ) ,
errdetail ( " Return and SQL tuple descriptions are " \
" incompatible. " ) ) ) ;
}
for ( i = 0 ; i < proc ; i + + )
{
/* initialize branch for this pass */