mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Make char(n) and varchar(n) types raise an error if the inserted string is
too long. While I was adjusting the regression tests I moved the array things all into array.sql, to make things more manageable.
This commit is contained in:
@ -1,6 +1,32 @@
|
||||
--
|
||||
-- ARRAYS
|
||||
--
|
||||
CREATE TABLE arrtest (
|
||||
a int2[],
|
||||
b int4[][][],
|
||||
c name[],
|
||||
d text[][],
|
||||
e float8[],
|
||||
f char(5)[],
|
||||
g varchar(5)[]
|
||||
);
|
||||
--
|
||||
-- only this array as a 0-based 'e', the others are 1-based.
|
||||
-- 'e' is also a large object.
|
||||
--
|
||||
INSERT INTO arrtest (a[5], b[2][1][2], c, d, f, g)
|
||||
VALUES ('{1,2,3,4,5}', '{{{},{1,2}}}', '{}', '{}', '{}', '{}');
|
||||
UPDATE arrtest SET e[0] = '1.1';
|
||||
UPDATE arrtest SET e[1] = '2.2';
|
||||
INSERT INTO arrtest (f)
|
||||
VALUES ('{"too long"}');
|
||||
ERROR: value too long for type character(5)
|
||||
INSERT INTO arrtest (a, b[2][2][1], c, d, e, f, g)
|
||||
VALUES ('{11,12,23}', '{{3,4},{4,5}}', '{"foobar"}',
|
||||
'{{"elt1", "elt2"}}', '{"3.4", "6.7"}',
|
||||
'{"abc","abcde"}', '{"abc","abcde"}');
|
||||
INSERT INTO arrtest (a, b[1][2][2], c, d[2][1])
|
||||
VALUES ('{}', '{3,4}', '{foo,bar}', '{bar,foo}');
|
||||
SELECT * FROM arrtest;
|
||||
a | b | c | d | e | f | g
|
||||
-------------+-----------------+---------------+-------------------+---------------+-------------------+-----------------
|
||||
@ -75,8 +101,8 @@ SELECT a,b,c FROM arrtest;
|
||||
a | b | c
|
||||
---------------+-----------------------+-----------------------
|
||||
{16,25,3,4,5} | {{{113,142},{1,147}}} | {}
|
||||
{16,25,23} | {{3,4},{4,5}} | {"foobar","new_word"}
|
||||
{} | {3,4} | {"foo","new_word"}
|
||||
{16,25,23} | {{3,4},{4,5}} | {"foobar","new_word"}
|
||||
(3 rows)
|
||||
|
||||
SELECT a[1:3],
|
||||
@ -87,7 +113,7 @@ SELECT a[1:3],
|
||||
a | b | c | d
|
||||
------------+-----------------------+-----------------------+------------
|
||||
{16,25,3} | {{{113,142},{1,147}}} | |
|
||||
{16,25,23} | | {"foobar","new_word"} | {{"elt2"}}
|
||||
| | {"foo","new_word"} |
|
||||
{16,25,23} | | {"foobar","new_word"} | {{"elt2"}}
|
||||
(3 rows)
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
--
|
||||
-- CHAR
|
||||
-- all inputs are SILENTLY truncated at 1 character
|
||||
--
|
||||
-- fixed-length by value
|
||||
-- internally passed by value if <= 4 bytes in storage
|
||||
@ -24,6 +23,8 @@ INSERT INTO CHAR_TBL (f1) VALUES ('3');
|
||||
INSERT INTO CHAR_TBL (f1) VALUES ('');
|
||||
-- try char's of greater than 1 length
|
||||
INSERT INTO CHAR_TBL (f1) VALUES ('cd');
|
||||
ERROR: value too long for type character(1)
|
||||
INSERT INTO CHAR_TBL (f1) VALUES ('c ');
|
||||
SELECT '' AS seven, CHAR_TBL.*;
|
||||
seven | f1
|
||||
-------+----
|
||||
@ -108,6 +109,8 @@ INSERT INTO CHAR_TBL (f1) VALUES ('a');
|
||||
INSERT INTO CHAR_TBL (f1) VALUES ('ab');
|
||||
INSERT INTO CHAR_TBL (f1) VALUES ('abcd');
|
||||
INSERT INTO CHAR_TBL (f1) VALUES ('abcde');
|
||||
ERROR: value too long for type character(4)
|
||||
INSERT INTO CHAR_TBL (f1) VALUES ('abcd ');
|
||||
SELECT '' AS four, CHAR_TBL.*;
|
||||
four | f1
|
||||
------+------
|
||||
|
@ -121,23 +121,6 @@ INSERT INTO f_star (class, f)
|
||||
VALUES ('f', '(11111111,33333333),(22222222,44444444)'::polygon);
|
||||
INSERT INTO f_star (class) VALUES ('f');
|
||||
--
|
||||
-- ARRAYS
|
||||
--
|
||||
--
|
||||
-- only this array as a 0-based 'e', the others are 1-based.
|
||||
-- 'e' is also a large object.
|
||||
--
|
||||
INSERT INTO arrtest (a[5], b[2][1][2], c, d, f, g)
|
||||
VALUES ('{1,2,3,4,5}', '{{{},{1,2}}}', '{}', '{}', '{}', '{}');
|
||||
UPDATE arrtest SET e[0] = '1.1';
|
||||
UPDATE arrtest SET e[1] = '2.2';
|
||||
INSERT INTO arrtest (a, b[2][2][1], c, d, e, f, g)
|
||||
VALUES ('{11,12,23}', '{{3,4},{4,5}}', '{"foobar"}',
|
||||
'{{"elt1", "elt2"}}', '{"3.4", "6.7"}',
|
||||
'{"abc","abcdefgh"}', '{"abc","abcdefgh"}');
|
||||
INSERT INTO arrtest (a, b[1][2][2], c, d[2][1])
|
||||
VALUES ('{}', '{3,4}', '{foo,bar}', '{bar,foo}');
|
||||
--
|
||||
-- for internal portal (cursor) tests
|
||||
--
|
||||
CREATE TABLE iportaltest (
|
||||
|
@ -147,15 +147,6 @@ CREATE TABLE aggtest (
|
||||
a int2,
|
||||
b float4
|
||||
);
|
||||
CREATE TABLE arrtest (
|
||||
a int2[],
|
||||
b int4[][][],
|
||||
c name[],
|
||||
d text[][],
|
||||
e float8[],
|
||||
f char(5)[],
|
||||
g varchar(5)[]
|
||||
);
|
||||
CREATE TABLE hash_i4_heap (
|
||||
seqno int4,
|
||||
random int4
|
||||
|
@ -45,11 +45,13 @@ SELECT CAST(name 'namefield' AS text) AS "text(name)";
|
||||
namefield
|
||||
(1 row)
|
||||
|
||||
SELECT CAST(f1 AS char(10)) AS "char(text)" FROM TEXT_TBL;
|
||||
char(text)
|
||||
------------
|
||||
doh!
|
||||
hi de ho n
|
||||
SELECT CAST(f1 AS char(10)) AS "char(text)" FROM TEXT_TBL; -- fail
|
||||
ERROR: value too long for type character(10)
|
||||
SELECT CAST(f1 AS char(20)) AS "char(text)" FROM TEXT_TBL;
|
||||
char(text)
|
||||
----------------------
|
||||
doh!
|
||||
hi de ho neighbor
|
||||
(2 rows)
|
||||
|
||||
SELECT CAST(f1 AS char(10)) AS "char(varchar)" FROM VARCHAR_TBL;
|
||||
@ -479,10 +481,10 @@ SELECT text 'text' || ' and unknown' AS "Concat text to unknown type";
|
||||
text and unknown
|
||||
(1 row)
|
||||
|
||||
SELECT text 'text' || char(10) ' and characters' AS "Concat text to char";
|
||||
SELECT text 'text' || char(20) ' and characters' AS "Concat text to char";
|
||||
Concat text to char
|
||||
---------------------
|
||||
text and chara
|
||||
text and characters
|
||||
(1 row)
|
||||
|
||||
SELECT text 'text' || varchar ' and varchar' AS "Concat text to varchar";
|
||||
|
@ -12,6 +12,8 @@ INSERT INTO VARCHAR_TBL (f1) VALUES ('3');
|
||||
INSERT INTO VARCHAR_TBL (f1) VALUES ('');
|
||||
-- try varchar's of greater than 1 length
|
||||
INSERT INTO VARCHAR_TBL (f1) VALUES ('cd');
|
||||
ERROR: value too long for type character varying(1)
|
||||
INSERT INTO VARCHAR_TBL (f1) VALUES ('c ');
|
||||
SELECT '' AS seven, VARCHAR_TBL.*;
|
||||
seven | f1
|
||||
-------+----
|
||||
@ -96,6 +98,8 @@ INSERT INTO VARCHAR_TBL (f1) VALUES ('a');
|
||||
INSERT INTO VARCHAR_TBL (f1) VALUES ('ab');
|
||||
INSERT INTO VARCHAR_TBL (f1) VALUES ('abcd');
|
||||
INSERT INTO VARCHAR_TBL (f1) VALUES ('abcde');
|
||||
ERROR: value too long for type character varying(4)
|
||||
INSERT INTO VARCHAR_TBL (f1) VALUES ('abcd ');
|
||||
SELECT '' AS four, VARCHAR_TBL.*;
|
||||
four | f1
|
||||
------+------
|
||||
|
@ -2,6 +2,40 @@
|
||||
-- ARRAYS
|
||||
--
|
||||
|
||||
CREATE TABLE arrtest (
|
||||
a int2[],
|
||||
b int4[][][],
|
||||
c name[],
|
||||
d text[][],
|
||||
e float8[],
|
||||
f char(5)[],
|
||||
g varchar(5)[]
|
||||
);
|
||||
|
||||
--
|
||||
-- only this array as a 0-based 'e', the others are 1-based.
|
||||
-- 'e' is also a large object.
|
||||
--
|
||||
|
||||
INSERT INTO arrtest (a[5], b[2][1][2], c, d, f, g)
|
||||
VALUES ('{1,2,3,4,5}', '{{{},{1,2}}}', '{}', '{}', '{}', '{}');
|
||||
|
||||
UPDATE arrtest SET e[0] = '1.1';
|
||||
|
||||
UPDATE arrtest SET e[1] = '2.2';
|
||||
|
||||
INSERT INTO arrtest (f)
|
||||
VALUES ('{"too long"}');
|
||||
|
||||
INSERT INTO arrtest (a, b[2][2][1], c, d, e, f, g)
|
||||
VALUES ('{11,12,23}', '{{3,4},{4,5}}', '{"foobar"}',
|
||||
'{{"elt1", "elt2"}}', '{"3.4", "6.7"}',
|
||||
'{"abc","abcde"}', '{"abc","abcde"}');
|
||||
|
||||
INSERT INTO arrtest (a, b[1][2][2], c, d[2][1])
|
||||
VALUES ('{}', '{3,4}', '{foo,bar}', '{bar,foo}');
|
||||
|
||||
|
||||
SELECT * FROM arrtest;
|
||||
|
||||
SELECT arrtest.a[1],
|
||||
|
@ -1,6 +1,5 @@
|
||||
--
|
||||
-- CHAR
|
||||
-- all inputs are SILENTLY truncated at 1 character
|
||||
--
|
||||
|
||||
-- fixed-length by value
|
||||
@ -30,6 +29,7 @@ INSERT INTO CHAR_TBL (f1) VALUES ('');
|
||||
|
||||
-- try char's of greater than 1 length
|
||||
INSERT INTO CHAR_TBL (f1) VALUES ('cd');
|
||||
INSERT INTO CHAR_TBL (f1) VALUES ('c ');
|
||||
|
||||
|
||||
SELECT '' AS seven, CHAR_TBL.*;
|
||||
@ -70,6 +70,6 @@ INSERT INTO CHAR_TBL (f1) VALUES ('a');
|
||||
INSERT INTO CHAR_TBL (f1) VALUES ('ab');
|
||||
INSERT INTO CHAR_TBL (f1) VALUES ('abcd');
|
||||
INSERT INTO CHAR_TBL (f1) VALUES ('abcde');
|
||||
INSERT INTO CHAR_TBL (f1) VALUES ('abcd ');
|
||||
|
||||
SELECT '' AS four, CHAR_TBL.*;
|
||||
|
||||
|
@ -188,30 +188,6 @@ INSERT INTO f_star (class, f)
|
||||
|
||||
INSERT INTO f_star (class) VALUES ('f');
|
||||
|
||||
--
|
||||
-- ARRAYS
|
||||
--
|
||||
|
||||
--
|
||||
-- only this array as a 0-based 'e', the others are 1-based.
|
||||
-- 'e' is also a large object.
|
||||
--
|
||||
|
||||
INSERT INTO arrtest (a[5], b[2][1][2], c, d, f, g)
|
||||
VALUES ('{1,2,3,4,5}', '{{{},{1,2}}}', '{}', '{}', '{}', '{}');
|
||||
|
||||
UPDATE arrtest SET e[0] = '1.1';
|
||||
|
||||
UPDATE arrtest SET e[1] = '2.2';
|
||||
|
||||
INSERT INTO arrtest (a, b[2][2][1], c, d, e, f, g)
|
||||
VALUES ('{11,12,23}', '{{3,4},{4,5}}', '{"foobar"}',
|
||||
'{{"elt1", "elt2"}}', '{"3.4", "6.7"}',
|
||||
'{"abc","abcdefgh"}', '{"abc","abcdefgh"}');
|
||||
|
||||
INSERT INTO arrtest (a, b[1][2][2], c, d[2][1])
|
||||
VALUES ('{}', '{3,4}', '{foo,bar}', '{bar,foo}');
|
||||
|
||||
|
||||
--
|
||||
-- for internal portal (cursor) tests
|
||||
|
@ -172,16 +172,6 @@ CREATE TABLE aggtest (
|
||||
b float4
|
||||
);
|
||||
|
||||
CREATE TABLE arrtest (
|
||||
a int2[],
|
||||
b int4[][][],
|
||||
c name[],
|
||||
d text[][],
|
||||
e float8[],
|
||||
f char(5)[],
|
||||
g varchar(5)[]
|
||||
);
|
||||
|
||||
CREATE TABLE hash_i4_heap (
|
||||
seqno int4,
|
||||
random int4
|
||||
|
@ -25,7 +25,9 @@ SELECT CAST(f1 AS text) AS "text(varchar)" FROM VARCHAR_TBL;
|
||||
|
||||
SELECT CAST(name 'namefield' AS text) AS "text(name)";
|
||||
|
||||
SELECT CAST(f1 AS char(10)) AS "char(text)" FROM TEXT_TBL;
|
||||
SELECT CAST(f1 AS char(10)) AS "char(text)" FROM TEXT_TBL; -- fail
|
||||
|
||||
SELECT CAST(f1 AS char(20)) AS "char(text)" FROM TEXT_TBL;
|
||||
|
||||
SELECT CAST(f1 AS char(10)) AS "char(varchar)" FROM VARCHAR_TBL;
|
||||
|
||||
@ -158,7 +160,7 @@ SELECT 'unknown' || ' and unknown' AS "Concat unknown types";
|
||||
|
||||
SELECT text 'text' || ' and unknown' AS "Concat text to unknown type";
|
||||
|
||||
SELECT text 'text' || char(10) ' and characters' AS "Concat text to char";
|
||||
SELECT text 'text' || char(20) ' and characters' AS "Concat text to char";
|
||||
|
||||
SELECT text 'text' || varchar ' and varchar' AS "Concat text to varchar";
|
||||
|
||||
|
@ -20,6 +20,7 @@ INSERT INTO VARCHAR_TBL (f1) VALUES ('');
|
||||
|
||||
-- try varchar's of greater than 1 length
|
||||
INSERT INTO VARCHAR_TBL (f1) VALUES ('cd');
|
||||
INSERT INTO VARCHAR_TBL (f1) VALUES ('c ');
|
||||
|
||||
|
||||
SELECT '' AS seven, VARCHAR_TBL.*;
|
||||
@ -60,6 +61,6 @@ INSERT INTO VARCHAR_TBL (f1) VALUES ('a');
|
||||
INSERT INTO VARCHAR_TBL (f1) VALUES ('ab');
|
||||
INSERT INTO VARCHAR_TBL (f1) VALUES ('abcd');
|
||||
INSERT INTO VARCHAR_TBL (f1) VALUES ('abcde');
|
||||
INSERT INTO VARCHAR_TBL (f1) VALUES ('abcd ');
|
||||
|
||||
SELECT '' AS four, VARCHAR_TBL.*;
|
||||
|
||||
|
Reference in New Issue
Block a user