vBulletin Search Engine Optimization
| |||||||
| Register | FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
| ||||
| > Another possibility is to disallow SET here, but not in other places > where ColId is used. That is, some hack like: Quick point: If all you want to do if disallow SET here as ColID but allow SET in other places with a ColId, you don't have to change anything at all. Just make sure the rule for the want you prefer is earlier in the file. Shift/reduce and reduce/reduce errors still produce valid working parsers, it's just that bison has to resolve an ambiguity by the default (shift, otherwise earliest rule wins. maximum munch rule really). If you don't like relying on file order to resolve this, appropriate use of %prec would have the same effect (just like for operator precedence). The output file tell you which way bison went. Have a nice day, -- Martijn van Oosterhout <kleptog@svana.org> http://svana.org/kleptog/ > Patent. n. Genius is 5% inspiration and 95% perspiration. A patent is a > tool for doing 5% of the work and then sitting around waiting for someone > else to do the other 95% so you can sue them. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.1 (GNU/Linux) iD8DBQFD0103IB7bNG8LQkwRAj7aAJ0ZMjNrDeyn1AbIi/0gVaxTxSwDDQCgkV/Q GA74BY42qBmRqK1jANroFqQ= =m7PJ -----END PGP SIGNATURE----- |
| |||
| Martijn van Oosterhout wrote: >Shift/reduce and reduce/reduce errors still produce valid working >parsers, it's just that bison has to resolve an ambiguity by the >default (shift, otherwise earliest rule wins. maximum munch rule >really). > >If you don't like relying on file order to resolve this, appropriate >use of %prec would have the same effect (just like for operator >precedence). The output file tell you which way bison went. > > > > If we allow shift/reduce or reduce/reduce conflicts, debugging future development becomes more difficult. Right now we have the nice property that if you see one of those you know you've done something wrong (and using the expect directive isn't really a good answer, and only applies to shift/reduce conflicts anyway). cheers andrew ---------------------------(end of broadcast)--------------------------- TIP 3: Have you checked our extensive FAQ? http://www.postgresql.org/docs/faq |
| |||
| On Sun, Jan 22, 2006 at 09:04:14AM -0500, Andrew Dunstan wrote: > >If you don't like relying on file order to resolve this, appropriate > >use of %prec would have the same effect (just like for operator > >precedence). The output file tell you which way bison went. > If we allow shift/reduce or reduce/reduce conflicts, debugging future > development becomes more difficult. Right now we have the nice property > that if you see one of those you know you've done something wrong (and > using the expect directive isn't really a good answer, and only applies > to shift/reduce conflicts anyway). But that's the point of the %prec directive. To force bison to choose one or the other, thus removing the warning... For an ambiguity that only appears in one statement, it seems a better solution than upgrade SET to a new class of identifier. Have a nice day, -- Martijn van Oosterhout <kleptog@svana.org> http://svana.org/kleptog/ > Patent. n. Genius is 5% inspiration and 95% perspiration. A patent is a > tool for doing 5% of the work and then sitting around waiting for someone > else to do the other 95% so you can sue them. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.1 (GNU/Linux) iD8DBQFD0592IB7bNG8LQkwRAoUwAJ92H/ogUG3wlGhuVJz6ZzpyoQ2ulACfQp5q Fa1RN5RnDkgVJB9jK4oMWss= =5YAj -----END PGP SIGNATURE----- |
| |||
| Martijn van Oosterhout wrote: >On Sun, Jan 22, 2006 at 09:04:14AM -0500, Andrew Dunstan wrote: > > >>>If you don't like relying on file order to resolve this, appropriate >>>use of %prec would have the same effect (just like for operator >>>precedence). The output file tell you which way bison went. >>> >>> > > > >>If we allow shift/reduce or reduce/reduce conflicts, debugging future >>development becomes more difficult. Right now we have the nice property >>that if you see one of those you know you've done something wrong (and >>using the expect directive isn't really a good answer, and only applies >>to shift/reduce conflicts anyway). >> >> > >But that's the point of the %prec directive. To force bison to choose >one or the other, thus removing the warning... For an ambiguity that >only appears in one statement, it seems a better solution than upgrade >SET to a new class of identifier. > > > Quite so. We already use %prec extensively. All I was pointing out was that using file order isn't an acceptable option. Presumably the effect in this case would be to prevent anyone from using SET as an alias unless there was a preceding AS. cheers andrew ---------------------------(end of broadcast)--------------------------- TIP 9: In versions below 8.0, the planner will ignore your desire to choose an index scan if your joining column's datatypes do not match |
| |||
| Andrew Dunstan <andrew@dunslane.net> writes: > Presumably the effect in this case would be to prevent anyone from using > SET as an alias unless there was a preceding AS. I fooled around with this and found three feasible alternatives. The simplest thing is: relation_expr_opt_alias: relation_expr | relation_expr IDENT | relation_expr AS ColId which at least gets us to the point of being able to use anything you normally can use as an alias in other contexts, so long as you write AS. Given the large and ever-increasing list of unreserved_keywords, though, I don't think this is sufficient. Then there's the precedence way. This seems to work: 431a432 > %nonassoc SET 5883c5884 < relation_expr_opt_alias: relation_expr --- > relation_expr_opt_alias: relation_expr %prec UMINUS 5887c5888,5895 < | relation_expr opt_as IDENT --- > | relation_expr ColId > { > Alias *alias = makeNode(Alias); > alias->aliasname = $2; > $1->alias = alias; > $$ = $1; > } > | relation_expr AS ColId The effect of this, as Andrew says, is that in this particular context you can't write SET as an alias unless you write AS first. This is probably not going to surprise anyone in the UPDATE case, since the ambiguity inherent in writing UPDATE foo set SET ... is pretty obvious. However it might surprise someone in the DELETE context. Another thing that worries me is that assigning a precedence to the SET keyword might someday bite us by masking some other grammatical ambiguity. (As far as I can tell by comparing y.output files, it's not changing the behavior of any other part of the grammar today, but ...) The third alternative is to stop allowing SET as an unreserved_keyword. I found that moving it up to func_name_keyword was enough to get rid of the conflict, without using precedence. This is somewhat attractive on the grounds of future-proofing (we may have to make SET more reserved someday anyway for something else); and you can argue that the principle of least astonishment demands that SET should be either always OK as an alias or always not OK. On the other hand this would raise some backwards-compatibility issues. Is it likely that anyone out there is using SET as a table or column name? I could live with either choice #2 or choice #3. Comments? regards, tom lane ---------------------------(end of broadcast)--------------------------- TIP 6: explain analyze is your friend |
| |||
| Tom Lane wrote: >The effect of this, as Andrew says, is that in this particular context >you can't write SET as an alias unless you write AS first. This is >probably not going to surprise anyone in the UPDATE case, since the >ambiguity inherent in writing > UPDATE foo set SET ... >is pretty obvious. However it might surprise someone in the DELETE >context. > > You probably avoid that if you have a separate rule for the DELETE case. That raises this question: how far do we want to go in unfactoring the grammar to handle such cases? cheers andrew ---------------------------(end of broadcast)--------------------------- TIP 6: explain analyze is your friend |
| |||
| On Sun, 2006-01-22 at 13:26 -0500, Tom Lane wrote: > The effect of this, as Andrew says, is that in this particular context > you can't write SET as an alias unless you write AS first. Did you actually test this? neilc=# create table t1 (a int, b int); CREATE TABLE neilc=# update t1 set set a = 500 where set.a > 1000; UPDATE 0 (Using essentially the patch you posted.) > This is > probably not going to surprise anyone in the UPDATE case, since the > ambiguity inherent in writing > UPDATE foo set SET ... > is pretty obvious. However it might surprise someone in the DELETE > context. Well, if necessary we can just use an alternate production for the DELETE case, as there is no SET ambiguity to worry about. > The third alternative is to stop allowing SET as an unreserved_keyword. > I found that moving it up to func_name_keyword was enough to get rid > of the conflict, without using precedence. I think we should avoid this if possible: it seems quite likely to me that there are applications using SET as the name of a type, table or column (making SET a func_name_keyword would disallow its use as a type name, AFAICS). So I'm inclined to favor #2. -Neil ---------------------------(end of broadcast)--------------------------- TIP 9: In versions below 8.0, the planner will ignore your desire to choose an index scan if your joining column's datatypes do not match |
| |||
| Neil Conway <neilc@samurai.com> writes: > Did you actually test this? No, I was just looking at the y.output file to see what would happen. > neilc=# update t1 set set a = 500 where set.a > 1000; > UPDATE 0 > (Using essentially the patch you posted.) [ scratches head... ] That shouldn't have worked. I'll have to look again. > Well, if necessary we can just use an alternate production for the > DELETE case, as there is no SET ambiguity to worry about. Yeah, I thought of that too and rejected it as being too much trouble for too small a case. I'm really considerably more worried about the question of whether attaching a precedence to SET might cause trouble later. But it's only a hypothetical problem at this point. > So I'm inclined to favor #2. OK, motion carries. I'll check what's happening in the case above and commit if there's not something wrong. regards, tom lane ---------------------------(end of broadcast)--------------------------- TIP 2: Don't 'kill -9' the postmaster |
| ||||
| Neil Conway <neilc@samurai.com> writes: > Did you actually test this? > neilc=# create table t1 (a int, b int); > CREATE TABLE > neilc=# update t1 set set a = 500 where set.a > 1000; > UPDATE 0 I get regression=# update t1 set set a = 500 where set.a > 1000; ERROR: syntax error at or near "a" at character 19 LINE 1: update t1 set set a = 500 where set.a > 1000; ^ I think possibly you put the %nonassoc entry in the wrong place --- it has to go someplace before the UMINUS entry to get the desired effect. My fault for putting up a non-context diff. regards, tom lane ---------------------------(end of broadcast)--------------------------- TIP 6: explain analyze is your friend |