-- This file and its contents are licensed under the Apache License 2.0.
-- Please see the included NOTICE for copyright information and
-- LICENSE-APACHE for a copy of the license.

CREATE TABLE hyper (
  time BIGINT NOT NULL,
  device_id TEXT NOT NULL,
  sensor_1 NUMERIC NULL DEFAULT 1 CHECK (sensor_1 > 10)
);


SELECT * FROM create_hypertable('hyper', 'time', chunk_time_interval => 10);

--check and not-null constraints are inherited through regular inheritance.

\set ON_ERROR_STOP 0
INSERT INTO hyper(time, device_id,sensor_1) VALUES
(1257987700000000000, 'dev2', 9);

INSERT INTO hyper(time, device_id,sensor_1) VALUES
(1257987700000000000, NULL, 11);

ALTER TABLE hyper ALTER COLUMN time DROP NOT NULL;

ALTER TABLE ONLY hyper ALTER COLUMN sensor_1 SET NOT NULL;
ALTER TABLE ONLY hyper ALTER COLUMN device_id DROP NOT NULL;

\set ON_ERROR_STOP 1

INSERT INTO hyper(time, device_id,sensor_1) VALUES
(1257987700000000000, 'dev2', 11);

INSERT INTO hyper(time, device_id,sensor_1) VALUES
(1257987700000000000, 'dev2', 11);

ALTER TABLE hyper ALTER COLUMN device_id DROP NOT NULL;

INSERT INTO hyper(time, device_id,sensor_1) VALUES
(1257987700000000000, NULL, 11);

--make sure validate works
\set ON_ERROR_STOP 0
ALTER TABLE hyper ADD CONSTRAINT bad_check_const CHECK (sensor_1 > 100);
\set ON_ERROR_STOP 1

ALTER TABLE hyper ADD CONSTRAINT bad_check_const CHECK (sensor_1 > 100) NOT VALID;

\set ON_ERROR_STOP 0
ALTER TABLE hyper VALIDATE CONSTRAINT bad_check_const;
\set ON_ERROR_STOP 1
----------------------- UNIQUE CONSTRAINTS ------------------

CREATE TABLE hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name (
  time BIGINT NOT NULL UNIQUE,
  device_id TEXT NOT NULL,
  sensor_1 NUMERIC NULL DEFAULT 1 CHECK (sensor_1 > 10)
);


SELECT * FROM create_hypertable('hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name', 'time', chunk_time_interval => 10);

INSERT INTO hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name(time, device_id,sensor_1) VALUES
(1257987700000000000, 'dev2', 11);

INSERT INTO hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name(time, device_id,sensor_1) VALUES
(1257987800000000000, 'dev2', 11);

\set ON_ERROR_STOP 0
INSERT INTO hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name(time, device_id,sensor_1) VALUES
(1257987700000000000, 'dev2', 11);
\set ON_ERROR_STOP 1

-- Show constraints on main tables
SELECT * FROM _timescaledb_catalog.chunk_constraint;
SELECT * FROM _timescaledb_catalog.chunk_index;
SELECT * FROM test.show_constraints('hyper');
SELECT * FROM test.show_constraints('hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name');
--should have unique constraint not just unique index
SELECT * FROM test.show_constraints('_timescaledb_internal._hyper_2_4_chunk');

ALTER TABLE hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name DROP CONSTRAINT hyper_unique_with_looooooooooooooooooooooooooooooooooo_time_key;
-- The constraint should have been removed from the chunk as well
SELECT * FROM _timescaledb_catalog.chunk_constraint;
-- The index should also have been removed
SELECT * FROM _timescaledb_catalog.chunk_index;
SELECT * FROM test.show_constraints('_timescaledb_internal._hyper_2_4_chunk');

--uniqueness not enforced
INSERT INTO hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name(time, device_id,sensor_1) VALUES
(1257987700000000000, 'dev3', 11);

--shouldn't be able to create constraint
\set ON_ERROR_STOP 0
ALTER TABLE hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name ADD CONSTRAINT hyper_unique_time_key UNIQUE (time);
\set ON_ERROR_STOP 1

DELETE FROM hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name WHERE device_id = 'dev3';

-- Try multi-alter table statement with a constraint without a name
ALTER TABLE hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name
      ADD CHECK (time > 0),
      ADD UNIQUE (time) DEFERRABLE INITIALLY DEFERRED;

\set ON_ERROR_STOP 0
BEGIN;
--testing deferred checking. The following row has an error, which will not appear until the commit
INSERT INTO hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name(time, device_id,sensor_1) VALUES
(1257987700000000000, 'dev3', 11);
SELECT 1;
COMMIT;
\set ON_ERROR_STOP 1

SELECT * FROM _timescaledb_catalog.chunk_constraint;
SELECT * FROM test.show_constraints('hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name');
SELECT * FROM test.show_constraints('_timescaledb_internal._hyper_2_4_chunk');

ALTER TABLE  hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name
DROP CONSTRAINT hyper_unique_with_looooooooooooooooooooooooooooooooooo_time_key,
DROP CONSTRAINT hyper_unique_with_looooooooooooooooooooooooooooooooo_time_check;

SELECT * FROM _timescaledb_catalog.chunk_constraint;
SELECT * FROM test.show_constraints('hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name');
SELECT * FROM test.show_constraints('_timescaledb_internal._hyper_2_4_chunk');

CREATE UNIQUE INDEX hyper_unique_with_looooooooooooooooooooooooooooooooo_time_idx
ON hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name (time);

\set ON_ERROR_STOP 0
-- Try adding constraint using existing index
ALTER TABLE hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name
ADD CONSTRAINT hyper_unique_with_looooooooooooooooooooooooooooooooooo_time_key UNIQUE
USING INDEX hyper_unique_with_looooooooooooooooooooooooooooooooo_time_idx;
\set ON_ERROR_STOP 1
DROP INDEX hyper_unique_with_looooooooooooooooooooooooooooooooo_time_idx;

--now can create
ALTER TABLE  hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name
ADD CONSTRAINT hyper_unique_with_looooooooooooooooooooooooooooooooooo_time_key UNIQUE (time);
SELECT * FROM test.show_constraints('_timescaledb_internal._hyper_2_4_chunk');

--test adding constraint with same name to different table -- should fail
\set ON_ERROR_STOP 0
ALTER TABLE hyper
ADD CONSTRAINT hyper_unique_with_looooooooooooooooooooooooooooooooooo_time_key UNIQUE (time);
\set ON_ERROR_STOP 1

--uniquness violation fails
\set ON_ERROR_STOP 0
INSERT INTO hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name(time, device_id,sensor_1)
VALUES (1257987700000000000, 'dev2', 11);
\set ON_ERROR_STOP 1

--cannot create unique constraint on non-partition column
\set ON_ERROR_STOP 0
ALTER TABLE hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name
ADD CONSTRAINT hyper_unique_invalid UNIQUE (device_id);

ALTER TABLE hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name
ADD COLUMN new_device_id int UNIQUE;

ALTER TABLE hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name
DROP COLUMN device_id,
ADD COLUMN new_device_id int UNIQUE;
\set ON_ERROR_STOP 1

----------------------- RENAME CONSTRAINT  ------------------

ALTER TABLE hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name
RENAME CONSTRAINT hyper_unique_with_looooooooooooooooooooooooooooooooooo_time_key TO new_name;

ALTER TABLE hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name *
RENAME CONSTRAINT new_name TO new_name2;

ALTER TABLE IF EXISTS hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name
RENAME CONSTRAINT  hyper_unique_with_looooooooooooooooooooooooooooo_sensor_1_check TO check_2;


SELECT * FROM test.show_constraints('hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name');
SELECT * FROM test.show_constraints('_timescaledb_internal._hyper_2_4_chunk');
SELECT * FROM _timescaledb_catalog.chunk_constraint;

\set ON_ERROR_STOP 0
ALTER TABLE hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name
RENAME CONSTRAINT new_name TO new_name2;
ALTER TABLE hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name
RENAME CONSTRAINT new_name2 TO check_2;
ALTER TABLE ONLY hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name
RENAME CONSTRAINT new_name2 TO new_name;
ALTER TABLE _timescaledb_internal._hyper_2_4_chunk
RENAME CONSTRAINT "4_10_new_name2" TO new_name;
\set ON_ERROR_STOP 1

----------------------- PRIMARY KEY  ------------------

CREATE TABLE hyper_pk (
  time BIGINT NOT NULL PRIMARY KEY,
  device_id TEXT NOT NULL,
  sensor_1 NUMERIC NULL DEFAULT 1 CHECK (sensor_1 > 10)
);


SELECT * FROM create_hypertable('hyper_pk', 'time', chunk_time_interval => 10);

INSERT INTO hyper_pk(time, device_id,sensor_1) VALUES
(1257987700000000000, 'dev2', 11);

\set ON_ERROR_STOP 0
INSERT INTO hyper_pk(time, device_id,sensor_1) VALUES
(1257987700000000000, 'dev2', 11);
\set ON_ERROR_STOP 1

--should have unique constraint not just unique index
SELECT * FROM test.show_constraints('_timescaledb_internal._hyper_3_6_chunk');

ALTER TABLE hyper_pk DROP CONSTRAINT hyper_pk_pkey;
SELECT * FROM test.show_constraints('_timescaledb_internal._hyper_3_6_chunk');

--uniqueness not enforced
INSERT INTO hyper_pk(time, device_id,sensor_1) VALUES
(1257987700000000000, 'dev3', 11);


--shouldn't be able to create pk
\set ON_ERROR_STOP 0
ALTER TABLE hyper_pk ADD CONSTRAINT hyper_pk_pkey PRIMARY KEY (time);

ALTER TABLE hyper_unique_with_looooooooooooooooooooooooooooooooooooong_name
ADD COLUMN new_device_id int PRIMARY KEY;
\set ON_ERROR_STOP 1

DELETE FROM hyper_pk WHERE device_id = 'dev3';

--cannot create pk constraint on non-partition column
\set ON_ERROR_STOP 0
ALTER TABLE hyper_pk ADD CONSTRAINT hyper_pk_invalid PRIMARY KEY (device_id);
\set ON_ERROR_STOP 1

--now can create
ALTER TABLE hyper_pk ADD CONSTRAINT hyper_pk_pkey PRIMARY KEY (time) DEFERRABLE INITIALLY DEFERRED;
SELECT * FROM test.show_constraints('_timescaledb_internal._hyper_3_6_chunk');

--test adding constraint with same name to different table -- should fail
\set ON_ERROR_STOP 0
ALTER TABLE hyper ADD CONSTRAINT hyper_pk_pkey UNIQUE (time);
\set ON_ERROR_STOP 1

--uniquness violation fails
\set ON_ERROR_STOP 0
BEGIN;
  --error here deferred until commit
  INSERT INTO hyper_pk(time, device_id,sensor_1) VALUES
  (1257987700000000000, 'dev2', 11);
  SELECT 1;
COMMIT;
\set ON_ERROR_STOP 1


----------------------- FOREIGN KEY  ------------------

CREATE TABLE devices(
    device_id TEXT NOT NULL,
    PRIMARY KEY (device_id)
);

CREATE TABLE hyper_fk (
  time BIGINT NOT NULL PRIMARY KEY,
  device_id TEXT NOT NULL REFERENCES devices(device_id),
  sensor_1 NUMERIC NULL DEFAULT 1 CHECK (sensor_1 > 10)
);


SELECT * FROM create_hypertable('hyper_fk', 'time', chunk_time_interval => 10);

--fail fk constraint
\set ON_ERROR_STOP 0
INSERT INTO hyper_fk(time, device_id,sensor_1) VALUES
(1257987700000000000, 'dev2', 11);
\set ON_ERROR_STOP 1

INSERT INTO devices VALUES ('dev2');

INSERT INTO hyper_fk(time, device_id,sensor_1) VALUES
(1257987700000000000, 'dev2', 11);

--delete should fail
\set ON_ERROR_STOP 0
DELETE FROM devices;
\set ON_ERROR_STOP 1

ALTER TABLE hyper_fk DROP CONSTRAINT hyper_fk_device_id_fkey;

--should now be able to add non-fk rows
INSERT INTO hyper_fk(time, device_id,sensor_1) VALUES
(1257987700000000001, 'dev3', 11);

--can't add fk because of dev3 row
\set ON_ERROR_STOP 0
ALTER TABLE hyper_fk ADD CONSTRAINT hyper_fk_device_id_fkey
FOREIGN KEY (device_id) REFERENCES devices(device_id);
\set ON_ERROR_STOP 1

--but can add a NOT VALID one
ALTER TABLE hyper_fk ADD CONSTRAINT hyper_fk_device_id_fkey
FOREIGN KEY (device_id) REFERENCES devices(device_id) NOT VALID;

--which will fail when validated
\set ON_ERROR_STOP 0
ALTER TABLE hyper_fk VALIDATE CONSTRAINT hyper_fk_device_id_fkey;
\set ON_ERROR_STOP 1

ALTER TABLE hyper_fk DROP CONSTRAINT hyper_fk_device_id_fkey;

DELETE FROM hyper_fk WHERE device_id = 'dev3';

ALTER TABLE hyper_fk ADD CONSTRAINT hyper_fk_device_id_fkey
FOREIGN KEY (device_id) REFERENCES devices(device_id);

\set ON_ERROR_STOP 0
INSERT INTO hyper_fk(time, device_id,sensor_1) VALUES
(1257987700000000002, 'dev3', 11);
\set ON_ERROR_STOP 1

SELECT * FROM test.show_constraints('_timescaledb_internal._hyper_4_8_chunk');
SELECT * FROM _timescaledb_catalog.chunk_constraint;

--test CASCADE drop behavior
DROP TABLE devices CASCADE;

SELECT * FROM test.show_constraints('_timescaledb_internal._hyper_4_8_chunk');
SELECT * FROM _timescaledb_catalog.chunk_constraint;

--the fk went away.
INSERT INTO hyper_fk(time, device_id,sensor_1) VALUES
(1257987700000000002, 'dev3', 11);

CREATE TABLE devices(
    device_id TEXT NOT NULL,
    PRIMARY KEY (device_id)
);

INSERT INTO devices VALUES ('dev2'), ('dev3');

ALTER TABLE hyper_fk ADD CONSTRAINT hyper_fk_device_id_fkey
FOREIGN KEY (device_id) REFERENCES devices(device_id) DEFERRABLE INITIALLY DEFERRED;

\set ON_ERROR_STOP 0
BEGIN;
  --error deferred until commmit
  INSERT INTO hyper_fk(time, device_id,sensor_1) VALUES
  (1257987700000000003, 'dev4', 11);
  SELECT 1;
COMMIT;
\set ON_ERROR_STOP 1

ALTER TABLE hyper_fk ALTER CONSTRAINT hyper_fk_device_id_fkey NOT DEFERRABLE;

\set ON_ERROR_STOP 0
BEGIN;
  --error detected right away
  INSERT INTO hyper_fk(time, device_id,sensor_1) VALUES
  (1257987700000000003, 'dev4', 11);
  SELECT 1;
COMMIT;
\set ON_ERROR_STOP 1

--this tests that there are no extra chunk_constraints left on hyper_fk
TRUNCATE hyper_fk;

----------------------- FOREIGN KEY INTO A HYPERTABLE  ------------------


--FOREIGN KEY references into a hypertable are currently broken.
--The referencing table will never find the corresponding row in the hypertable
--since it will only search the parent. Thus any insert will result in an ERROR
--Block such foreign keys or fix. (Hard to block on create table so punting for now)
CREATE TABLE hyper_for_ref (
  time BIGINT NOT NULL PRIMARY KEY,
  device_id TEXT NOT NULL,
  sensor_1 NUMERIC NULL DEFAULT 1 CHECK (sensor_1 > 10)
);

SELECT * FROM create_hypertable('hyper_for_ref', 'time', chunk_time_interval => 10);

\set ON_ERROR_STOP 0
CREATE TABLE referrer (
    time BIGINT NOT NULL REFERENCES hyper_for_ref(time)
);
\set ON_ERROR_STOP 1

CREATE TABLE referrer2 (
   time BIGINT NOT NULL
);

\set ON_ERROR_STOP 0
ALTER TABLE referrer2 ADD CONSTRAINT hyper_fk_device_id_fkey
FOREIGN KEY (time) REFERENCES  hyper_for_ref(time);
\set ON_ERROR_STOP 1

----------------------- EXCLUSION CONSTRAINT  ------------------

CREATE TABLE hyper_ex (
    time BIGINT,
    device_id TEXT NOT NULL REFERENCES devices(device_id),
    sensor_1 NUMERIC NULL DEFAULT 1 CHECK (sensor_1 > 10),
    canceled boolean DEFAULT false,
    EXCLUDE USING btree (
        time WITH =, device_id WITH =
    ) WHERE (not canceled)
);

SELECT * FROM create_hypertable('hyper_ex', 'time', chunk_time_interval=>_timescaledb_functions.interval_to_usec('1 month'));

INSERT INTO hyper_ex(time, device_id,sensor_1) VALUES
(1257987700000000000, 'dev2', 11);

\set ON_ERROR_STOP 0
INSERT INTO hyper_ex(time, device_id,sensor_1) VALUES
(1257987700000000000, 'dev2', 12);
\set ON_ERROR_STOP 1

ALTER TABLE hyper_ex DROP CONSTRAINT hyper_ex_time_device_id_excl;

--can now add
INSERT INTO hyper_ex(time, device_id,sensor_1) VALUES
(1257987700000000000, 'dev2', 12);

--cannot add because of conflicts
\set ON_ERROR_STOP 0
ALTER TABLE hyper_ex ADD CONSTRAINT hyper_ex_time_device_id_excl
    EXCLUDE USING btree (
        time WITH =, device_id WITH =
    ) WHERE (not canceled)
;
\set ON_ERROR_STOP 1

DELETE FROM hyper_ex WHERE sensor_1 = 12;

ALTER TABLE hyper_ex ADD CONSTRAINT hyper_ex_time_device_id_excl
    EXCLUDE USING btree (
        time WITH =, device_id WITH =
    ) WHERE (not canceled) DEFERRABLE INITIALLY DEFERRED
;

\set ON_ERROR_STOP 0
BEGIN;
  --error deferred til commit
  INSERT INTO hyper_ex(time, device_id,sensor_1) VALUES
  (1257987700000000000, 'dev2', 12);
  SELECT 1;
COMMIT;
\set ON_ERROR_STOP 1


--cannot add exclusion constraint without partition key.
CREATE TABLE hyper_ex_invalid (
    time BIGINT,
    device_id TEXT NOT NULL REFERENCES devices(device_id),
    sensor_1 NUMERIC NULL DEFAULT 1 CHECK (sensor_1 > 10),
    canceled boolean DEFAULT false,
    EXCLUDE USING btree (
        device_id WITH =
    ) WHERE (not canceled)
);

\set ON_ERROR_STOP 0
SELECT * FROM create_hypertable('hyper_ex_invalid', 'time', chunk_time_interval=>_timescaledb_functions.interval_to_usec('1 month'));
\set ON_ERROR_STOP 1


--- NO INHERIT constraints (not allowed) ----
CREATE TABLE hyper_noinherit (
    time BIGINT,
    sensor_1 NUMERIC NULL DEFAULT 1 CHECK (sensor_1 > 0) NO INHERIT
);

SELECT * FROM test.show_constraints('hyper_noinherit');

\set ON_ERROR_STOP 0
SELECT * FROM create_hypertable('hyper_noinherit', 'time', chunk_time_interval=>_timescaledb_functions.interval_to_usec('1 month'));
\set ON_ERROR_STOP 1

CREATE TABLE hyper_noinherit_alter (
    time BIGINT,
    sensor_1 NUMERIC NULL DEFAULT 1
);

SELECT * FROM create_hypertable('hyper_noinherit_alter', 'time', chunk_time_interval=>_timescaledb_functions.interval_to_usec('1 month'));

\set ON_ERROR_STOP 0
ALTER TABLE hyper_noinherit_alter ADD CONSTRAINT check_noinherit CHECK (sensor_1 > 0) NO INHERIT;
--  CREATE TABLE WITH DEFERRED CONSTRAINTS --

CREATE TABLE hyper_unique_deferred (
  time BIGINT UNIQUE DEFERRABLE INITIALLY DEFERRED,
  device_id TEXT NOT NULL,
  sensor_1 NUMERIC NULL DEFAULT 1 CHECK (sensor_1 > 10)
);

SELECT * FROM create_hypertable('hyper_unique_deferred', 'time', chunk_time_interval => 10);

INSERT INTO hyper_unique_deferred(time, device_id,sensor_1) VALUES (1257987700000000000, 'dev2', 11);

\set ON_ERROR_STOP 0
BEGIN;
  --error here deferred until commit
  INSERT INTO hyper_unique_deferred(time, device_id,sensor_1) VALUES (1257987700000000000, 'dev2', 11);
  SELECT 1;
COMMIT;
\set ON_ERROR_STOP 1

--test deferred on create table
CREATE TABLE hyper_pk_deferred (
  time BIGINT NOT NULL PRIMARY KEY DEFERRABLE INITIALLY DEFERRED,
  device_id TEXT NOT NULL,
  sensor_1 NUMERIC NULL DEFAULT 1 CHECK (sensor_1 > 10)
);

SELECT * FROM create_hypertable('hyper_pk_deferred', 'time', chunk_time_interval => 10);

INSERT INTO hyper_pk_deferred(time, device_id,sensor_1) VALUES (1257987700000000000, 'dev2', 11);

\set ON_ERROR_STOP 0
BEGIN;
  --error here deferred until commit
  INSERT INTO hyper_pk_deferred(time, device_id,sensor_1) VALUES (1257987700000000000, 'dev2', 11);
  SELECT 1;
COMMIT;
\set ON_ERROR_STOP 1

--test that deferred works on create table too
CREATE TABLE hyper_fk_deferred (
  time BIGINT NOT NULL PRIMARY KEY,
  device_id TEXT NOT NULL REFERENCES devices(device_id) DEFERRABLE INITIALLY DEFERRED,
  sensor_1 NUMERIC NULL DEFAULT 1 CHECK (sensor_1 > 10)
);

SELECT * FROM create_hypertable('hyper_fk_deferred', 'time', chunk_time_interval => 10);

\set ON_ERROR_STOP 0
BEGIN;
  --error deferred until commmit
  INSERT INTO hyper_fk_deferred(time, device_id,sensor_1) VALUES (1257987700000000003, 'dev4', 11);
  SELECT 1;
COMMIT;
\set ON_ERROR_STOP 1

CREATE TABLE hyper_ex_deferred (
    time BIGINT,
    device_id TEXT NOT NULL REFERENCES devices(device_id),
    sensor_1 NUMERIC NULL DEFAULT 1 CHECK (sensor_1 > 10),
    canceled boolean DEFAULT false,
    EXCLUDE USING btree (
        time WITH =, device_id WITH =
    ) WHERE (not canceled) DEFERRABLE INITIALLY DEFERRED
);

SELECT * FROM create_hypertable('hyper_ex_deferred', 'time', chunk_time_interval=>_timescaledb_functions.interval_to_usec('1 month'));

INSERT INTO hyper_ex_deferred(time, device_id,sensor_1) VALUES (1257987700000000000, 'dev2', 12);

\set ON_ERROR_STOP 0
BEGIN;
  --error deferred til commit
  INSERT INTO hyper_ex_deferred(time, device_id,sensor_1) VALUES (1257987700000000000, 'dev2', 12);
  SELECT 1;
COMMIT;
\set ON_ERROR_STOP 1

-- Make sure renaming schemas won't break dropping constraints
\c :TEST_DBNAME :ROLE_SUPERUSER
CREATE TABLE hyper_unique (
  time BIGINT NOT NULL UNIQUE,
  device_id TEXT NOT NULL,
  sensor_1 NUMERIC NULL DEFAULT 1 CHECK (sensor_1 > 10)
);

SELECT * FROM create_hypertable('hyper_unique', 'time', chunk_time_interval => 10, associated_schema_name => 'my_associated_schema');

INSERT INTO hyper_unique(time, device_id,sensor_1) VALUES (1257987700000000000, 'dev2', 11);

ALTER SCHEMA my_associated_schema RENAME TO new_associated_schema;

ALTER TABLE hyper_unique DROP CONSTRAINT hyper_unique_time_key;

-- test for constraint validation crash, see #1183
CREATE TABLE test_validate(time timestamp NOT NULL, a TEXT, b TEXT);
SELECT * FROM create_hypertable('test_validate', 'time');
INSERT INTO test_validate values(now(), 'a', 'b');

ALTER TABLE test_validate
ADD COLUMN c TEXT,
ADD CONSTRAINT c_not_null CHECK (c IS NOT NULL) NOT VALID;

UPDATE test_validate SET c = '';

ALTER TABLE test_validate
VALIDATE CONSTRAINT c_not_null;

DROP TABLE test_validate;

-- test for hypertables constraints both using index tablespaces and not See #2604
SET client_min_messages = ERROR;
DROP TABLESPACE IF EXISTS tablespace1;
SET client_min_messages = NOTICE;
CREATE TABLESPACE tablespace1 OWNER :ROLE_DEFAULT_PERM_USER LOCATION :TEST_TABLESPACE1_PATH;

CREATE TABLE fk_tbl (
id int,
CONSTRAINT pkfk PRIMARY KEY (id) USING INDEX TABLESPACE tablespace1);

CREATE TABLE tbl (
fk_id int,
id int,
time timestamp,
CONSTRAINT pk PRIMARY KEY (time, id) USING INDEX TABLESPACE tablespace1 DEFERRABLE INITIALLY DEFERRED);

SELECT create_hypertable('tbl', 'time');

ALTER TABLE tbl
ADD CONSTRAINT fk_con
FOREIGN KEY (fk_id) REFERENCES fk_tbl(id)
ON UPDATE SET NULL
ON DELETE SET NULL;

INSERT INTO fk_tbl VALUES(1);

INSERT INTO tbl VALUES (
1, 1, now()
);

DROP TABLE tbl;
DROP TABLE fk_tbl;

DROP TABLESPACE IF EXISTS tablespace1;
