PostgreSQL Domain Integrity In Depth

<span class="kw">CREATE</span> EXTENSION uri;

<span class="kw">CREATE</span> <span class="kw">DOMAIN</span> http_uri <span class="kw">AS</span> uri <span class="kw">CHECK</span> (
      uri_scheme(<span class="fu">VALUE</span>) <span class="kw">IS</span> <span class="kw">NOT</span> <span class="kw">NULL</span>
  <span class="kw">AND</span> uri_scheme(<span class="fu">VALUE</span>) <span class="kw">IN</span> (<span class="st">'http'</span>, <span class="st">'https'</span>)
  <span class="kw">AND</span> uri_host(<span class="fu">VALUE</span>) <span class="kw">IS</span> <span class="kw">NOT</span> <span class="kw">NULL</span>
  <span class="kw">AND</span> uri_host(<span class="fu">VALUE</span>) <> <span class="st">''</span>
);

<span class="co">-- works great</span>
<span class="kw">SELECT</span> <span class="st">'https://www.foo.com/bar/baz'</span>:<span class="ch">:http_uri</span>;

<span class="co">-- forbidden</span>
<span class="kw">SELECT</span> <span class="st">'ftp://www.foo.com/bar/baz'</span>:<span class="ch">:http_uri</span>;
CREATE FUNCTION is_valid_cc(smallint[]) RETURNS boolean AS $$
SELECT SUM(
CASE WHEN (pos % 2 = 0) THEN
2*digit - (CASE WHEN digit < 5 THEN 0 ELSE 9 END)
ELSE
digit
END
) % 10 = 0
FROM
unnest(ARRAY( -- loop over digit/position
SELECT $1[i] -- ... which we read backward
FROM generate_subscripts($1,1) AS s(i)
ORDER BY i DESC
)
) WITH ordinality AS t (digit, pos)
$$
LANGUAGE SQL