Обсуждение: fmgr_info: function 0: cache lookup failed

Поиск
Список
Период
Сортировка

fmgr_info: function 0: cache lookup failed

От
"Booth, Robert"
Дата:
I'm porting an Access database to Postgres but keeping Access as the client.
I have been having problems with checkboxes and so I did some searching and
came across information that told me to uncheck Bools as Char in the ODBC
driver settings, I did that and started getting the following error:

ERROR:  Unable to identify an operator '=' for types 'boolean' and 'integer'
    You will have to retype this query using an explicit cast

So after some more searching I came across a message talking about adding
the function and an operator below to handle this problem:

CREATE FUNCTION MsAccessBool (bool, int4) RETURNS BOOL AS '
BEGIN
    IF $1 IS NULL THEN
        RETURN NULL;
    END IF;

    IF $1 IS TRUE THEN
        IF $2 <> 0 THEN
            RETURN TRUE;
        END IF;
    ELSE
        IF $2 = 0 THEN
            RETURN TRUE;
        END IF
    END IF;

    RETURN FALSE;
END ;
' LANGUAGE 'plpgsql';

CREATE OPERATOR = (
    LEFTARG = BOOL,
    RIGHTARG = INT4,
    PROCEDURE = MsAccessBool,
    COMMUTATOR = '=',
    NEGATOR = '<>',
    RESTRICT = EQSEL,
    JOIN = EQJOINSEL);

So I did this, and now I'm getting the "fmgr_info: function 0: cache lookup
failed" message.  I've again done some looking and the only thing I've found
is a message that talks about the oprrest and oprjoin fields in the
pg_operator table, but not what I need to do with them.  Any help would be
greatly appreciated.

Thanks,
Rob


Re: fmgr_info: function 0: cache lookup failed

От
Tom Lane
Дата:
"Booth, Robert" <Robert_Booth@intuit.com> writes:
> CREATE FUNCTION MsAccessBool (bool, int4) RETURNS BOOL AS ...

> CREATE OPERATOR = (
>     LEFTARG = BOOL,
>     RIGHTARG = INT4,
>     PROCEDURE = MsAccessBool,
>     COMMUTATOR = '=',
>     NEGATOR = '<>',
>     RESTRICT = EQSEL,
>     JOIN = EQJOINSEL);

> So I did this, and now I'm getting the "fmgr_info: function 0: cache lookup
> failed" message.

You are telling the system that there will be an int4 = bool operator
(the commutator) as well as a bool <> int4 operator (the negator).
If you are not going to supply same, don't declare that you will.

The error message could be more helpful, perhaps :-(

            regards, tom lane

Re: fmgr_info: function 0: cache lookup failed

От
Juliano Ignacio
Дата:
--- "Booth, Robert" <Robert_Booth@intuit.com> wrote:
> I'm porting an Access database to Postgres but
> keeping Access as the client....
> ...So I did this, and now I'm getting the
"fmgr_info:
> function 0: cache lookup
> failed" message. ...Any help would be
> greatly appreciated.
>
> Thanks,
> Rob

Your problem, as I see, could be fixed following the
instructions bellow:

http://techdocs.postgresql.org/errors.php#plpgsqlinit_fcache


Juliano S. Ignacio
jsignacio@yahoo.com

__________________________________________________
Do You Yahoo!?
Try FREE Yahoo! Mail - the world's greatest free email!
http://mail.yahoo.com/

Re: fmgr_info: function 0: cache lookup failed

От
"Booth, Robert"
Дата:
"Booth, Robert" <Robert_Booth@intuit.com> writes:
>> CREATE FUNCTION MsAccessBool (bool, int4) RETURNS BOOL AS ...

>> CREATE OPERATOR = (
>>     LEFTARG = BOOL,
>>     RIGHTARG = INT4,
>>     PROCEDURE = MsAccessBool,
>>     COMMUTATOR = '=',
>>     NEGATOR = '<>',
>>     RESTRICT = EQSEL,
>>     JOIN = EQJOINSEL);

> So I did this, and now I'm getting the "fmgr_info: function 0: cache
lookup
> failed" message.

> You are telling the system that there will be an int4 = bool operator
> (the commutator) as well as a bool <> int4 operator (the negator).
> If you are not going to supply same, don't declare that you will.

> The error message could be more helpful, perhaps :-(

>            regards, tom lane

So are you telling me that I need to create another OPERATOR?

And if so would this be the correct syntax?

CREATE OPERATOR <> (
    LEFTARG = BOOL,
    RIGHTARG = INT4,
    PROCEDURE = MsAccessBool,
    COMMUTATOR = '=',
    NEGATOR = '<>',
    RESTRICT = EQSEL,
    JOIN = EQJOINSEL);

Rob