Почему синтаксис отличается для составных типов в операторах postgreSQL INSERT и зависит от того, является ли тип данных именованным или неназванным? - PullRequest
1 голос
/ 29 апреля 2020

Если я использую безымянные составные типы в таблицах, я могу использовать следующий синтаксис в INSERT:

create table t1(
    c1  varchar(2) array[2] 
);
CREATE TABLE

create table t2(
    c1  varchar(2)  
);
CREATE TABLE

create table t3(
    c1  int array[2]    
);
CREATE TABLE

insert into t1 values ('{"aa", "bb"}');
INSERT 0 1

insert into t2 values ('aa');
INSERT 0 1

insert into t3 values ('{ 1, 2 }');
INSERT 0 1

Но если я использую типы имен, это не работает:

CREATE TYPE test1 AS (field varchar(2) ARRAY[2]);
CREATE TYPE

CREATE TYPE test2 AS (field varchar(2) );
CREATE TYPE

CREATE TYPE test3 AS (field int ARRAY[2]);
CREATE TYPE

create table tt1(
    c1  test1   
);
CREATE TABLE

create table tt2(
    c1  test2   
);
CREATE TABLE

create table tt3(
    c1  test3   
);

CREATE TABLE

insert into tt1 values ('{"aa", "bb"}');
psql:tt0.sql:37: ERROR:  malformed record literal: "{"aa", "bb"}"
LINE 1: insert into tt1 values ('{"aa", "bb"}');
                                ^
DETAIL:  Missing left parenthesis.


insert into tt2 values ('aa');
psql:tt0.sql:38: ERROR:  malformed record literal: "aa"
LINE 1: insert into tt2 values ('aa');
                                ^
DETAIL:  Missing left parenthesis.

insert into tt3 values ('{ 1, 2 }');
psql:tt0.sql:39: ERROR:  malformed record literal: "{ 1, 2 }"
LINE 1: insert into tt3 values ('{ 1, 2 }');
                                ^
DETAIL:  Missing left parenthesis.

Если я добавить скобки, это все еще не работает:

insert into tt1 values (('{"aa", "bb"}'));
ERROR:  malformed record literal: "{"aa", "bb"}"
LINE 1: insert into tt1 values (('{"aa", "bb"}'));
                                 ^
DETAIL:  Missing left parenthesis.

insert into tt2 values (('aa'));
ERROR:  malformed record literal: "aa"
LINE 1: insert into tt2 values (('aa'));
                                 ^
DETAIL:  Missing left parenthesis.

insert into tt3 values (('{ 1, 2 }'));
ERROR:  malformed record literal: "{ 1, 2 }"
LINE 1: insert into tt3 values (('{ 1, 2 }'));
                                 ^
DETAIL:  Missing left parenthesis.

Если я использую синтаксис ROW и ARRAY, это работает:

insert into tt1(c1) values (ROW(ARRAY ['aa', 'bb' ]));
INSERT 0 1

insert into tt2 values (ROW ('aa'));
INSERT 0 1

insert into tt3 values (ROW(ARRAY[ 1, 2 ]));
INSERT 0 1

Я использовал PostgreSQL 12.2.

1 Ответ

2 голосов
/ 29 апреля 2020

Это работает в первом случае, потому что приведение между вашим вводом и ожидаемым типом данных существует по умолчанию

ex:

select '1'::int;
 int4
------
    1
(1 row)

Это не работает для пользовательского типа, потому что никто не написал приведение.

CREATE TYPE testtype AS (field int);
select '1'::testtype;
ERROR:  malformed record literal: "1"
LINE 1: select '1'::testtype;
               ^
DETAIL:  Missing left parenthesis.

Это работает, если вы создаете row перед выполнением приведения, потому что вы больше не приводите непосредственно к типу, а скорее к каждому лежащему в основе компоненту (который является единственным в этот пример), которые в свою очередь совместимы с пользовательским типом

select row('1')::testtype;
 row
-----
 (1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...