How to specify not null contraints for the fields of composite types in postgres
The correct syntax for a check constraint for a composite type would look like this:
create domain address_domain as address 
check (
  (value).city is not null and 
  (value).address_line is not null and
  (value).zip_code is not null
);

Let's check:
melkij=&gt; create table test_address_domain (a address_domain);
CREATE TABLE
melkij=&gt; insert into test_address_domain values (('foo', 'bar', 11));
INSERT 0 1
melkij=&gt; insert into test_address_domain values (('foo', 'bar', null)); -- fails
ERROR:  value for domain address_domain violates check constraint &quot;address_domain_check&quot;
melkij=&gt; insert into test_address_domain values (('foo', null, 11)); -- fails
ERROR:  value for domain address_domain violates check constraint &quot;address_domain_check&quot;
melkij=&gt; insert into test_address_domain values ((null, 'bar', 11)); -- fails
ERROR:  value for domain address_domain violates check constraint &quot;address_domain_check&quot;
melkij=&gt; insert into test_address_domain values (null); -- fails
ERROR:  value for domain address_domain violates check constraint &quot;address_domain_check&quot;

But pay attention to the last line. It seems that this is not what you want. Try allow explicitly:
melkij=*&gt; create domain address_domain2 as address 
check (
  value is null or (
  (value).city is not null and 
  (value).address_line is not null and
  (value).zip_code is not null
));
CREATE DOMAIN
melkij=*&gt; create table test_address_domain2 (a address_domain2);
CREATE TABLE
melkij=*&gt; insert into test_address_domain2 values (null); -- works now
INSERT 0 1