Обсуждение: Delimited identifier brhavior

Поиск
Список
Период
Сортировка

Delimited identifier brhavior

От
Tatsuo Ishii
Дата:
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


Re: Delimited identifier brhavior

От
"Kevin Grittner"
Дата:
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


Re: Delimited identifier brhavior

От
Darren Duncan
Дата:
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


Re: Delimited identifier brhavior

От
Andrew Dunstan
Дата:

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


Re: Delimited identifier brhavior

От
Tatsuo Ishii
Дата:
>> 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