I apologize in advance for not testing on 8.3.5, but that would be very difficult for me.
here is where it works in 8.3.1: protocalte=> select version() ; version ---------------------------------------------------------------------------------------- PostgreSQL 8.3.1 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 (Debian 4.2.3-2) (1 row) protocalte=> CREATE TABLE locn ( locn_key integer NOT NULL, public_phone text NOT NULL, CONSTRAINT public_phone_ch CHECK (((public_phone = ''::text) OR ("substring"(public_phone, '^[0-9]{10}(,[0-9]{10})*$'::text) IS NOT NULL))) ); CREATE TABLE protocalte=> insert into locn values(10, '1231231234') ; INSERT 0 1 and here is where it does not work in 8.3.4: postgresbugs=# select version() ; version -------------------------------------------------------------------------------------------- PostgreSQL 8.3.4 on i486-pc-linux-gnu, compiled by GCC gcc-4.3.real (Debian 4.3.2-1) 4.3.2 (1 row) postgresbugs=# CREATE TABLE locn ( locn_key integer NOT NULL, public_phone text NOT NULL, CONSTRAINT public_phone_ch CHECK (((public_phone = ''::text) OR ("substring"(public_phone, '^[0-9]{10}(,[0-9]{10})*$'::text) IS NOT NULL))) ); CREATE TABLE postgresbugs=# insert into locn values(10, '1231231234') ; ERROR: new row for relation "locn" violates check constraint "public_phone_ch"