@ -132,31 +132,33 @@ SELECT SUBSTRING('1234567890' FROM 3) = '34567890' AS "34567890";
SELECT SUBSTRING ( ' 1234567890 ' FROM 4 FOR 3 ) = ' 456 ' AS " 456 " ;
SELECT SUBSTRING ( ' 1234567890 ' FROM 4 FOR 3 ) = ' 456 ' AS " 456 " ;
-- T581 regular expression substring (with SQL's bizarre regexp syntax)
-- T581 regular expression substring (with SQL's bizarre regexp syntax)
SELECT SUBSTRING ( ' abcdefg ' SIMILAR ' a#"(b_d)#"% ' ESCAPE ' # ' ) AS " bcd " ;
-- obsolete SQL99 syntax
SELECT SUBSTRING ( ' abcdefg ' FROM ' a#"(b_d)#"% ' FOR ' # ' ) AS " bcd " ;
SELECT SUBSTRING ( ' abcdefg ' FROM ' a#"(b_d)#"% ' FOR ' # ' ) AS " bcd " ;
-- No match should return NULL
-- No match should return NULL
SELECT SUBSTRING ( ' abcdefg ' FROM ' #"(b_d)#"% ' FOR ' # ' ) IS NULL AS " True " ;
SELECT SUBSTRING ( ' abcdefg ' SIMILAR ' #"(b_d)#"% ' ESCAPE ' # ' ) IS NULL AS " True " ;
-- Null inputs should return NULL
-- Null inputs should return NULL
SELECT SUBSTRING ( ' abcdefg ' FROM ' % ' FOR NULL ) IS NULL AS " True " ;
SELECT SUBSTRING ( ' abcdefg ' SIMILAR ' % ' ESCAPE NULL ) IS NULL AS " True " ;
SELECT SUBSTRING ( NULL FROM ' % ' FOR ' # ' ) IS NULL AS " True " ;
SELECT SUBSTRING ( NULL SIMILAR ' % ' ESCAPE ' # ' ) IS NULL AS " True " ;
SELECT SUBSTRING ( ' abcdefg ' FROM NULL FOR ' # ' ) IS NULL AS " True " ;
SELECT SUBSTRING ( ' abcdefg ' SIMILAR NULL ESCAPE ' # ' ) IS NULL AS " True " ;
-- The first and last parts should act non-greedy
-- The first and last parts should act non-greedy
SELECT SUBSTRING ( ' abcdefg ' FROM ' a#"%#"g ' FOR ' # ' ) AS " bcdef " ;
SELECT SUBSTRING ( ' abcdefg ' SIMILAR ' a#"%#"g ' ESCAPE ' # ' ) AS " bcdef " ;
SELECT SUBSTRING ( ' abcdefg ' FROM ' a*#"%#"g* ' FOR ' # ' ) AS " abcdefg " ;
SELECT SUBSTRING ( ' abcdefg ' SIMILAR ' a*#"%#"g* ' ESCAPE ' # ' ) AS " abcdefg " ;
-- Vertical bar in any part affects only that part
-- Vertical bar in any part affects only that part
SELECT SUBSTRING ( ' abcdefg ' FROM ' a|b#"%#"g ' FOR ' # ' ) AS " bcdef " ;
SELECT SUBSTRING ( ' abcdefg ' SIMILAR ' a|b#"%#"g ' ESCAPE ' # ' ) AS " bcdef " ;
SELECT SUBSTRING ( ' abcdefg ' FROM ' a#"%#"x|g ' FOR ' # ' ) AS " bcdef " ;
SELECT SUBSTRING ( ' abcdefg ' SIMILAR ' a#"%#"x|g ' ESCAPE ' # ' ) AS " bcdef " ;
SELECT SUBSTRING ( ' abcdefg ' FROM ' a#"%|ab#"g ' FOR ' # ' ) AS " bcdef " ;
SELECT SUBSTRING ( ' abcdefg ' SIMILAR ' a#"%|ab#"g ' ESCAPE ' # ' ) AS " bcdef " ;
-- Can't have more than two part separators
-- Can't have more than two part separators
SELECT SUBSTRING ( ' abcdefg ' FROM ' a*#"%#"g*#"x ' FOR ' # ' ) AS " error " ;
SELECT SUBSTRING ( ' abcdefg ' SIMILAR ' a*#"%#"g*#"x ' ESCAPE ' # ' ) AS " error " ;
-- Postgres extension: with 0 or 1 separator, assume parts 1 and 3 are empty
-- Postgres extension: with 0 or 1 separator, assume parts 1 and 3 are empty
SELECT SUBSTRING ( ' abcdefg ' FROM ' a#"%g ' FOR ' # ' ) AS " bcdefg " ;
SELECT SUBSTRING ( ' abcdefg ' SIMILAR ' a#"%g ' ESCAPE ' # ' ) AS " bcdefg " ;
SELECT SUBSTRING ( ' abcdefg ' FROM ' a%g ' FOR ' # ' ) AS " abcdefg " ;
SELECT SUBSTRING ( ' abcdefg ' SIMILAR ' a%g ' ESCAPE ' # ' ) AS " abcdefg " ;
-- substring() with just two arguments is not allowed by SQL spec;
-- substring() with just two arguments is not allowed by SQL spec;
-- we accept it, but we interpret the pattern as a POSIX regexp not SQL
-- we accept it, but we interpret the pattern as a POSIX regexp not SQL