Thread: RE: [HACKERS] parser enhancement request for 6.5
I would like for you to also consider adding the following to gram.y for version 6.5: | NULL_P '=' a_expr { $$ = makeA_Expr(ISNULL, NULL, $3, NULL); } I know there was some discussion about this earlier including comments against this. Access 97 is now generating the following statement and error: SQLDriverConnect(out)='DSN=PostgreSQL;DATABASE=mp;SERVER=192.168.97.2;PORT=5 432;UID=kari;PWD=;READONLY=0;PROTOCOL=6.4;FAKEOIDINDEX=0;SHOWOIDCOLUMN=0;ROW VERSIONING=0;SHOWSYSTEMTABLES=0;CONNSETTINGS=' conn=154616224, query='SELECT "RentalOrders"."rentalorderlinesid" FROM "rentalorderlines" "RentalOrders" WHERE ( NULL = "rentalorderid" ) ' ERROR from backend during send_query: 'ERROR: parser: parse error at or near "="' The above code changed allows Access 97 to work correctly. I would be happy to consider any other possible alternatives. Thanks, Michael -----Original Message-----From: Bruce Momjian [SMTP:maillist@candle.pha.pa.us]Sent: Saturday, March 13, 1999 10:14PMTo: Michael DavisCc: hackers@postgreSQL.orgSubject: Re: [HACKERS] parser enhancement request for 6.5 Applied. [Charset iso-8859-1 unsupported, filtering to ASCII...]> I have a problem with Access97 not working properly when entering new> records using a sub form, i.e. entering a new order/orderlines or master and> detail tables. The problem is caused by a SQL statement that Access97 makes> involving NULL. The syntax that fails is "column_name" = NULL. The> following attachment was provided by -Jose'-. It contains a very small> enhancement to gram.y that will allow Access97 to work properly with sub> forms. Can this enhancement be added to release 6.5?> > <<gram.patch>> > Thanks, Michael> [Attachment, skipping...] -- Bruce Momjian | http://www.op.net/~candle maillist@candle.pha.pa.us | (610) 853-3000 + If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill,Pennsylvania 19026
> I would like for you to also consider adding the following to gram.y > for version 6.5: I had the same problem (patch not complete, working on more complete changes, screwed up now that I've got to resolve changes) for this set of patches as I did for the int8 stuff. Your suggested feature should have been in the original patch, and I have patches on my machine which would have done it correctly. btw, there is a fundamental shift/reduce conflict trying for "where NULL = value", though "where value = NULL" seems to be OK. This is *such* a kludge! Thanks to M$... Wonder what else I'll find as I wade through 1000 e-mails? :/ - Tom
Hello! I tried to create a simple function, to "variable value validate" :) Here: text *default_text(text* input) {char *ret;char def[20];if (input) ret=input;strcpy((def+4),"Default");(*((int4*)def)) =strlen(def+4)+4;ret=def;elog(NOTICE,"Here:%i", (int4)(*def)) } This retunrs with the text "Default", if input value IS NULL, and the with original value if not. So try it with postgres: tron=> create table test (v text); tron=> insert into test values(NULL); tron=> insert into test values('1'); CREATE INSERT INSERT tron=> select default_text(v) from test; NOTICE: Here: 11 NOTICE: Here: 5 ?column? -------- 1 I don't seek this in the source, but i think, all function, who take a NULL value as parameter can't return with a NOT NULL value. But why? Ooops... And can i check about an int4 if IS NULL ? ?? --// NeKo@KorNeL.szif.hu // http://lsc.kva.hu/ //
> I don't seek this in the source, but i think, all function, who take a > NULL value as parameter can't return with a NOT NULL value. > But why? Postgres assumes that a NULL input will give a NULL output, and never calls your routine at all. Since NULL means "don't know", there is a strong argument that this is correct behavior. > And can i check about an int4 if IS NULL ? Not as cleanly as the pass-by-reference data types. I vaguely recall that the input and output routines can look for a second or third argument, one of which is a NULL indicator. But that mechanism is not generally usable in other contexts afaik. - Tom
Thus spake Thomas Lockhart > > I don't seek this in the source, but i think, all function, who take a > > NULL value as parameter can't return with a NOT NULL value. > > But why? > > Postgres assumes that a NULL input will give a NULL output, and never > calls your routine at all. Since NULL means "don't know", there is a Actually, the problem is that it does call the function. After it returns it throws away the result and so the effect is that the function never gets called but in the meantime, the function has to deal with NULL inputs for nothing. This has been hanging around since the last release. I looked at the dispatch code but it wasn't very clear where we have to put the test to do this correctly. Maybe we can get it cleaned up before release this time. > strong argument that this is correct behavior. I agree but recently I said that there was no stored procedures in PostgreSQL and someone corrected me pointing out that functions with no return were in effect stored procedures. Do the same arguments apply? If a procedure is passed a NULL argument, should the side effects be bypassed? -- D'Arcy J.M. Cain <darcy@{druid|vex}.net> | Democracy is three wolves http://www.druid.net/darcy/ | and a sheep voting on +1 416 424 2871 (DoD#0082) (eNTP) | what's for dinner.
On Mon, 29 Mar 1999, Thomas Lockhart wrote: > Postgres assumes that a NULL input will give a NULL output, But why? That is not true in all case, i mean so like: "FALSE && dont'know" is always FALSE. > and never calls your routine at all. But! I see the output of elogs in function. I don't sure about 6.5, i test it not for a long time. The 6.4.x calls my functions always (with one or more NULL parameters). Then if the return value has "pass-by-reference" type, can i give a NULL or a NOT NULL value. I don't now realy, but i think it's posible to give NULL indicator with int4, bool, etc like type results. I mean this feature is necessary... Not? ;) Any opinion? So thans for all. --NeKo@(kva.hu|Kornel.szif.hu) the servant of Crashhu:http://lsc.kva.hu en:-- (sorry, my english is...)
> > Postgres assumes that a NULL input will give a NULL output, > But why? That is not true in all case, i mean so like: "FALSE && > dont'know" is always FALSE. Your example shows a flaw in the Postgres premise on this topic, perhaps. > > and never calls your routine at all. > But! I see the output of elogs in function. > The 6.4.x calls my > functions always (with one or more NULL parameters). It's been discussed before, and as you and others note it seems the behavior has changed so that functions are called even with NULL input. But the job wasn't finished since the results are ignored. - Tom
Added to 6.5 beta. > I would like for you to also consider adding the following to gram.y for > version 6.5: > > | NULL_P '=' a_expr > { $$ = makeA_Expr(ISNULL, NULL, $3, > NULL); } > > I know there was some discussion about this earlier including comments > against this. Access 97 is now generating the following statement and > error: > > SQLDriverConnect(out)='DSN=PostgreSQL;DATABASE=mp;SERVER=192.168.97.2;PORT=5 > 432;UID=kari;PWD=;READONLY=0;PROTOCOL=6.4;FAKEOIDINDEX=0;SHOWOIDCOLUMN=0;ROW > VERSIONING=0;SHOWSYSTEMTABLES=0;CONNSETTINGS=' > conn=154616224, > query='SELECT "RentalOrders"."rentalorderlinesid" FROM "rentalorderlines" > "RentalOrders" WHERE ( NULL = "rentalorderid" ) ' > ERROR from backend during send_query: 'ERROR: parser: parse error at or > near "="' > > > The above code changed allows Access 97 to work correctly. I would be happy > to consider any other possible alternatives. > > Thanks, Michael > > > -----Original Message----- > From: Bruce Momjian [SMTP:maillist@candle.pha.pa.us] > Sent: Saturday, March 13, 1999 10:14 PM > To: Michael Davis > Cc: hackers@postgreSQL.org > Subject: Re: [HACKERS] parser enhancement request for 6.5 > > Applied. > > > [Charset iso-8859-1 unsupported, filtering to ASCII...] > > I have a problem with Access97 not working properly when entering > new > > records using a sub form, i.e. entering a new order/orderlines or > master and > > detail tables. The problem is caused by a SQL statement that > Access97 makes > > involving NULL. The syntax that fails is "column_name" = NULL. > The > > following attachment was provided by -Jose'-. It contains a very > small > > enhancement to gram.y that will allow Access97 to work properly > with sub > > forms. Can this enhancement be added to release 6.5? > > > > <<gram.patch>> > > Thanks, Michael > > > > [Attachment, skipping...] > > > -- > Bruce Momjian | http://www.op.net/~candle > maillist@candle.pha.pa.us | (610) 853-3000 > + If your life is a hard drive, | 830 Blythe Avenue > + Christ can be your backup. | Drexel Hill, Pennsylvania > 19026 > -- Bruce Momjian | http://www.op.net/~candle maillist@candle.pha.pa.us | (610) 853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania19026
> > I would like for you to also consider adding the following to gram.y for > > version 6.5: > > | NULL_P '=' a_expr > > { $$ = makeA_Expr(ISNULL, NULL, $3, NULL); } > > I know there was some discussion about this earlier including comments > > against this. Access 97 is now generating the following statement and > > error... I'm not certain that this patch should survive. There are at least two other places in the parser which should be modified for symmetry (the "b_expr" and the default expressions) and I recall that these lead to more shift/reduce conflicts. Remember that shift/reduce conflicts indicate that some portion of the parser logic can *never* be reached, which means that some feature (perhaps the new one, or perhaps an existing one) is disabled. There is currently a single shift/reduce conflict in gram.y, and I'm suprised to find that it is *not* due to the "NULL_P '=' a_expr" line. I'm planning on touching gram.y to hunt down the shift/reduce conflict (from previous work I think it in Stefan's "parens around selects" mods), and I'll look at the NULL_P issue again also. I'll reiterate something which everyone probably knows: "where NULL = expr" is *not* standard SQL92, and any company selling products which implement this rather than the standard "where expr is NULL" should make your "don't buy" list, rather than your "only buy" list, which is what they are trying to force you to do :( - Tom -- Thomas Lockhart lockhart@alumni.caltech.edu South Pasadena, California
Thomas Lockhart wrote: > There is currently a single shift/reduce conflict in gram.y, and I'm > suprised to find that it is *not* due to the "NULL_P '=' a_expr" line. > I'm planning on touching gram.y to hunt down the shift/reduce conflict > (from previous work I think it in Stefan's "parens around selects" > mods), and I'll look at the NULL_P issue again also. No - not the parens. Looking at the y.output (produced with -v) I see that the conflict is at state 266 when in the SelectStmt the FOR keyword of FOR UPDATE has been seen. The SelectStmt is also used in CursorStmt. The rule cursor_clause in CursorStmt results in an elog(ERROR) telling that cursors for update are not supported. But in fact a DECLARE x1 CURSOR FOR SELECT * FROM x FOR UPDATE OF x; doesn't throw an error. So it is the CursorStmt's cursor_clause that is currently unreachable in the parser. Instead the SelectStmt's for_update_clause has already eaten up the FOR UPDATE. Jan -- #======================================================================# # It's easier to get forgiveness for being wrong than for being right. # # Let's break this rule - forgive me. # #======================================== jwieck@debis.com (Jan Wieck) #