Delimited identifier brhavior
Hi,
I' wondering if following delimited identifier brhavior is correct or
not:
test=# create table t1(i int);
create table t1(i int);
CREATE TABLE
test=# create table t1_foo(i int, j int);
create table t1_foo(i int, j int);
CREATE TABLE
test=# select * from t1;
select * from t1;
i
---
(0 rows)
test=# select * from t1_foo;
select * from t1_foo;
i | j
---+---
(0 rows)
test=# select * from "t1"_foo;
select * from "t1"_foo;
i
---
(0 rows)
It seems PostgreSQL thinks "t1"_foo is equivalent to t1. Is this an
expected behavior?
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese: http://www.sraoss.co.jp
Tatsuo Ishii <ishii@postgresql.org> wrote:
It seems PostgreSQL thinks "t1"_foo is equivalent to t1.
It thinks you've given "t1" an alias of "_foo" in that query, same
as if you'd had a space between "t1" and _foo.
-Kevin
Tatsuo Ishii wrote:
test=# select * from "t1"_foo;
select * from "t1"_foo;
i
---
(0 rows)It seems PostgreSQL thinks "t1"_foo is equivalent to t1. Is this an
expected behavior?
That code looks badly written in any event. Delimiters should be put around
each part of an identifier or chain as a whole, such as:
select * from "t1_foo";
Or with schema-delimited objects, for example, any of these:
schema.table
"schema".table
schema."table"
"schema"."table"
Personally, I treat all of my identifiers as being case-sensitive. Knowing that
Pg treats non-delimited identifiers as being lowercase, I write undelimited when
the identifier is entirely lowercase, and I delimit ones that have any
uppercase. And by doing this consistently everything works correctly. Since
most of my identifiers are lowercase anyway, the code also reads cleanly in general.
-- Darren Duncan
On 11/11/2010 06:03 PM, Tatsuo Ishii wrote:
Hi,
I' wondering if following delimited identifier brhavior is correct or
not:test=# create table t1(i int);
create table t1(i int);
CREATE TABLE
test=# create table t1_foo(i int, j int);
create table t1_foo(i int, j int);
CREATE TABLE
test=# select * from t1;
select * from t1;
i
---
(0 rows)test=# select * from t1_foo;
select * from t1_foo;
i | j
---+---
(0 rows)test=# select * from "t1"_foo;
select * from "t1"_foo;
i
---
(0 rows)It seems PostgreSQL thinks "t1"_foo is equivalent to t1. Is this an
expected behavior?
It's treating _foo as an alias in the query for t1. So the behaviour is
quite correct, I think.
cheers
andrew
It seems PostgreSQL thinks "t1"_foo is equivalent to t1.
It thinks you've given "t1" an alias of "_foo" in that query, same
as if you'd had a space between "t1" and _foo.
Oh, ok. I thought we always need at least one space character between
the table name and the alias.
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese: http://www.sraoss.co.jp