Re: [HACKERS] problems with parser - Mailing list pgsql-hackers

From José Soares
Subject Re: [HACKERS] problems with parser
Date
Msg-id 372EF4E8.68901D68@sferacarta.com
Whole thread Raw
In response to problems with parser  (Massimo Dal Zotto <dz@cs.unitn.it>)
List pgsql-hackers
Massimo Dal Zotto ha scritto:

> Hi,
>
> I have some problems with the parser.
>
> 1)      Of the following queries, submitted with libpgtcl, the first two are
>         parsed correctly while the third gives a parse error:
>
>         1.      select 1
>         2.      select 1; select 2;
>         3.      select 1; select 2
>         ERROR:  parser: parse error at or near ""
>
>         It seems that when a query consiste of two or more statements the
>         last one must be terminated by ';'. In my opinion this is not
>         correct because it is not consistent with case 1) and because it
>         breaks many existing programs compatible with previous versions
>         of pgsql where the syntax of point 2) was considered valid.
>
>         The same problem applies also to the body of sql functions, while it
>         doesn't apply to query submitted by psql because they are splitted
>         in separate statements submitted one by one.
>
> 2)      The following query does't work:
>
>         create operator *= (
>                 leftarg=_varchar,
>                 rightarg=varchar,
>                 procedure=array_varchareq);
>         ERROR:  parser: parse error at or near "varchar"
>
>         The query should work because it is consistent with the documented
>         syntax of the create operator:
>
>         Command: create operator
>         Description: create a user-defined operator
>         Syntax:
>                 CREATE OPERATOR operator_name (
>                 [LEFTARG = type1][,RIGHTARG = type2]
>                 ,PROCEDURE = func_name,
>                 [,COMMUTATOR = com_op][,NEGATOR = neg_op]
>                 [,RESTRICT = res_proc][,JOIN = join_proc][,HASHES]
>                 [,SORT1 = left_sort_op][,SORT2 = right_sort_op]);
>
>         and varchar is a valid type name (it is in pg_type).
>         After a litte experimenting it turned out that varchar is also a
>         reserved word and therefore not acceptable as a type name. To have
>         the above statement work you must quote the word "varchar".

Yes but some times the parser understands the keyword varchar without "" as in:

create function "varchar"(float) returns varchar as                       ^^^^^^                      ^^^^^^
'begin       return $1;
end;
' language 'plpgsql';
CREATE

drop table a;
DROP
create table a (a float8);
CREATE
insert into a values (1.2);
INSERT 128074 1

or  in the CAST()...

select cast(a as varchar) from a;
varchar
-------   1.2
(1 row)

select varchar(a) from a;
ERROR:  parser: parse error at or near "a"
select "varchar"(a) from a;
varchar
-------   1.2
(1 row)



>
>         This is somewhat inconsistent with the syntax of create operator
>         and may confuse the user.
>
> 3)      The above query introduces another problem. How can the user know
>         what is wrong in the input. In the example "parse error at or near"
>         is not a very explicative message. If I had read "reserved keyword"
>         instead I would not have spent time trying to figure out what's
>         wrong in my query.
>
>         The parser should be made more verbose and helpful about errors.
>
> 4)      And another related question: if the casual user can be confused
>         by obscure parser messages how can the postgres hacker debug the
>         parser grammar? I tried with gdb but it is completely useless given
>         the way the parser work.
>         Is there any tool or trick to debug the grammar?
>
> --
> Massimo Dal Zotto
>
> +----------------------------------------------------------------------+
> |  Massimo Dal Zotto               email: dz@cs.unitn.it               |
> |  Via Marconi, 141                phone: ++39-0461534251              |
> |  38057 Pergine Valsugana (TN)      www: http://www.cs.unitn.it/~dz/  |
> |  Italy                             pgp: finger dz@tango.cs.unitn.it  |
> +----------------------------------------------------------------------

PostgreSQL 6.5.0 on i586-pc-linux-gnu, compiled by gcc 2.7.2.3
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Jose'




pgsql-hackers by date:

Previous
From: José Soares
Date:
Subject: Re: [HACKERS] XIDTAG ???
Next
From: Thomas Lockhart
Date:
Subject: [Fwd: Bug report.]