Hi All, I have the following code: 141
if (
0 != iXmlArrDim ) { 142
Datum
*pXmlData
= NULL; 143
bool
*pXmlDataNulls = NULL; 144
uint32_t
iXmlCount
= 0; 145
bool
bFirstTime
= true; 146 147
Assert( XMLOID == ARR_ELEMENTS(
pXmlDataArr ) ); 148 149
deconstruct_array(
pXmlDataArr, 150
XMLOID, 151
-1, 152
false, 153
'i', 154
&pXmlData, 155
&pXmlDataNulls, 156
(int32_t*)&iXmlCount ); 157 158
initStringInfo( &xmlStr ); 159 160
for (
size_t ix =
0; ix < iXmlCount; ++ix ) { 161
xmltype
*pX
= DatumGetXmlP( pXmlData[ix] ); 162
char
*pData = VARDATA( pX ); 163
uint32_t
iData = VARSIZE( pX ) - VARHDRSZ; 164
165
if ( !bFirstTime ) 166
appendStringInfoString( &xmlStr,
", " ); 167
else 168
bFirstTime = false; 169
170
appendStringInfoString( &xmlStr, 171
(const
char*)lzXmlCharStrndup( pData, 172
iData ) ); 173
} 174
175
pfree( pXmlData ); 176
pfree( pXmlDataNulls ); 177
} I am trying to pass an array into a new function I am creating called lzxmlexists via the following statement: wdbs=# SELECT "XT"."ROWKEY" , "XT"."XMLT1C1" FROM "LZQAAS"."T642_XML_T1" "XT" WHERE "ROWKEY"=64201 AND lzxmlexists( ' $XTX//DeptName[ . = $Dn ]',
'DEFAULT', ARRAY["XT"."XMLT1C1"] ) ORDER BY "ROWKEY"; The column XT.XMLT1C1 exists because I can do a simple select to see the contents. The problem is that in the code above I hit the following error at line 161. 160 for ( size_t ix = 0; ix < iXmlCount; ++ix ) { (gdb) 163 xmltype *pX = DatumGetXmlP( pXmlData[ix] ); (gdb) Program received signal SIGSEGV, Segmentation fault. 0x00000000008b3514 in pg_detoast_datum () Obviously, I’ve done something wrong, or I am misunderstanding something. BTW, if I change the array input to something like this
ARRAY[‘something-variable’::xml] it works no problem, but it seems as though getting the input from the column results in garbage that traps. Any suggestion/help would be greatly appreciated. Regards, Garfield |