Обсуждение: Bug in gram.y?
It appears to me that there is a bug in gram.y. From looking at the code (while working on ecpg) it seems that it doesn't accept a createdb with th eoption: with location = ... but without the option with encoding = ... Michael -- Dr. Michael Meskes meskes@online-club.de, meskes@debian.org Go SF49ers! Go Rhein Fire! Use Debian GNU/Linux!
> It appears to me that there is a bug in gram.y. From looking at the code
> (while working on ecpg) it seems that it doesn't accept a createdb with th
> eoption: with location = ... but without the option with encoding = ...
Looks fine to me:
opt_database1: LOCATION '=' location { $$ = $3; }
| /*EMPTY*/ { $$ = NULL; }
;
opt_database2: ENCODING '=' encoding { $$ = $3; }
| /*EMPTY*/ { $$ = NULL; }
;
--
Bruce Momjian | 830 Blythe Avenue
maillist@candle.pha.pa.us | Drexel Hill, Pennsylvania 19026
+ If your life is a hard drive, | (610) 353-9879(w)
+ Christ can be your backup. | (610) 853-3000(h)
> > it seems that it doesn't accept a createdb with the
> > option location = ... but without the option encoding = ...
I think the code is sub-optimal for a couple of reasons:
1) LOCATION must be the first argument, ENCODING must be the second. The
number and order of any options should be flexible.
2) the options should have a comma delimiter between them. Currently
they do not. To introduce the comma delimiter will require restructuring
that part of the parsing, but isn't a big deal.
I'm pretty sure that the options can be specified individually, but it
does not generalize well. The two specific problems above should be
considered fatal for a final version :/
I've worked through problems like this for other SQL92 syntax, and can
probably fix up this one too. Will put it on my list unless someone else
wants it...
- Tom
>> > it seems that it doesn't accept a createdb with the >> > option location = ... but without the option encoding = ... > >I think the code is sub-optimal for a couple of reasons: > >1) LOCATION must be the first argument, ENCODING must be the second. The >number and order of any options should be flexible. > >2) the options should have a comma delimiter between them. Currently >they do not. To introduce the comma delimiter will require restructuring >that part of the parsing, but isn't a big deal. > >I'm pretty sure that the options can be specified individually, but it >does not generalize well. The two specific problems above should be >considered fatal for a final version :/ > >I've worked through problems like this for other SQL92 syntax, and can >probably fix up this one too. Will put it on my list unless someone else >wants it... I'm responsible for that problem. But seems you have a better solution. Please take it. -- Tatsuo Ishii t-ishii@sra.co.jp
On Mon, Aug 03, 1998 at 02:19:44PM -0400, Bruce Momjian wrote:
> Looks fine to me:
>
> opt_database1: LOCATION '=' location { $$ = $3; }
> | /*EMPTY*/ { $$ = NULL; }
> ;
>
> opt_database2: ENCODING '=' encoding { $$ = $3; }
> | /*EMPTY*/ { $$ = NULL; }
> ;
Yes, but check the code under CreatedbStmt:
n->dbpath = $5;
#ifdef MULTIBYTE
if ($6 != NULL) {
n->encoding = pg_char_to_encoding($6);
if (n->encoding < 0) {
elog(ERROR, "invalid encoding name %s", $6);
}
} else {
n->encoding = GetTemplateEncoding();
}
#else
elog(ERROR, "WITH ENCODING is not supported");
#endif
$$ = (Node *)n;
If you have undefined MULTIBYTE you will get the WITH ENCODING error message
despite the command being legal even without this option.
Michael
--
Dr. Michael Meskes meskes@online-club.de, meskes@debian.org
Go SF49ers! Go Rhein Fire! Use Debian GNU/Linux!
> On Mon, Aug 03, 1998 at 02:19:44PM -0400, Bruce Momjian wrote:
> > Looks fine to me:
> >
> > opt_database1: LOCATION '=' location { $$ = $3; }
> > | /*EMPTY*/ { $$ = NULL; }
> > ;
> >
> > opt_database2: ENCODING '=' encoding { $$ = $3; }
> > | /*EMPTY*/ { $$ = NULL; }
> > ;
>
> Yes, but check the code under CreatedbStmt:
>
> n->dbpath = $5;
> #ifdef MULTIBYTE
> if ($6 != NULL) {
> n->encoding = pg_char_to_encoding($6);
> if (n->encoding < 0) {
> elog(ERROR, "invalid encoding name %s", $6);
> }
> } else {
> n->encoding = GetTemplateEncoding();
> }
> #else
> elog(ERROR, "WITH ENCODING is not supported");
> #endif
> $$ = (Node *)n;
>
>
> If you have undefined MULTIBYTE you will get the WITH ENCODING error message
> despite the command being legal even without this option.
Good point. I have changed it to:
> } else {
> n->encoding = GetTemplateEncoding();
> }
> #else
> if ($6 != NULL)
^^^^^^^^^^^^^^^
> elog(ERROR, "WITH ENCODING is not supported");
> #endif
> $$ = (Node *)n;
--
Bruce Momjian | 830 Blythe Avenue
maillist@candle.pha.pa.us | Drexel Hill, Pennsylvania 19026
+ If your life is a hard drive, | (610) 353-9879(w)
+ Christ can be your backup. | (610) 853-3000(h)