diff options
| author | Tom Lane | 2013-12-15 01:23:26 +0000 |
|---|---|---|
| committer | Tom Lane | 2013-12-15 01:23:26 +0000 |
| commit | 1b4f7f93b4693858cb983af3cd557f6097dab67b (patch) | |
| tree | 2caa02d898221a2c2c6036284a8973f873f72e33 /src/test | |
| parent | c03ad5602f529787968fa3201b35c119bbc6d782 (diff) | |
Allow empty target list in SELECT.
This fixes a problem noted as a followup to bug #8648: if a query has a
semantically-empty target list, e.g. SELECT * FROM zero_column_table,
ruleutils.c will dump it as a syntactically-empty target list, which was
not allowed. There doesn't seem to be any reliable way to fix this by
hacking ruleutils (note in particular that the originally zero-column table
might since have had columns added to it); and even if we had such a fix,
it would do nothing for existing dump files that might contain bad syntax.
The best bet seems to be to relax the syntactic restriction.
Also, add parse-analysis errors for SELECT DISTINCT with no columns (after
*-expansion) and RETURNING with no columns. These cases previously
produced unexpected behavior because the parsed Query looked like it had
no DISTINCT or RETURNING clause, respectively. If anyone ever offers
a plausible use-case for this, we could work a bit harder on making the
situation distinguishable.
Arguably this is a bug fix that should be back-patched, but I'm worried
that there may be client apps or PLs that expect "SELECT ;" to throw a
syntax error. The issue doesn't seem important enough to risk changing
behavior in minor releases.
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/regress/expected/errors.out | 23 | ||||
| -rw-r--r-- | src/test/regress/sql/errors.sql | 15 |
2 files changed, 14 insertions, 24 deletions
diff --git a/src/test/regress/expected/errors.out b/src/test/regress/expected/errors.out index 40615129778..5f8868da26e 100644 --- a/src/test/regress/expected/errors.out +++ b/src/test/regress/expected/errors.out @@ -15,26 +15,24 @@ select 1; -- -- -- SELECT --- missing relation name +-- this used to be a syntax error, but now we allow an empty target list select; -ERROR: syntax error at or near ";" -LINE 1: select; - ^ +-- +(1 row) + -- no such relation select * from nonesuch; ERROR: relation "nonesuch" does not exist LINE 1: select * from nonesuch; ^ --- missing target list -select from pg_database; -ERROR: syntax error at or near "from" -LINE 1: select from pg_database; - ^ -- bad name in target list select nonesuch from pg_database; ERROR: column "nonesuch" does not exist LINE 1: select nonesuch from pg_database; ^ +-- empty distinct list isn't OK +select distinct from pg_database; +ERROR: SELECT DISTINCT must have at least one column -- bad attribute name on lhs of operator select * from pg_database where nonesuch = pg_database.datname; ERROR: column "nonesuch" does not exist @@ -45,12 +43,7 @@ select * from pg_database where pg_database.datname = nonesuch; ERROR: column "nonesuch" does not exist LINE 1: ...ect * from pg_database where pg_database.datname = nonesuch; ^ --- bad select distinct on syntax, distinct attribute missing -select distinct on (foobar) from pg_database; -ERROR: syntax error at or near "from" -LINE 1: select distinct on (foobar) from pg_database; - ^ --- bad select distinct on syntax, distinct attribute not in target list +-- bad attribute name in select distinct on select distinct on (foobar) * from pg_database; ERROR: column "foobar" does not exist LINE 1: select distinct on (foobar) * from pg_database; diff --git a/src/test/regress/sql/errors.sql b/src/test/regress/sql/errors.sql index 2ee707c5c75..cd370b4781e 100644 --- a/src/test/regress/sql/errors.sql +++ b/src/test/regress/sql/errors.sql @@ -16,28 +16,25 @@ select 1; -- -- SELECT --- missing relation name +-- this used to be a syntax error, but now we allow an empty target list select; -- no such relation select * from nonesuch; --- missing target list -select from pg_database; -- bad name in target list select nonesuch from pg_database; + +-- empty distinct list isn't OK +select distinct from pg_database; + -- bad attribute name on lhs of operator select * from pg_database where nonesuch = pg_database.datname; -- bad attribute name on rhs of operator select * from pg_database where pg_database.datname = nonesuch; - --- bad select distinct on syntax, distinct attribute missing -select distinct on (foobar) from pg_database; - - --- bad select distinct on syntax, distinct attribute not in target list +-- bad attribute name in select distinct on select distinct on (foobar) * from pg_database; |
