set hive.stats.autogather=false;
set hive.support.concurrency=true;
set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
set hive.acid.truncate.usebase=false;

CREATE TABLE table1_n0(i int CHECK (-i > -10),
    j int CHECK (+j > 10),
    ij boolean CHECK (ij IS NOT NULL),
    a int CHECK (a BETWEEN i AND j),
    bb float CHECK (bb IN (23.4,56,4)),
    d bigint CHECK (d > round(567.6) AND d < round(1000.4)))
    clustered by (i) into 2 buckets stored as orc TBLPROPERTIES('transactional'='true');
DESC FORMATTED table1_n0;

EXPLAIN INSERT INTO table1_n0 values(1,100,true, 5, 23.4, 700.5);
INSERT INTO table1_n0 values(1,100,true, 5, 23.4, 700.5);
SELECT * from table1_n0;
DROP TABLE table1_n0;

-- null check constraint
CREATE TABLE table2_n0(i int CHECK (i + NULL > 0));
DESC FORMATTED table2_n0;
EXPLAIN INSERT INTO table2_n0 values(8);
INSERT INTO table2_n0 values(8);
select * from table2_n0;
Drop table table2_n0;

-- UDF created by users
CREATE FUNCTION test_udf2 AS 'org.apache.hadoop.hive.ql.udf.generic.GenericUDFTestGetJavaString';
CREATE TABLE tudf(v string CHECK (test_udf2(v) <> 'vin'));
EXPLAIN INSERT INTO tudf values('function1');
Drop table tudf;

-- multiple constraints
create table tmulti(url string NOT NULL ENABLE, userName string, numClicks int CHECK (numClicks > 0), d date);
explain alter table tmulti add constraint un1 UNIQUE (userName, numClicks) DISABLE;
alter table tmulti add constraint un1 UNIQUE (userName, numClicks) DISABLE;
DESC formatted tmulti;
EXPLAIN INSERT INTO tmulti values('hive.apache.com', 'user1', 48, '12-01-2018');
INSERT INTO tmulti values('hive.apache.com', 'user1', 48, '12-01-2018');
Select * from tmulti;

-- alter table add constraint
truncate table tmulti;
alter table tmulti add constraint chk1 CHECK (userName != NULL);
alter table tmulti add constraint chk2 CHECK (numClicks <= 10000 AND userName != '');
DESC formatted tmulti;
EXPLAIN INSERT INTO tmulti values('hive.apache.com', 'user1', 48, '12-01-2018');
INSERT INTO tmulti values('hive.apache.com', 'user1', 48, '12-01-2018');
Select * from tmulti;
Drop table tmulti;

-- case insentivity
create table tcase(url string NOT NULL ENABLE, userName string, d date, numClicks int CHECK (numclicks > 0));
DESC formatted tcase;
EXPLAIN INSERT INTO tcase values('hive.apache.com', 'user1', '12-01-2018', 48);
INSERT INTO tcase values('hive.apache.com', 'user1', '12-01-2018', 48);
Select * from tcase ;
Drop table tcase;

-- cast
create table tcast(url string NOT NULL ENABLE, numClicks int,
    price FLOAT CHECK (cast(numClicks as FLOAT)*price > 10.00));
DESC FORMATTED tcast;
EXPLAIN INSERT INTO tcast values('www.google.com', 100, cast(0.5 as float));
INSERT INTO tcast values('www.google.com', 100, cast(0.5 as float));
SELECT * from tcast;
-- check shouldn't fail
EXPLAIN INSERT INTO tcast(url, price) values('www.yahoo.com', 0.5);
INSERT INTO tcast(url, price) values('www.yahoo.com', 0.5);
SELECT * FROM tcast;
DROP TABLE tcast;

-- complex expression
create table texpr(i int DEFAULT 89, f float NOT NULL ENABLE, d decimal(4,1),
    b boolean CHECK (((cast(d as float) + f) < cast(i as float) + (i*i))));
DESC FORMATTED texpr;
explain insert into texpr values(3,3.4,5.6,true);
insert into texpr values(3,3.4,5.6,true);
SELECT * from texpr;
DROP TABLE texpr;

-- UPDATE
create table acid_uami_n0(i int,
                 de decimal(5,2) constraint nn1 not null enforced,
                 vc varchar(128) constraint ch2 CHECK (de >= cast(i as decimal(5,2))) enforced)
                 clustered by (i) into 2 buckets stored as orc TBLPROPERTIES ('transactional'='true');
DESC FORMATTED acid_uami_n0;

--! qt:dataset:src
-- insert as select
explain insert into table acid_uami_n0 select cast(key as int), cast (key as decimal(5,2)), value from src;
insert into table acid_uami_n0 select cast(key as int), cast (key as decimal(5,2)), value from src;

-- insert overwrite
explain insert overwrite table acid_uami_n0 select cast(key as int), cast (key as decimal(5,2)), value
    from src order by cast(key as int) limit 10 ;
insert overwrite table acid_uami_n0 select cast(key as int), cast (key as decimal(5,2)), value
    from src order by cast(key as int) limit 10 ;

-- insert as select cont
explain insert into table acid_uami_n0 select cast(s1.key as int) as c1, cast (s2.key as decimal(5,2)) as c2, s1.value from src s1
    left outer join src s2 on s1.key=s2.key where s1.value > 'val' limit 10 ;
insert into table acid_uami_n0 select cast(s1.key as int) as c1, cast (s2.key as decimal(5,2)) as c2, s1.value from src s1
    left outer join src s2 on s1.key=s2.key where s1.value > 'val' limit 10 ;
select * from acid_uami_n0;
truncate table acid_uami_n0;

-- insert as select group by + agg
explain insert into table acid_uami_n0 select min(cast(key as int)) as c1, max(cast (key as decimal(5,2))) as c2, value
    from src group by key, value order by key, value limit 10;
insert into table acid_uami_n0 select min(cast(key as int)) as c1, max(cast (key as decimal(5,2))) as c2, value
    from src group by key, value order by key, value limit 10;
select * from acid_uami_n0;
truncate table acid_uami_n0;

-- multi insert
create table src_multi2_n0 (i STRING, j STRING NOT NULL ENABLE);
explain
from src
insert into table acid_uami_n0 select cast(key as int), cast(key as decimal(5,2)), value where key < 10
insert overwrite table src_multi2_n0 select * where key > 10 and key < 20;
drop table src_multi2_n0;

-- update
select * from acid_uami_n0 order by de desc limit 15;
explain cbo update acid_uami_n0 set de = 893.14 where de = 103.00 or de = 119.00;
explain update acid_uami_n0 set de = 893.14 where de = 103.00 or de = 119.00;
update acid_uami_n0 set de = 893.14 where de = 103.00 or de = 119.00;
select * from acid_uami_n0 order by de desc limit 15;
explain ALTER table acid_uami_n0 drop constraint ch2;
ALTER table acid_uami_n0 drop constraint ch2;
explain update acid_uami_n0 set vc = 'apache_hive' where de = 893.14 ;
update acid_uami_n0 set vc = 'apache_hive' where de = 893.14 ;
select * from acid_uami_n0 order by vc limit 15;
DROP TABLE acid_uami_n0;

-- MERGE
create table tmerge(key int CHECK (key > 0 AND (key < 100 OR key = 5)) enable, a1 string NOT NULL, value string)
clustered by (value) into 2 buckets stored as orc
tblproperties ("transactional"="true");
DESC FORMATTED tmerge;

create table nonacid (key int, a1 string, value string) stored as orc;

-- with cardinality check off
set hive.merge.cardinality.check=false;
explain MERGE INTO tmerge as t using nonacid as s ON t.key = s.key
WHEN MATCHED AND s.key < 5 THEN DELETE
WHEN MATCHED AND s.key < 3 THEN UPDATE set a1 = '1'
WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.a1, s.value);

-- with cardinality check on
set hive.merge.cardinality.check=true;
explain MERGE INTO tmerge as t using nonacid as s ON t.key = s.key
WHEN MATCHED AND s.key < 5 THEN DELETE
WHEN MATCHED AND s.key < 3 THEN UPDATE set a1 = '1'
WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.a1, s.value);

explain MERGE INTO tmerge as t using nonacid as s ON t.key = s.key
WHEN MATCHED AND s.key < 5 THEN DELETE
WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.a1, s.value);

DROP TABLE tmerge;
DROP TABLE nonacid;

-- drop constraint
CREATE TABLE numericDataType(a TINYINT CONSTRAINT tinyint_constraint DEFAULT 127Y ENABLE,
    b bigint CONSTRAINT check1 CHECK (b in(4,5)) ENABLE)
    clustered by (b) into 2 buckets stored as orc TBLPROPERTIES ('transactional'='true');
DESC FORMATTED numericDataType;
ALTER TABLE numericDataType DROP CONSTRAINT check1;
DESC FORMATTED numericDataType;

EXPLAIN INSERT INTO numericDataType(b) values(456);
INSERT INTO numericDataType(b) values(456);
SELECT * from numericDataType;
DROP TABLE numericDataType;

-- column reference missing for column having check constraint
-- NULL for column with check shouldn't be possible
CREATE TABLE tcheck(a TINYINT, b bigint CONSTRAINT check1 CHECK (b in(4,5)) ENABLE)
    clustered by (b) into 2 buckets stored as orc TBLPROPERTIES ('transactional'='true');
DESC FORMATTED tcheck;
EXPLAIN INSERT INTO tcheck(a) values(1);
EXPLAIN INSERT INTO tcheck(b) values(4);
INSERT INTO tcheck(b) values(4);
SELECT * FROM tcheck;
DROP TABLE tcheck;

-- micro-managed table
set hive.create.as.insert.only=true;
create table part_mm(key int check (key > 0 and key < 5000) enforced) partitioned by (key_mm int)
    stored as orc tblproperties ("transactional"="true", "transactional_properties"="insert_only");
explain insert into table part_mm partition(key_mm=455) select key from src order by value limit 3;
insert into table part_mm partition(key_mm=455) select key from src order by value desc limit 3;
select key from src order by value limit 3;
select * from part_mm;
drop table part_mm;

-- rely, novalidate
create table trely(i int);
ALTER TABLE trely CHANGE i i int CHECK (i>0) ENABLE NOVALIDATE RELY;
DESC FORMATTED trely;
DROP TABLE trely;

-- table level constraint
create table tbl1_n1(a string, b int, CONSTRAINT check1 CHECK (a != '' AND b > 4));
desc formatted tbl1_n1;
explain insert into tbl1_n1 values('a', 69);
insert into tbl1_n1 values('a', 69);
select * from tbl1_n1;
ALTER TABLE tbl1_n1 add constraint chk2 CHECK (b < 100);
desc formatted tbl1_n1;
explain insert into tbl1_n1 values('a', 69);
drop table tbl1_n1;
