blob: a75c327f2aef33eb070332b1183cf9fe782f1035 [file] [log] [blame]
-- Tests for SeaBase
-- Added June 2013
--
-- @@@ START COPYRIGHT @@@
--
-- Licensed to the Apache Software Foundation (ASF) under one
-- or more contributor license agreements. See the NOTICE file
-- distributed with this work for additional information
-- regarding copyright ownership. The ASF licenses this file
-- to you under the Apache License, Version 2.0 (the
-- "License"); you may not use this file except in compliance
-- with the License. You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing,
-- software distributed under the License is distributed on an
-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-- KIND, either express or implied. See the License for the
-- specific language governing permissions and limitations
-- under the License.
--
-- @@@ END COPYRIGHT @@@
-- Notes: The section "testsWithForces" was added because of
-- JIRA TRAFODION 2777. Formerly, tables without statistics
-- would often get MDAM plans via a heuristic. If the table
-- was large, the plan could be very bad. The JIRA turned
-- that heuristic off. But that had side effects on this test.
-- This test seems to intentionally test the run-time MDAM
-- code. Since CQD MDAM_SCAN_METHOD 'ON' is no longer sufficient
-- to cause MDAM plans to be picked on these queries, we have
-- to resort to CONTROL QUERY SHAPE statements instead. And
-- those have to be done per statement. So, section "tests"
-- has been copied to create a new section "testsWithForces",
-- and CONTROL QUERY SHAPE statements added to that section.
-- Apart from these CQS statements, it's intended that those
-- two sections should be identical.
obey TEST010(clean_up);
cleanup obsolete volatile tables;
log LOG010 clear;
obey TEST010(setup);
cqd hbase_serialization 'OFF';
cqd hbase_filter_preds 'OFF';
cqd traf_aligned_row_format 'OFF';
-- query_cache on(default), mdam_scan_method on(default)
cqd query_cache '1024';
cqd mdam_scan_method 'ON';
obey TEST010(clean_up);
obey TEST010(testsWithForces);
-- query_cache off, mdam_scan_method off
cqd query_cache '0';
cqd mdam_scan_method 'OFF';
obey TEST010(clean_up);
obey TEST010(tests);
-- query_cache on, mdam_scan_method off
cqd query_cache '1024';
cqd mdam_scan_method 'OFF';
obey TEST010(clean_up);
obey TEST010(tests);
-- query_cache off, mdam_scan_method on
cqd query_cache '0';
cqd mdam_scan_method 'ON';
obey TEST010(clean_up);
obey TEST010(testsWithForces);
-- run with hbase_serialization ON
obey TEST010(clean_up);
cqd hbase_serialization 'ON';
cqd hbase_filter_preds 'ON';
cqd traf_aligned_row_format 'ON';
-- query_cache on(default), mdam_scan_method on(default)
cqd query_cache '1024';
cqd mdam_scan_method 'ON';
obey TEST010(clean_up);
obey TEST010(testsWithForces);
-- query_cache off, mdam_scan_method on
cqd query_cache '0';
cqd mdam_scan_method 'ON';
obey TEST010(clean_up);
obey TEST010(testsWithForces);
-- other mdam queries
cqd mdam_scan_method 'ON';
cqd query_cache '1024';
obey TEST010(otherMdam);
drop schema minotaur cascade;
log;
exit;
?section setup
--------------------------------------------------------------------------
cqd hbase_max_column_name_length '10';
cqd hbase_max_column_val_length '20';
cqd hbase_max_column_info_length '60';
?section clean_up
--------------------------------------------------------------------------
drop table if exists t010t1;
drop table if exists t010t2;
drop table if exists t010t3;
?section tests
--------------------------------------------------------------------------
create table if not exists t010t1 (a int not null, b char(10), primary key(a));
create table if not exists t010t2 (a int not null, b char(10) not null, c int not null, d char(10), primary key(a,b,c));
create table if not exists t010t3 (a int not null, b char(10) not null, c int not null, d char(10), primary key(a,b,c))
salt using 4 partitions on (a,b);
invoke t010t1;
invoke hbase."_CELL_"."TRAFODION.SCH.T010T1";
invoke hbase."_ROW_"."TRAFODION.SCH.T010T1";
insert into t010t1 values (1, 'a'), (2, 'b'), (3, 'c');
select * from t010t1;
select * from t010t1 where a = 2;
select * from t010t1 where a = 2 or a = 3;
delete from t010t1 where a = 4;
select * from t010t1;
delete from t010t1 where a = 2;
select * from t010t1;
-------------------
-- check query plan
-------------------
-- no sort operator should present when order by on primary key column
prepare xx from select * from t010t1 order by a;
explain options 'f' xx;
-- should see a sort when order by on non key column
prepare xx from select * from t010t1 order by b;
explain options 'f' xx;
-- should see no sort operator when selecting from one salt bucket
prepare xx from select * from t010t3 where (a,b) = (1,'b') order by c;
explain options 'f' xx;
-- selectPred should present due to the 2nd disjunct b='1'
prepare xx from select * from t010t1 where a=1 or b='1';
explain xx;
-- Optimization: with only one disjunct, the selectPred should be empty
-- and the executor predicate should contain the non-key predicate
prepare xx from select * from t010t1 where a=1 and b='1';
explain xx;
-- should see a full hbase SCAN
prepare xx from select * from t010t1 where b='1';
explain xx;
-- should see a unique hbase GET
prepare xx from select * from t010t1 where a=1;
explain xx;
insert into t010t2 values
(1, 'a', 1, '1a1'),
(1, 'a', 3, '1a3'),
(1, 'a', 5, '1a5'),
(1, 'c', 1, '1c1'),
(2, 'a', 1, '2a1'),
(2, 'a', 2, '2a2'),
(2, 'c', 3, '2c3'),
(4, 'a', 1, '4a1'),
(4, 'b', 1, '4b1'),
(4, 'b', 2, '4b2');
insert into t010t3 select * from t010t2;
prepare x1 from
select * from t010t2 where a in (1,4) and b='a' and c = 1;
execute x1;
-- expect 1a1, 4a1
prepare x2 from
select * from t010t2 where a in (1,2,4) and b='a' and (c in (1,3) or c>=5);
execute x2;
-- expect 1a1, 1a3, 1a5, 2a1, 4a1
prepare x3 from
select * from t010t2 where a in (1,2,4) and b='a' and c in (1,3);
execute x3;
-- expect 1a1, 1a3, 2a1, 4a1
prepare x4 from
delete from t010t2 where a in (2,4,6) and b='a' and c in (1,3);
execute x4;
-- expect 2 rows deleted, 2a1 and 4a1
execute x3;
-- expect 1a1, 1a3
insert into t010t2 values
(2, 'a', 1, '2a1'),
(4, 'a', 1, '4a1');
prepare x5 from
update t010t2 set d='upd' where a=4 and b in ('a', 'b') and c < 2;
execute x5;
-- execute 2 rows updated, 4a1 and 4b1
select * from t010t2;
cqd HBASE_MAX_NUM_SEARCH_KEYS '1';
prepare y1 from
select * from t010t2 where a in (1,4) and b='a' and c = 1;
execute y1;
-- expect 1a1, 4a1
prepare y2 from
select * from t010t2 where a in (1,2,4) and b='a' and (c in (1,3) or c>=5);
execute y2;
-- expect 1a1, 1a3, 1a5, 2a1, 4a1
prepare y3 from
select * from t010t2 where a in (1,2,4) and b='a' and c in (1,3);
execute y3;
-- expect 1a1, 1a3, 2a1, 4a1
prepare y4 from
delete from t010t2 where a in (2,4,6) and b='a' and c in (1,3);
execute y4;
-- expect 2 rows deleted, 2a1 and 4a1
execute y3;
-- expect 1a1, 1a3
insert into t010t2 values
(2, 'a', 1, '2a1'),
(4, 'a', 1, '4a1');
prepare y5 from
update t010t2 set d='uuu' where a=4 and b in ('a', 'b') and c < 2;
execute y5;
-- execute 2 rows updated, 4a1 and 4b1
select * from t010t2;
cqd HBASE_MAX_NUM_SEARCH_KEYS reset;
explain x1;
explain x2;
explain x3;
explain x4;
explain x5;
explain y1;
explain y2;
explain y3;
explain y4;
explain y5;
select "_SALT_", * from t010t3 order by a,b,c;
select "_SALT_", * from t010t3 where a=1 and b='c';
update t010t3 set d='2axu' where a=2 and b='a';
-- 2 rows updated
update t010t3 set d='4b1u' where a=4 and b='b' and c <= 1;
-- 1 row updated
update t010t3 set a=3 where a=2;
-- 3 rows updated
delete from t010t3 where a=3 and b='c' and c=3;
-- 1 row deleted
delete from t010t3 where d like '2%u %';
-- 2 rows deleted
select "_SALT_", * from t010t3;
-- 7 rows
merge into t010t3
using (select * from t010t2) as src
on ((src.a, src.b, src.c) = (a,b,c))
when matched
then update set d = src.d
when not matched
then insert values (src.a, src.b, src.c, src.d)
;
-- 10 rows updated
select "_SALT_", * from t010t2 natural join t010t3 order by a,b,c;
-- expect 10 rows, same as each individual table
select "_SALT_", * from table(table t010t3, partition number 4);
select "_SALT_", * from table(table t010t3, partition number from 1 to 3);
-- 2 statements above must return 10 rows total
?section testsWithForces
--------------------------------------------------------------------------
create table if not exists t010t1 (a int not null, b char(10), primary key(a));
create table if not exists t010t2 (a int not null, b char(10) not null, c int not null, d char(10), primary key(a,b,c));
create table if not exists t010t3 (a int not null, b char(10) not null, c int not null, d char(10), primary key(a,b,c))
salt using 4 partitions on (a,b);
invoke t010t1;
invoke hbase."_CELL_"."TRAFODION.SCH.T010T1";
invoke hbase."_ROW_"."TRAFODION.SCH.T010T1";
insert into t010t1 values (1, 'a'), (2, 'b'), (3, 'c');
select * from t010t1;
select * from t010t1 where a = 2;
select * from t010t1 where a = 2 or a = 3;
delete from t010t1 where a = 4;
select * from t010t1;
delete from t010t1 where a = 2;
select * from t010t1;
-------------------
-- check query plan
-------------------
-- no sort operator should present when order by on primary key column
prepare xx from select * from t010t1 order by a;
explain options 'f' xx;
-- should see a sort when order by on non key column
prepare xx from select * from t010t1 order by b;
explain options 'f' xx;
-- should see no sort operator when selecting from one salt bucket
prepare xx from select * from t010t3 where (a,b) = (1,'b') order by c;
explain options 'f' xx;
-- selectPred should present due to the 2nd disjunct b='1'
prepare xx from select * from t010t1 where a=1 or b='1';
explain xx;
-- Optimization: with only one disjunct, the selectPred should be empty
-- and the executor predicate should contain the non-key predicate
prepare xx from select * from t010t1 where a=1 and b='1';
explain xx;
-- should see a full hbase SCAN
prepare xx from select * from t010t1 where b='1';
explain xx;
-- should see a unique hbase GET
prepare xx from select * from t010t1 where a=1;
explain xx;
insert into t010t2 values
(1, 'a', 1, '1a1'),
(1, 'a', 3, '1a3'),
(1, 'a', 5, '1a5'),
(1, 'c', 1, '1c1'),
(2, 'a', 1, '2a1'),
(2, 'a', 2, '2a2'),
(2, 'c', 3, '2c3'),
(4, 'a', 1, '4a1'),
(4, 'b', 1, '4b1'),
(4, 'b', 2, '4b2');
insert into t010t3 select * from t010t2;
control query shape scan(table 'T010T2', mdam forced);
prepare x1 from
select * from t010t2 where a in (1,4) and b='a' and c = 1;
execute x1;
-- expect 1a1, 4a1
prepare x2 from
select * from t010t2 where a in (1,2,4) and b='a' and (c in (1,3) or c>=5);
execute x2;
-- expect 1a1, 1a3, 1a5, 2a1, 4a1
prepare x3 from
select * from t010t2 where a in (1,2,4) and b='a' and c in (1,3);
execute x3;
-- expect 1a1, 1a3, 2a1, 4a1
control query shape off;
control query shape nested_join(scan(path 'TRAFODION.SCH.T010T2', forward
, blocks_per_access 1 , mdam forced, mdam_columns all(sparse, sparse
, sparse)),anything);
prepare x4 from
delete from t010t2 where a in (2,4,6) and b='a' and c in (1,3);
execute x4;
-- expect 2 rows deleted, 2a1 and 4a1
control query shape off;
execute x3;
-- expect 1a1, 1a3
insert into t010t2 values
(2, 'a', 1, '2a1'),
(4, 'a', 1, '4a1');
prepare x5 from
update t010t2 set d='upd' where a=4 and b in ('a', 'b') and c < 2;
execute x5;
-- execute 2 rows updated, 4a1 and 4b1
select * from t010t2;
cqd HBASE_MAX_NUM_SEARCH_KEYS '1';
control query shape scan(table 'T010T2', mdam forced);
prepare y1 from
select * from t010t2 where a in (1,4) and b='a' and c = 1;
execute y1;
-- expect 1a1, 4a1
prepare y2 from
select * from t010t2 where a in (1,2,4) and b='a' and (c in (1,3) or c>=5);
execute y2;
-- expect 1a1, 1a3, 1a5, 2a1, 4a1
prepare y3 from
select * from t010t2 where a in (1,2,4) and b='a' and c in (1,3);
execute y3;
-- expect 1a1, 1a3, 2a1, 4a1
control query shape off;
control query shape nested_join(scan(path 'TRAFODION.SCH.T010T2', forward
, blocks_per_access 1 , mdam forced, mdam_columns all(sparse, sparse
, sparse)),anything);
prepare y4 from
delete from t010t2 where a in (2,4,6) and b='a' and c in (1,3);
execute y4;
-- expect 2 rows deleted, 2a1 and 4a1
control query shape off;
execute y3;
-- expect 1a1, 1a3
insert into t010t2 values
(2, 'a', 1, '2a1'),
(4, 'a', 1, '4a1');
prepare y5 from
update t010t2 set d='uuu' where a=4 and b in ('a', 'b') and c < 2;
execute y5;
-- execute 2 rows updated, 4a1 and 4b1
select * from t010t2;
cqd HBASE_MAX_NUM_SEARCH_KEYS reset;
explain x1;
explain x2;
explain x3;
explain x4;
explain x5;
explain y1;
explain y2;
explain y3;
explain y4;
explain y5;
select "_SALT_", * from t010t3 order by a,b,c;
select "_SALT_", * from t010t3 where a=1 and b='c';
update t010t3 set d='2axu' where a=2 and b='a';
-- 2 rows updated
update t010t3 set d='4b1u' where a=4 and b='b' and c <= 1;
-- 1 row updated
update t010t3 set a=3 where a=2;
-- 3 rows updated
delete from t010t3 where a=3 and b='c' and c=3;
-- 1 row deleted
delete from t010t3 where d like '2%u %';
-- 2 rows deleted
select "_SALT_", * from t010t3;
-- 7 rows
merge into t010t3
using (select * from t010t2) as src
on ((src.a, src.b, src.c) = (a,b,c))
when matched
then update set d = src.d
when not matched
then insert values (src.a, src.b, src.c, src.d)
;
-- 10 rows updated
select "_SALT_", * from t010t2 natural join t010t3 order by a,b,c;
-- expect 10 rows, same as each individual table
select "_SALT_", * from table(table t010t3, partition number 4);
select "_SALT_", * from table(table t010t3, partition number from 1 to 3);
-- 2 statements above must return 10 rows total
?section otherMdam
drop table if exists minotaur.events_load75;
create schema if not exists minotaur;
CREATE TABLE if not exists TRAFODION.MINOTAUR.EVENTS_LOAD75
(
SRCIP CHAR(45) CHARACTER SET ISO88591 COLLATE
DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
, SRCPORT INT NO DEFAULT NOT NULL NOT DROPPABLE
, DSTIP VARCHAR(45) CHARACTER SET ISO88591 COLLATE
DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
, DSTPORT INT NO DEFAULT NOT NULL NOT DROPPABLE
, AGENTRECEIPTTIME TIMESTAMP(0) NO DEFAULT NOT NULL NOT
DROPPABLE
, CATEGORYOUTCOME VARCHAR(30) CHARACTER SET ISO88591 COLLATE
DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
, CATEGORYSIGNIFICANCE VARCHAR(30) CHARACTER SET ISO88591 COLLATE
DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
, DEVICESEVERITY VARCHAR(30) CHARACTER SET ISO88591 COLLATE
DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
, CATEGORYDEVICETYPE VARCHAR(30) CHARACTER SET ISO88591 COLLATE
DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
, DEVICECUSTOMSTRING1 VARCHAR(30) CHARACTER SET ISO88591 COLLATE
DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
, FLEXSTRING1 VARCHAR(30) CHARACTER SET ISO88591 COLLATE
DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
, EVENT_ID LARGEINT NO DEFAULT NOT NULL NOT DROPPABLE
, PRIMARY KEY (EVENT_ID ASC,SRCIP ASC, AGENTRECEIPTTIME ASC)
)
SALT USING 75 PARTITIONS
hbase_options (blockcache = 'TRUE', TTL = '1000')
;
prepare s from
select * from minotaur.events_load75<<+ cardinality 10e6 >> where srcip = '120.120.120.1' and agentreceipttime = timestamp '2014-05-28 15:10:33';
execute s;
showddl TRAFODION.MINOTAUR.EVENTS_LOAD75;
drop table if exists t010t4;
create table t010t4 (a int not null primary key, b int, c int)
salt using 4 partitions ;
create index t010ix1 on t010t4 (b)
HBASE_OPTIONS
(
DATA_BLOCK_ENCODING = 'FAST_DIFF',
COMPRESSION = 'GZ'
)
SALT LIKE TABLE
;
showddl t010t4 ;
insert into t010t4 values (1,1,1) ;
prepare s from select a from t010t4 <<+cardinality 10e8>> where b > 0 ;
explain options 'f' s ;
execute s;
cqd detailed_statistics 'all';
prepare statsquery from
select frag_num, inst_num, seq_num,
cast(substring(variable_info
from position('AccessedRows' in variable_info)
for position('DiskIOs' in variable_info) -
position('AccessedRows' in variable_info))
as char(40) character set iso88591) as rows_accessed
from table(statistics(null, 'S'))
where tdb_name like 'EX_TRAF_%';
prepare statsquery1 from
select frag_num, inst_num, seq_num,
case when cast(substring(variable_info
from position('AccessedRows' in variable_info)+14
for position('UsedRows' in variable_info) -
position('AccessedRows' in variable_info)-14)
as integer) > 4000 then 'PASS' else 'FAIL' end
from table(statistics(null, 'S'))
where tdb_name like 'EX_TRAF_%'
order by 1,2,3;
drop table if exists t010t5;
create table T010t5(c1 numeric(12,2) not null,
c2 largeint not null,
c3 integer,
c4 char(1000),
primary key (c1, c2))
salt using 2 partitions ;
upsert using load into t010t5
select num*0.01, num, num, 'dummy'
from (select 1000*thousands+100*hundreds+10*tens+ones
from (values (0)) seed(c)
transpose 0,1,2,3,4,5,6,7,8,9 as ones
transpose 0,1,2,3,4,5,6,7,8,9 as tens
transpose 0,1,2,3,4,5,6,7,8,9 as hundreds
transpose 0,1,2,3,4,5,6,7,8,9 as thousands) gen(num)
order by 3
;
create index t010t5idx1 on t010t5(c3) salt like table ;
-- begin testcase for lp 1396793.
create index t010t5idx2 on t010t5(c2) no populate ;
create index t010t5idx3 on t010t5(c1) no populate ;
create index t010t5idx4 on t010t5(c3) no populate ;
populate index t010t5idx2 on t010t5;
populate index t010t5idx3 on t010t5;
populate index t010t5idx4 on t010t5;
set parserflags 1;
select count(*) from table(index_table t010t5idx2);
select count(*) from table(index_table t010t5idx3);
select count(*) from table(index_table t010t5idx4);
-- end testcase for lp 1396793.
set parserflags 1;
prepare s from
select count(*) as cnt, min(c1) minc1, max(c1) maxc1, min(c2) minc2, max(c2) maxc2 from table(index_table t010t5idx1 )a;
execute s;
execute statsquery1;
--use statsquery to see rows flowing through each ESP
--execute statsquery ;
cqd ALLOW_NULLABLE_UNIQUE_KEY_CONSTRAINT 'ON' ;
drop table if exists LOGITEM;
CREATE TABLE LOGITEM
(
D_GROUP VARCHAR(80 BYTES) CHARACTER SET UTF8
COLLATE DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
, L_ORDER_NO VARCHAR(30 BYTES) CHARACTER SET UTF8
COLLATE DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
, I_SLN VARCHAR(10 BYTES) CHARACTER SET UTF8
COLLATE DEFAULT DEFAULT NULL
, PRIMARY KEY (L_ORDER_NO ASC, I_SLN ASC)
)
SALT USING 16 PARTITIONS
HBASE_OPTIONS
(
DATA_BLOCK_ENCODING = 'FAST_DIFF',
COMPRESSION = 'GZ'
)
;
cqd hbase_hash2_partitioning 'off' ;
select * from logitem ;
-- showddl output should not show 'ACTUAL PARTITIONS'
-- Created and actual partitions are the same.
drop table if exists "delim_tab";
create table "delim_tab" (a int not null primary key) salt using 4 partitions;
showddl "delim_tab";
create volatile table vtab1 (a int);
create volatile table vtab2 (a int);
get all volatile schemas;
get all volatile tables;