DROP FUNCTION IF EXISTS

Started by Teodor Sigaevover 19 years ago12 messages
#1Teodor Sigaev
teodor@sigaev.ru

Linux:

$ echo 'DROP FUNCTION if exists foo(int);' | psql 1c
Timing is on.
SET
Time: 197.941 ms
NOTICE: function foo(О©╫) does not exist ... skipping
ERROR: invalid byte sequence for encoding "UTF8": 0x90
HINT: This error can also happen if the byte sequence does not match the
encoding expected by the server, which is controlled by "client_encoding".
ERROR: invalid byte sequence for encoding "UTF8": 0x90
HINT: This error can also happen if the byte sequence does not match the
encoding expected by the server, which is controlled by "client_encoding".

FreeBSD:
% echo 'DROP FUNCTION if exists foo(int);' | psql wow
SET
NOTICE: function foo(%

Looks like uninitialized pointer...

--
Teodor Sigaev E-mail: teodor@sigaev.ru
WWW: http://www.sigaev.ru/

#2Magnus Hagander
mha@sollentuna.net
In reply to: Teodor Sigaev (#1)
Re: DROP FUNCTION IF EXISTS

Linux:

$ echo 'DROP FUNCTION if exists foo(int);' | psql 1c Timing is on.
SET
Time: 197.941 ms
NOTICE: function foo(░) does not exist ... skipping
ERROR: invalid byte sequence for encoding "UTF8": 0x90
HINT: This error can also happen if the byte sequence does not
match the encoding expected by the server, which is controlled by
"client_encoding".
ERROR: invalid byte sequence for encoding "UTF8": 0x90
HINT: This error can also happen if the byte sequence does not
match the encoding expected by the server, which is controlled by
"client_encoding".

FreeBSD:
% echo 'DROP FUNCTION if exists foo(int);' | psql wow SET
NOTICE: function foo(%

Looks like uninitialized pointer...

Not being an expert, but to me it looks like the client_encoding being set to UTF8 but the data being sent is something other than UTF8. I've seen this happen on Linux when connecting with PuTTY from Windows (and then psql from the linux machine) and having the wrong encoding set in PuTTY. I'd double and triple-check the client-side stuff first ;-)

//Magnus

#3Csaba Nagy
nagy@ecircle-ag.com
In reply to: Magnus Hagander (#2)
Re: DROP FUNCTION IF EXISTS

Not being an expert, but to me it looks like the client_encoding being set to UTF8 but the data being sent is something other than UTF8. I've seen this happen on Linux when connecting with PuTTY from Windows (and then psql from the linux machine) and having the wrong encoding set in PuTTY. I'd double and triple-check the client-side stuff first ;-)

I have seen another strange occurrence of such errors... I'm using linux
with UTF8 client encoding, and psql gives me such errors:

dbval=# select 1;
ERROR: column " 1" does not exist

The full story is that I typed 'ü' (u-umlaut if it won't render
correctly) and backspace before the '1'. I guess the backspace will
delete byte-wise and will so fail to delete properly multi-byte
characters. I have no idea if this is a problem of psql or some other
problem, and it was not annoying enough to report it...

BTW, the space in " 1" is something I was not able to copy-paste from
the psql command line into the mail, so I'm pretty sure it's a byte code
which is invalid UTF8.

Cheers,
Csaba.

#4Markus Schaber
schabi@logix-tt.com
In reply to: Csaba Nagy (#3)
Re: DROP FUNCTION IF EXISTS

Hi, Csaba,

Csaba Nagy wrote:

dbval=# select 1;
ERROR: column " 1" does not exist

The full story is that I typed 'ü' (u-umlaut if it won't render
correctly) and backspace before the '1'. I guess the backspace will
delete byte-wise and will so fail to delete properly multi-byte
characters. I have no idea if this is a problem of psql or some other
problem, and it was not annoying enough to report it...

I think this could be a problem with libreadline / libedit not being
utf8-safe.

HTH,
Markus

--
Markus Schaber | Logical Tracking&Tracing International AG
Dipl. Inf. | Software Development GIS

Fight against software patents in Europe! www.ffii.org
www.nosoftwarepatents.org

#5Teodor Sigaev
teodor@sigaev.ru
In reply to: Magnus Hagander (#2)
Re: DROP FUNCTION IF EXISTS

Not being an expert, but to me it looks like the client_encoding being set to UTF8 but the data being sent is something other than UTF8. I've seen this happen on Linux when connecting with PuTTY from Windows (and then psql from the linux machine) and having the wrong encoding set in PuTTY. I'd double and triple-check the client-side stuff first ;-)

All characters in query are an ANSI. On freebsd encoding of client and server is
a KOI8-R, not an UTF.

--
Teodor Sigaev E-mail: teodor@sigaev.ru
WWW: http://www.sigaev.ru/

#6Teodor Sigaev
teodor@sigaev.ru
In reply to: Magnus Hagander (#2)
Re: DROP FUNCTION IF EXISTS

postgres=# drop type if exists foo;
NOTICE: type "foo" does not exist, skipping
DROP TYPE
postgres=# drop table if exists foo;
NOTICE: table "foo" does not exist, skipping
DROP TABLE
postgres=# drop function if exists foo();
NOTICE: function foo() does not exist ... skipping
DROP FUNCTION
postgres=# drop function if exists foo(int);
NOTICE: function foo(
^^^ here psql is stopped..

--
Teodor Sigaev E-mail: teodor@sigaev.ru
WWW: http://www.sigaev.ru/

#7Andrew Dunstan
andrew@dunslane.net
In reply to: Teodor Sigaev (#6)
Re: DROP FUNCTION IF EXISTS

Teodor Sigaev wrote:

postgres=# drop type if exists foo;
NOTICE: type "foo" does not exist, skipping
DROP TYPE
postgres=# drop table if exists foo;
NOTICE: table "foo" does not exist, skipping
DROP TABLE
postgres=# drop function if exists foo();
NOTICE: function foo() does not exist ... skipping
DROP FUNCTION
postgres=# drop function if exists foo(int);
NOTICE: function foo(
^^^ here psql is stopped..

Yes, this appears to be a bug, not related to encoding etc. Maybe we
should be calling func_signature_string in generating this error.

I will look at it when I get a chance, might be a few days.

cheers

andrew

#8Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andrew Dunstan (#7)
Re: DROP FUNCTION IF EXISTS

Andrew Dunstan <andrew@dunslane.net> writes:

Yes, this appears to be a bug, not related to encoding etc. Maybe we
should be calling func_signature_string in generating this error.

Can't, because you don't have an Oid array for the types.
TypeNameToString is the correct thing --- I'm considering inventing
"TypeNameListToString" in order to make generating the message simple.

regards, tom lane

#9Teodor Sigaev
teodor@sigaev.ru
In reply to: Andrew Dunstan (#7)
Re: DROP FUNCTION IF EXISTS

Found a problem:
ereport(NOTICE,
(errmsg("function %s(%s) does not exist ... skipping",
NameListToString(functionName),
NameListToString(argTypes))));

NameListToString() suppose as an argument List of Value nodes, but
argTypes is a list of TypeName...

Andrew Dunstan wrote:

Teodor Sigaev wrote:

postgres=# drop type if exists foo;
NOTICE: type "foo" does not exist, skipping
DROP TYPE
postgres=# drop table if exists foo;
NOTICE: table "foo" does not exist, skipping
DROP TABLE
postgres=# drop function if exists foo();
NOTICE: function foo() does not exist ... skipping
DROP FUNCTION
postgres=# drop function if exists foo(int);
NOTICE: function foo(
^^^ here psql is stopped..

Yes, this appears to be a bug, not related to encoding etc. Maybe we
should be calling func_signature_string in generating this error.

I will look at it when I get a chance, might be a few days.

cheers

andrew

--
Teodor Sigaev E-mail: teodor@sigaev.ru
WWW: http://www.sigaev.ru/

#10Andrew Dunstan
andrew@dunslane.net
In reply to: Tom Lane (#8)
Re: DROP FUNCTION IF EXISTS

Tom Lane wrote:

Andrew Dunstan <andrew@dunslane.net> writes:

Yes, this appears to be a bug, not related to encoding etc. Maybe we
should be calling func_signature_string in generating this error.

Can't, because you don't have an Oid array for the types.
TypeNameToString is the correct thing --- I'm considering inventing
"TypeNameListToString" in order to make generating the message simple.

Sounds like a plan.

cheers

andrew

#11Benny Amorsen
benny+usenet@amorsen.dk
In reply to: Teodor Sigaev (#1)
Re: DROP FUNCTION IF EXISTS

"CN" == Csaba Nagy <nagy@ecircle-ag.com> writes:

CN> The full story is that I typed 'ü' (u-umlaut if it won't render
CN> correctly) and backspace before the '1'. I guess the backspace
CN> will delete byte-wise and will so fail to delete properly
CN> multi-byte characters.

Backspace deletes character-wise, as long as you have LANG set
correctly. Check LANG and the LC_* environment variables.

/Benny

#12Csaba Nagy
nagy@ecircle-ag.com
In reply to: Benny Amorsen (#11)
Re: [OT]DROP FUNCTION IF EXISTS

Backspace deletes character-wise, as long as you have LANG set
correctly. Check LANG and the LC_* environment variables.

OK, you're right:

$ echo $LANG
de_DE@euro

# show client_encoding ;
client_encoding
-----------------
UTF8
(1 row)

But then I wonder why the client encoding is set to UTF-8 ? I did not
fiddle at all with this AFAIK, and I guess psql is the one setting
this...

OTOH, I'm accessing the DB box via ssh, and my local box has:

cnagy> echo $LANG
en_US.UTF-8

So it might be some strange interaction between my local locale, the
server's locale and ssh...

BTW, I tried if the same problem happens on the server command line (via
ssh), and it does (while, for completeness, it works fine on my local
box):

postgres@dbpos5:~$ date
-sh: date: command not found
^
this here is the result of 'ü + backspace'

So I guess this is not postgres related, and therefore off topic for
this list...

Cheers,
Csaba.