在 PostgreSQL 9.4.1 中,我创建了一个自定义类型my_test_type
,并发现执行基本的 INSERTNULL::my_test_type
会得到预期的结果,但是NULL::my_test_type
作为函数参数并使用完全相同的查询,我得到了意想不到的结果:
CREATE TYPE my_test_type as (part1 text, part2 text);
CREATE TABLE my_test_table (id serial, test_col my_test_type);
CREATE FUNCTION my_test_table_insert (test_arg my_test_type DEFAULT NULL)
RETURNS VOID LANGUAGE plpgsql AS $$
BEGIN
INSERT INTO my_test_table (test_col) VALUES (test_arg);
END; $$;
-- gives null as expected
SELECT NULL::my_test_type;
-- test_col value will be null as expected
INSERT INTO my_test_table (test_col) VALUES (NULL);
-- this performs the exact same query above but in a function,
-- but test_col value shows '(,)', which is NOT expected
SELECT my_test_table_insert(NULL);
-- this is what seems to happening in the function, but I don't understand why
INSERT INTO my_test_table(test_col) VALUES (ROW(NULL, NULL)::my_test_type);
\pset null 'NULL'
SELECT *, (test_col).part1, (test_col).part2, test_col IS NULL AS is_null FROM my_test_table;
┌────┬──────────┬───────┬───────┬─────────┐
│ id │ test_col │ part1 │ part2 │ is_null │
├────┼──────────┼───────┼───────┼─────────┤
│ 1 │ NULL │ NULL │ NULL │ t │
│ 2 │ (,) │ NULL │ NULL │ t │
│ 3 │ (,) │ NULL │ NULL │ t │
└────┴──────────┴───────┴───────┴─────────┘
(3 rows)
即使所有内容都测试为 null,为什么INSERT
函数内部的结果在表中显示不同?
编辑:问题可以简化:
VALUES (NULL::my_test_type), (ROW(NULL, NULL)::my_test_type);
┌─────────┐
│ column1 │
├─────────┤
│ NULL │
│ (,) │
└─────────┘
(2 rows)
来自 PostgreSQL 通用邮件列表的 Merlin Moncure 有一个答案: