Обсуждение: [GENERAL] Executing regex in C code
Hi,
I'm trying to execute the equivalent to '~' with regexp from within C code. According to pg_operator this operator for type text corresponds to textregexeq:
DATA(insert OID = 641 ( "~" PGNSP PGUID b f f 25 25 16 0 642 textregexeq regexeqsel regexeqjoinsel ));
DESCR("matches regular expression, case-sensitive");
I've tried to execute it from the C code:
text * s = cstring_to_text("aa");
text * p = cstring_to_text("a");
return DatumGetBool(DirectFunctionCall2(textregexeq, PointerGetDatum(s), PointerGetDatum(p)));
But I'm getting an error with collate:
I'm trying to execute the equivalent to '~' with regexp from within C code. According to pg_operator this operator for type text corresponds to textregexeq:
DATA(insert OID = 641 ( "~" PGNSP PGUID b f f 25 25 16 0 642 textregexeq regexeqsel regexeqjoinsel ));
DESCR("matches regular expression, case-sensitive");
I've tried to execute it from the C code:
text * s = cstring_to_text("aa");
text * p = cstring_to_text("a");
return DatumGetBool(DirectFunctionCall2(textregexeq, PointerGetDatum(s), PointerGetDatum(p)));
But I'm getting an error with collate:
ERROR: could not determine which collation to use for regular expressionAny hints on how to proceed? Of course if I do select 'aa'~'a'; from psql it works like a charm.
HINT: Use the COLLATE clause to set the collation explicitly.
Thanks in advance.
Gabriel Furstenheim Milerud <furstenheim@gmail.com> writes: > I'm trying to execute the equivalent to '~' with regexp from within C code. > text * s = cstring_to_text("aa"); > text * p = cstring_to_text("a"); > return DatumGetBool(DirectFunctionCall2(textregexeq, PointerGetDatum(s), > PointerGetDatum(p))); > But I'm getting an error with collate: > ERROR: could not determine which collation to use for regular expression > HINT: Use the COLLATE clause to set the collation explicitly. Yes, you need to use DirectFunctionCall2Coll() if you're trying to invoke a collation-aware function. It's probably good enough to pass DEFAULT_COLLATION_OID, although if you're inside a SQL function of your own, passing down whatever collation was passed to you would be a better plan. regards, tom lane
Thanks a lot,
That did the trick
Best regards
On 30 July 2017 at 18:26, Tom Lane <tgl@sss.pgh.pa.us> wrote:
Gabriel Furstenheim Milerud <furstenheim@gmail.com> writes:
> I'm trying to execute the equivalent to '~' with regexp from within C code.
> text * s = cstring_to_text("aa");
> text * p = cstring_to_text("a");
> return DatumGetBool(DirectFunctionCall2( textregexeq, PointerGetDatum(s),
> PointerGetDatum(p)));
> But I'm getting an error with collate:
> ERROR: could not determine which collation to use for regular expression
> HINT: Use the COLLATE clause to set the collation explicitly.
Yes, you need to use DirectFunctionCall2Coll() if you're trying to invoke
a collation-aware function. It's probably good enough to pass
DEFAULT_COLLATION_OID, although if you're inside a SQL function of
your own, passing down whatever collation was passed to you would
be a better plan.
regards, tom lane