Как postgresql определяет значения параметров связывания и их тип? - PullRequest
0 голосов
/ 13 апреля 2020

Я создал таблицу и выполнил запрос, как показано в следующем фрагменте. И в таблице есть разные столбцы с разными типами, включая отметку времени, реальную, bigint, массив и т. Д. c

Вопрос

  1. Когда я выполняю запрос, который я передал аргументы связывания для bigint, двойной точности как строки в предложении where. Как sql сравнивает / преобразует эти строки в реальные типы при извлечении данных?
  2. Могу ли я с уверенностью предположить, что передача аргументов строки в качестве значений связывания в условии where независимо от типа столбца даст правильные результаты?
CREATE TABLE common
(
    time timestamp(3) without time zone DEFAULT now(),
    duration_millis bigint,
    customer_name text, 
    active_customers integer, 
    inactive_customers bigint,
    paid_accounts_rating double precision,
    customer_rating real,
    attr_bool boolean,
    attr_bytes bytea,
    attr_array text[] COLLATE pg_catalog."default"
);


SELECT * FROM common WHERE (customer_name = 'test' and active_customers>='32' and inactive_customers >= '22') OR
    (customer_name = 'test2' and active_customers>='32' and inactive_customers = '22' and paid_accounts_rating < '0.6456') ;

1 Ответ

1 голос
/ 13 апреля 2020

Простой тестовый пример показывает, что PostgreSQL хранит подготовленные операторы с информацией о типах параметров и выполняет преобразование параметров во время выполнения:

create table t (x int, y text);
CREATE TABLE
insert into t values(32, 'abc');
INSERT 0 1
prepare s1 as select * from t where x=$1;
PREPARE
select name, statement, parameter_types from pg_prepared_statements;
 name |                 statement                 | parameter_types 
------+-------------------------------------------+-----------------
 s1   | prepare s1 as select * from t where x=$1; | {integer}
(1 row)

execute s1(32);
 x  |  y  
----+-----
 32 | abc
(1 row)

execute s1('32');
 x  |  y  
----+-----
 32 | abc
(1 row)

Это должно быть где-то задокументировано, но я не нашел это.

...