pg.ddx.io  pgsql-interfaces@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Michael Fuhr <mike@fuhr.org>
To: Michele Bendazzoli <mickymouse@mickymouse.it>
Cc: pgsql <pgsql-interfaces@postgresql.org>
Subject: Re: plpythonu strange syntax error
Date: Fri, 18 Feb 2005 10:40:07 -0700
Message-ID: <20050218174007.GA66076@winnie.fuhr.org> (raw)
In-Reply-To: <1108727087.4676.28.camel@mickymouse.i.mickymouse.it>
References: <1108719498.4676.14.camel@mickymouse.i.mickymouse.it>
	<20050218095623.GA54765@winnie.fuhr.org>
	<1108725960.4676.18.camel@mickymouse.i.mickymouse.it>
	<1108727087.4676.28.camel@mickymouse.i.mickymouse.it>

On Fri, Feb 18, 2005 at 12:44:47PM +0100, Michele Bendazzoli wrote:
> > > Does the string that contains the Python code have carriage returns?
> > > Python is picky about that; there was a thread about it recently.
> > > 
> > > http://archives.postgresql.org/pgsql-general/2005-01/msg00792.php
> 
> I read the thread but they seem to have miss the point: there is not a
> platform issue here because postgresql, pgadmin and python are both
> running on the same machine (a windows 2003 server)! 

PEP 278 (http://www.python.org/peps/pep-0278.txt) says this:

  There is no support for universal newlines in strings passed
  to eval() or exec.  It is envisioned that such strings always
  have the standard \n line feed, if the strings come from a file
  that file can be read with universal newlines.

If I'm interpreting that correctly, then regardless of platform, a
string containing code to be executed must end its lines with LF
(\n), not CRLF (\r\n).  When running an ordinary Python script, a
CRLF => LF translation presumably happens as the script is read,
before the code is executed.  You might not be getting that translation
when using pgAdmin.  As I recall from the thread, there was also
concern about restoring a function that had been dumped with pg_dump.

Have you checked whether the plpythonu code contains carriage
returns?  I forget if there's an easier way, but you could do
this:

SELECT replace(prosrc, '\r', 'CR')
FROM pg_proc
WHERE proname = 'foo';

I just created a plpythonu function with a carriage return and the
above command shows this:

     replace      
------------------
 x = 1CR
return x
(1 row)

Trying to run the function fails:

SELECT foo();
ERROR:  plpython: could not compile function "foo"
DETAIL:  exceptions.SyntaxError: invalid syntax (line 2)

If I strip the carriage return from the function's prosrc column
then it works:

UPDATE pg_proc SET prosrc = replace(prosrc, '\r', '')
WHERE proname = 'foo';

SELECT foo();
 foo 
-----
   1
(1 row)

You might try that to see if it works (be careful modifying system
tables -- I'd suggest using a transaction so you can ROLLBACK if
the update affected too many rows).

-- 
Michael Fuhr
http://www.fuhr.org/~mfuhr/



view thread (9+ messages)  latest in thread

Message-ID: <20050218174007.GA66076@winnie.fuhr.org>
Permalink:  ../20050218174007.GA66076@winnie.fuhr.org/
Also on:    postgresql.org/message-id/20050218174007.GA66076@winnie.fuhr.org

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-interfaces@postgresql.org
  Cc: mike@fuhr.org, mickymouse@mickymouse.it
  Subject: Re: plpythonu strange syntax error
  In-Reply-To: <20050218174007.GA66076@winnie.fuhr.org>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox