Re: Casting - Mailing list pgsql-general

From Tom Lane
Subject Re: Casting
Date
Msg-id 815.1049942992@sss.pgh.pa.us
Whole thread Raw
In response to Casting  ("Nigel J. Andrews" <nandrews@investsystems.co.uk>)
Responses Re: Casting  ("Nigel J. Andrews" <nandrews@investsystems.co.uk>)
List pgsql-general
"Nigel J. Andrews" <nandrews@investsystems.co.uk> writes:
> mydb=> select cast('truE'::text as boolean);
> WARNING:  Error occurred while executing PL/pgSQL function text_to_bool
> WARNING:  line 4 at select into variables
> ERROR:  CopyQuerySnapshot: no snapshot has been set

I've applied the attached patch to fix this.

            regards, tom lane

*** REL7_3/src/backend/parser/parse_coerce.c.orig    Thu Oct 24 18:09:00 2002
--- REL7_3/src/backend/parser/parse_coerce.c    Wed Apr  9 22:47:57 2003
***************
*** 226,251 ****
                  result = (Node *) makeRelabelType(result, targetTypeId, -1,
                                                    cformat);
              }
-
-             /*
-              * If the input is a constant, apply the type conversion
-              * function now instead of delaying to runtime.  (We could, of
-              * course, just leave this to be done during
-              * planning/optimization; but it's a very frequent special
-              * case, and we save cycles in the rewriter if we fold the
-              * expression now.)
-              *
-              * Note that no folding will occur if the conversion function is
-              * not marked 'immutable'.
-              *
-              * HACK: if constant is NULL, don't fold it here.  This is needed
-              * by make_subplan(), which calls this routine on placeholder
-              * Const nodes that mustn't be collapsed.  (It'd be a lot
-              * cleaner to make a separate node type for that purpose...)
-              */
-             if (IsA(node, Const) &&
-                 !((Const *) node)->constisnull)
-                 result = eval_const_expressions(result);
          }
          else
          {
--- 226,231 ----
***************
*** 496,502 ****
      {
          List       *args;
          Const       *cons;
-         Node       *fcall;

          /* Pass given value, plus target typmod as an int4 constant */
          cons = makeConst(INT4OID,
--- 476,481 ----
***************
*** 523,541 ****
              args = lappend(args, cons);
          }

!         fcall = build_func_call(funcId, targetTypeId, args, cformat);
!
!         /*
!          * If the input is a constant, apply the length coercion
!          * function now instead of delaying to runtime.
!          *
!          * See the comments for the similar case in coerce_type.
!          */
!         if (node && IsA(node, Const) &&
!             !((Const *) node)->constisnull)
!             node = eval_const_expressions(fcall);
!         else
!             node = fcall;
      }

      return node;
--- 502,508 ----
              args = lappend(args, cons);
          }

!         node = build_func_call(funcId, targetTypeId, args, cformat);
      }

      return node;


pgsql-general by date:

Previous
From: Juraj Fedel
Date:
Subject: Database Dezign for begginers
Next
From: Paul Ramsey
Date:
Subject: OS/X and PL/PGSQL