On Mon, Apr 8, 2013 at 11:44 AM, Rodrigo Barboza <rodrigombu...@gmail.com>wrote:
> > > > On Mon, Apr 8, 2013 at 11:27 AM, Rodrigo Barboza > <rodrigombu...@gmail.com>wrote: > >> >> >> On Mon, Apr 8, 2013 at 11:25 AM, Tom Lane <t...@sss.pgh.pa.us> wrote: >> >>> Rodrigo Barboza <rodrigombu...@gmail.com> writes: >>> > UPDATE tm32 SET a = a + 1 WHERE a > $i; >>> > ERROR: unsupported type: 202886 >>> >>> I'm betting that's coming from scalargtsel, which doesn't know anything >>> about your type, but you've nominated it to be the selectivity function >>> for ">" anyway. >>> >>> /* >>> * Can't get here unless someone tries to use >>> scalarltsel/scalargtsel on >>> * an operator with one numeric and one non-numeric operand. >>> */ >>> elog(ERROR, "unsupported type: %u", typid); >>> >>> regards, tom lane >>> >> >> >> Yes, I found it in the code, but I followed the example from the postgres >> documentation that uses this function. >> And why does it work sometimes? Why not other times? >> >> > > Here is a very simple case and weird behavior. I select * from a table and > returns 4 entries. > But when I run with a filter the error raises and crazy values are printed > from the params. > > Here is my funcitons where I compare the values: > > typedef uint32_t TmUInt32; > > static int > tmuint32_int32_abs_cmp_internal(TmUInt32 a, int32_t b) > { > int ret; > elog(NOTICE, "funcao:%s linha:%d\n", *_FUNCTION_*, *_LINE_*); > if (a < b) ret = -1; > else if (a > b) ret = 1; > else ret = 0; > elog(NOTICE, "funcao:%s linha:%d, ret: %d a: %u\n", *_FUNCTION_*, *_LINE_*, > ret, a); > return ret; > } > > PG_FUNCTION_INFO_V1(tmuint32_int32_abs_gt); > > Datum > tmuint32_int32_abs_gt(PG_FUNCTION_ARGS) > { > TmUInt32 *param1; > int32_t param2; > elog(NOTICE, "funcao:%s linha:%d\n", *_FUNCTION_*, *_LINE_*); > > if(PG_ARGISNULL(0) || PG_ARGISNULL(1)) PG_RETURN_NULL(); > > param1 = (TmUInt32 *) PG_GETARG_POINTER(0); > param2 = DatumGetInt32(PG_GETARG_DATUM(1)); > > elog(NOTICE, "funcao:%s linha:%d param1: %u, param2: %d\n", *_FUNCTION_*, > *_LINE_*, *param1, param2); > PG_RETURN_BOOL(tmuint32_int32_abs_cmp_internal(*param1, param2) > 0); > } > > > And here is the simple test. > > -- SIMPLE QUERY > select * from a; > > NOTICE: funcao:tmuint32_out linha:191 > > NOTICE: funcao:tmuint32_out linha:191 > > NOTICE: funcao:tmuint32_out linha:191 > > NOTICE: funcao:tmuint32_out linha:191 > > a > --- > 0 > 1 > 2 > 3 > (4 rows) > > > _________________________________________________________________ > > -- QUERY WHITH FILTER > select * from a where a > 1; > > NOTICE: funcao:tmuint32_int32_abs_gt linha:1296 > > NOTICE: funcao:tmuint32_int32_abs_gt linha:1303 param1: 0, param2: 1 > > NOTICE: funcao:tmuint32_int32_abs_cmp_internal linha:742 > > NOTICE: funcao:tmuint32_int32_abs_cmp_internal linha:746, ret: -1 a: 0 > > NOTICE: funcao:tmuint32_int32_abs_gt linha:1296 > > NOTICE: funcao:tmuint32_int32_abs_gt linha:1303 param1: 99, param2: 1 > > NOTICE: funcao:tmuint32_int32_abs_cmp_internal linha:742 > > NOTICE: funcao:tmuint32_int32_abs_cmp_internal linha:746, ret: 1 a: 99 > > NOTICE: funcao:tmuint32_int32_abs_gt linha:1296 > > NOTICE: funcao:tmuint32_int32_abs_gt linha:1303 param1: 50, param2: 1 > > NOTICE: funcao:tmuint32_int32_abs_cmp_internal linha:742 > > NOTICE: funcao:tmuint32_int32_abs_cmp_internal linha:746, ret: 1 a: 50 > > NOTICE: funcao:tmuint32_int32_abs_gt linha:1296 > > NOTICE: funcao:tmuint32_int32_abs_gt linha:1303 param1: 24, param2: 1 > > NOTICE: funcao:tmuint32_int32_abs_cmp_internal linha:742 > > NOTICE: funcao:tmuint32_int32_abs_cmp_internal linha:746, ret: 1 a: 24 > > NOTICE: funcao:tmuint32_int32_abs_gt linha:1296 > > NOTICE: funcao:tmuint32_int32_abs_gt linha:1303 param1: 12, param2: 1 > > NOTICE: funcao:tmuint32_int32_abs_cmp_internal linha:742 > > NOTICE: funcao:tmuint32_int32_abs_cmp_internal linha:746, ret: 1 a: 12 > > NOTICE: funcao:tmuint32_int32_abs_gt linha:1296 > > NOTICE: funcao:tmuint32_int32_abs_gt linha:1303 param1: 6, param2: 1 > > NOTICE: funcao:tmuint32_int32_abs_cmp_internal linha:742 > > NOTICE: funcao:tmuint32_int32_abs_cmp_internal linha:746, ret: 1 a: 6 > > NOTICE: funcao:tmuint32_int32_abs_gt linha:1296 > > NOTICE: funcao:tmuint32_int32_abs_gt linha:1303 param1: 2, param2: 1 > > NOTICE: funcao:tmuint32_int32_abs_cmp_internal linha:742 > > NOTICE: funcao:tmuint32_int32_abs_cmp_internal linha:746, ret: 1 a: 2 > > NOTICE: funcao:tmuint32_int32_abs_gt linha:1296 > > NOTICE: funcao:tmuint32_int32_abs_gt linha:1303 param1: 1, param2: 1 > > NOTICE: funcao:tmuint32_int32_abs_cmp_internal linha:742 > > NOTICE: funcao:tmuint32_int32_abs_cmp_internal linha:746, ret: 0 a: 1 > > ERROR: unsupported type: 220200 > > I found that the problem is in the highlithed line. I'm getting the wrong value from param1. But why this behavior? PG_FUNCTION_INFO_V1(tmuint32_int32_abs_gt); Datum tmuint32_int32_abs_gt(PG_FUNCTION_ARGS) { TmUInt32 *param1; int32_t param2; elog(NOTICE, "funcao:%s linha:%d\n", *_FUNCTION_*, *_LINE_*); if(PG_ARGISNULL(0) || PG_ARGISNULL(1)) PG_RETURN_NULL(); param1 = (TmUInt32 *) PG_GETARG_POINTER(0); param2 = DatumGetInt32(PG_GETARG_DATUM(1)); elog(NOTICE, "funcao:%s linha:%d param1: %u, param2: %d\n", *_FUNCTION_*, * _LINE_*, *param1, param2); PG_RETURN_BOOL(tmuint32_int32_abs_cmp_internal(*param1, param2) > 0); }