X-Original-To: pgsql-patches-postgresql.org@localhost.postgresql.org Received: from localhost (av.hub.org [200.46.204.144]) by postgresql.org (Postfix) with ESMTP id 825749DC87E for ; Sun, 12 Mar 2006 13:37:39 -0400 (AST) Received: from postgresql.org ([200.46.204.71]) by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) with ESMTP id 55254-04 for ; Sun, 12 Mar 2006 13:37:38 -0400 (AST) X-Greylist: from auto-whitelisted by SQLgrey- Received: from sss.pgh.pa.us (sss.pgh.pa.us [66.207.139.130]) by postgresql.org (Postfix) with ESMTP id 33DBC9DC844 for ; Sun, 12 Mar 2006 13:37:35 -0400 (AST) Received: from sss2.sss.pgh.pa.us (tgl@localhost [127.0.0.1]) by sss.pgh.pa.us (8.13.1/8.13.1) with ESMTP id k2CHbaTB005115 for ; Sun, 12 Mar 2006 12:37:36 -0500 (EST) To: pgsql-patches@postgreSQL.org Subject: Proposed patch for error locations MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0" Content-ID: <5092.1142184831.0@sss.pgh.pa.us> Date: Sun, 12 Mar 2006 12:37:35 -0500 Message-ID: <5114.1142185055@sss.pgh.pa.us> From: Tom Lane X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, score=0.112 required=5 tests=[AWL=0.112] X-Spam-Score: 0.112 X-Spam-Level: X-Archive-Number: 200603/153 X-Sequence-Number: 19157 ------- =_aaaaaaaaaa0 Content-Type: text/plain; charset="us-ascii" Content-ID: <5092.1142184831.1@sss.pgh.pa.us> The attached WIP patch improves the parser so that cursor positions can be attached to many errors reported during parse analysis, such as complaints about nonexistent columns or functions. This is along the lines proposed in my rant here: http://archives.postgresql.org/pgsql-patches/2006-02/msg00234.php to wit, that we make use of bison's "locations" feature to track token positions in the grammar, and add locations to raw parse tree nodes as needed. Some examples of what it can do: regression=# select unique1,unique2,tem,hundred from tenk1 t; ERROR: column "tem" does not exist at character 24 LINE 1: select unique1,unique2,tem,hundred from tenk1 t; ^ regression=# select unique1+unique2,ten+hundred,thousand+stringu1 from tenk1; ERROR: operator does not exist: integer + name at character 44 HINT: No operator matches the given name and argument type(s). You may need to add explicit type casts. LINE 1: select unique1+unique2,ten+hundred,thousand+stringu1 from te... ^ These examples are perhaps not all that exciting, but in a complex SQL statement extending over dozens of lines I think it's really important to be able to do this. I haven't gone further than making it finger the locations of bogus column references, operators, and functions --- it's probably worth improving TypeCast and maybe a few other raw-parse-tree constructs too. Another thing that needs to be looked at is using the mechanism to locate statement boundaries, which was the starting-point of the thread mentioned above. One thing I'm noticing already is that the addition of "at character N" to a lot of these messages isn't an improvement. In psql it's certainly redundant with the error-cursor display. As I recall, we include that string in the primary message text to improve usability with poorer application APIs that might only show the primary error message to the user. I'm thinking maybe it's time to expect those client libraries to do better. Any thoughts about that? Any comments in general? regards, tom lane ------- =_aaaaaaaaaa0 Content-Type: application/octet-stream Content-ID: <5092.1142184831.2@sss.pgh.pa.us> Content-Description: error-position-1.patch.gz Content-Transfer-Encoding: base64 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 AdheHfeqowEA ------- =_aaaaaaaaaa0--