-- Test: TEST130 (Executor)
-- @@@ 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 @@@
--
-- Functionality: LOBs
-- Expected files: EXPECTED130
-- Table created: 
-- Limitations: 
-- 
-- To Do:   
--      
-- Revision history:
--     (10/21/2014) - Created.
-- 




?section clnup
set schema trafodion.lob130;
drop table t130lob1 cascade;
drop table t130lob2 cascade;
drop table t130lob3 cascade;
drop table t130lob4 cascade;
drop table t130lob5 cascade;
drop table tlob130ext cascade;
drop table t130char cascade;
drop table t130var cascade;
drop external table if exists date_dim for hive.hive.date_dim;

?section setup
log LOG130 clear;
log;
drop schema trafodion.lob130 cascade;
log LOG130;
create schema trafodion.lob130;
set schema trafodion.lob130;
create table t130lob1 (c1 blob);
create table t130lob2 (c1 int not null, c2 blob , primary key (c1));
create table t130lob3 (c1 int not null,
c2 blob, c3 blob, primary key (c1));
create table t130lob4 (c1 int not null,
c2 char(10), c3 clob, primary key (c1));
create table t130char(c1 int not null, c2 char (20), primary key (c1));
create table t130var(c1 int not null, c2 varchar(100), primary key (c1));
create external table date_dim
  (d_date_sk int, d_date_id varchar(100 bytes) character set utf8, d_date date)
  for hive.hive.date_dim;

?section dml_insert
insert into t130lob1 values(NULL);
select * from t130lob1;

insert into t130lob2 values(1,stringtolob('inserted row11'));
insert into t130lob2 values(2,stringtolob('inserted row12'));
insert into t130lob2 values(3,stringtolob('inserted row13'));
insert into t130lob2 values(3,stringtolob('xxxx'));
select * from t130lob2;


select lobtostring(c2,10) from t130lob2;
select lobtostring(c2,2) from t130lob2;
select c1,lobtostring(c2,100) from t130lob2;

delete from t130lob2;
--test insert with param (assumes that caller will pass in string format.)
prepare s from insert into t130lob2 values (1, ?);
execute s using 'fgfgfhfhfhfhhfhfhfhjfkkfkffllflflfll';
select lobtostring(c2,50) from t130lob2;

--negative test for values tuple list
prepare s from insert into t130lob2 values (1,'gg'),(2,'hh');
prepare s from insert into t130lob2 values (1,stringtolob('hh')),(2,stringtolob('gg'));

--test update with param 
prepare s from update t130lob2 set c2=? where c1 =1;
execute s using 'xyxyxyxyxyxyx';
select lobtostring(c2,50) from t130lob2;

--test insert select from a source char column to lob
delete from t130lob2;
insert into t130char values (1,'fixed char 1'),(2,'fixed char 2'),(3,'fixed char 3');
insert into t130lob2(c1,c2) select c1,c2 from t130char;
select lobtostring(c2,50) from t130lob2;

--test insert select from a source varchar column to lob
delete from t130lob2;
insert into t130var values (1,'var char 1'),(2,'var char 22222222222222222222222'),(3,'var char 33333333333333333333333333333333333333333333333333333');
insert into t130lob2(c1,c2) select c1,c2 from t130var;
select lobtostring(c2,100) from t130lob2;

--insert select from a source lob column to a target varchar column.
delete from t130var;
insert into t130var select c1, lobtostring(c2,100) from t130lob2;
delete from t130var;
----negative case
insert into t130var select c1,c2 from t130lob2;
delete from t130var;
delete from t130lob2;

--test insert select from a source hive varchar column to lob
delete from t130lob2;
insert into t130lob2 select [first 10] d_date_sk,d_date_id from hive.hive.date_dim;
select lobtostring(c2,4) from t130lob2 order by c1;
delete from t130lob2;


--insert select from a source lob column to a target lob column
delete from t130lob3;
insert into t130lob2 values(1,stringtolob('inserted row11'));
insert into t130lob2 values(2,stringtolob('inserted row12'));
insert into t130lob2 values(3,stringtolob('inserted row13'));
insert into t130lob3 select c1,c2,c2 from t130lob2;
select c1, lobtostring(c2,100),lobtostring(c3,100) from t130lob3;
delete from t130lob3;
delete from t130lob2;




--test values clause
values((select * from t130lob1));

--test empty_blob(), empty_clob()
delete from t130lob2;
insert into t130lob2 values(0,stringtolob('inserted row10'));
insert into t130lob2 values (1, empty_blob());
select lobtostring(c2,10) from t130lob2;
delete from t130lob2;
insert into t130lob2 values(0,stringtolob('inserted row10'));
insert into t130lob2 values (1, empty_clob());
select lobtostring(c2,10) from t130lob2;
update t130lob2 set c2=stringtolob('inserted row11');
select lobtostring(c2,30) from t130lob2;
update t130lob2 set c2=empty_blob();
select lobtostring(c2,10) from t130lob2;
update t130lob2 set c2=stringtolob('inserted row11',append);
select lobtostring(c2,30) from t130lob2;
update t130lob2 set c2=stringtolob('more inserted row11',append);
select lobtostring(c2,50) from t130lob2;
update t130lob2 set c2=empty_blob();
select lobtostring(c2,10) from t130lob2;

?section dml_join
insert into t130lob3 values (1,stringtolob('inserted row21a'),stringtolob('inserted row21b'));
insert into t130lob3 values (2,stringtolob('inserted row22a'),stringtolob('inserted row22b'));
insert into t130lob3 values (3,stringtolob('inserted row23a'),stringtolob('inserted row23b'));
insert into t130lob3 values (4,stringtolob('inserted row24a'),stringtolob('inserted row24b'));

prepare s from 
select c1, lobtostring(c2,25), lobtostring(c3,25)  from t130lob3;



select lobtostring(t130lob2.c2,30) from t130lob2, t130lob3 where t130lob2.c1 = t130lob3.c1;

values (filetolob('./myfile.txt'));
values( stringtolob('xxxxxx'));

?section dml_update

update t130lob2 set c2=stringtolob('updated c2 in all rows');
select c1, lobtostring(c2,30) from t130lob2;

update t130lob2 set c2=stringtolob('updated row21a') where c1=1;
select c1, lobtostring(c2,30) from t130lob2;
select c1, lobtostring(c2,30) from t130lob2 where c1=1;


?section dml_update_append

update t130lob2 set c2=stringtolob('appended row21a',append) where c1=1;
select c1, lobtostring(c2,100) from t130lob2;
select c1, lobtostring(c2,100) from t130lob2 where c1=1;

update t130lob2 set c2=stringtolob(' appended c2 to all rows',append);
select c1, lobtostring(c2,60) from t130lob2;

?section dml_delete

delete from t130lob3 where c1=1;
select c1, lobtostring(c2,30), lobtostring(c3,30)  from t130lob3;

delete from t130lob2 ;
select * from t130lob2;

?section update_stats

-- positive tests; LOB columns should be silently skipped
update statistics for table t130lob1 on every column;

update statistics for table t130lob4 on c1 to c2;

-- negative tests; attempts to explicitly create stats on LOB
-- columns should fail with error 9246
update statistics for table t130lob4 on c3;

update statistics for table t130lob2 on (c1,c2);

update statistics for table t130lob4 on c2 to c3;

log;
obey TEST130(clnup);


sh echo "Test for file input and extract";
-- Test for local input

--cleanup -- comment the following lines out if you want to debug this test and save intermediate files.

?section lob_local_cleanup
log;
drop table tlob130txt1; 
drop table tlob130bin1;
drop table tlob130_limit50;
sh rm TMP130;
sh rm tlob130txt1;
sh rm tlob130_txt1.txt;
sh rm tlob130_deep.jpg;
sh rm tlob130_anoush.jpg;


?section lob_local_file
log LOG130;
--setup
sh echo "Test for file input and extract";
create table tlob130txt1 (c1 int not null, c2 clob, primary key (c1));
create table tlob130bin1 (c1 int not null, c2 blob, primary key (c1));
create table tlob130txt_limit50(c1 int not null, c2 clob(50), primary key (c1));
create table tlob130bin_limit1K(c1 int not null, c2 blob(1 K), primary key (c1));

sh cp $scriptsdir/executor/deep.jpg $rundir/executor/;
sh cp $scriptsdir/executor/anoush.jpg $rundir/executor/;
sh cp $scriptsdir/executor/lob_input_* $rundir/executor/;
sh cp $scriptsdir/executor/TEST130_argfile* $rundir/executor/;

-- inserts
-- first line
insert into tlob130txt1 values (1, filetolob('lob_input_a1.txt'));

-- second line
insert into tlob130txt1 values (2, filetolob('lob_input_b1.txt'));

-- third line
insert into tlob130txt1 values (3, filetolob('lob_input_c1.txt'));

select lobtostring(c2, 40 ) from tlob130txt1;

--updates

--should update with full poem
update tlob130txt1 set c2=filetolob('lob_input_d1.txt', append) where c1 = 3;

select lobtostring(c2, 200 ) from tlob130txt1;

-- should see wrong text in the last few lines
update tlob130txt1 set c2=filetolob('lob_input_e1.txt') where c1 =3 ;

select lobtostring(c2, 200 ) from tlob130txt1;

--delete

-- go back to having just the first  line. 
delete from tlob130txt1 where c1 =2;
delete from tlob130txt1 where c1 =3;

--test limits

insert into tlob130txt_limit50 values(1,filetolob('lob_input_e1.txt'));
insert into tlob130bin_limit1K values(1,filetolob('anoush.jpg'));
--test extract 

log;
log TMP130 clear;
select c2 from tlob130txt1;
log;

log LOG130;
sh rm t130_extract_command;

sh grep "^LOBH" TMP130 | sed "s/^/extract lobtofile(LOB '/g" | sed "s/$/' , 'tlob130_txt1.txt');/g" >> t130_extract_command;

obey t130_extract_command;

--binary input/update

insert into tlob130bin1 values (1 , filetolob('deep.jpg'));
--extract // should have a viewable picture file

log;
log TMP130 clear;
select c2 from tlob130bin1;
log;

log LOG130;
sh rm t130_extract_command;
sh grep "^LOBH" TMP130 | sed "s/^/extract lobtofile(LOB '/g" | sed "s/$/' , 'tlob130_deep.jpg');/g" >> t130_extract_command;
obey t130_extract_command;

update tlob130bin1 set c2=filetolob('anoush.jpg') ;

--extract into a different file // should have a different viewable picture.

log;
log TMP130 clear ;
select c2 from tlob130bin1;
log;

log LOG130;
sh rm t130_extract_command;
sh grep "^LOBH" TMP130 | sed "s/^/extract lobtofile(LOB '/g" | sed "s/$/' , 'tlob130_anoush.jpg');/g" >> t130_extract_command;

obey t130_extract_command;




-- Test for hdfs input
--cleanup -- comment the following lines out if you want to debug this test and save intermediate files.

?section lob_hdfs_cleanup
log;
drop table tlob130txt2; 
drop table tlob130bin2;
sh rm TMP130;
sh rm tlob130txt2;
sh rm tlob130_txt2.txt;
sh regrhadoop.ksh fs -rm /user/trafodion/lobs/tlob130_deep.jpg;
sh regrhadoop.ksh fs -rm /user/trafodion/lobs/tlob130_anoush.jpg;
sh regrhadoop.ksh fs -rm /user/trafodion/lobs/tlob130_txt2.txt;


?section lob_hdfs_file
log LOG130;
create table tlob130txt2 (c1 int not null, c2 clob, primary key (c1));
create table tlob130bin2 (c1 int not null, c2 blob, primary key (c1));

sh regrhadoop.ksh fs -copyFromLocal lob_input_a1.txt /user/trafodion/lobs/lob_input_a1.txt;
sh regrhadoop.ksh fs -copyFromLocal lob_input_b1.txt /user/trafodion/lobs/lob_input_b1.txt;
sh regrhadoop.ksh fs -copyFromLocal lob_input_c1.txt /user/trafodion/lobs/lob_input_c1.txt;
sh regrhadoop.ksh fs -copyFromLocal lob_input_d1.txt /user/trafodion/lobs/lob_input_d1.txt;
sh regrhadoop.ksh fs -copyFromLocal lob_input_e1.txt /user/trafodion/lobs/lob_input_e1.txt;
sh regrhadoop.ksh fs -copyFromLocal deep.jpg /user/trafodion/lobs/deep.jpg;
sh regrhadoop.ksh fs -copyFromLocal anoush.jpg /user/trafodion/lobs/anoush.jpg;
-- the next one is a really long file name intended to test error message 8557
sh regrhadoop.ksh fs -copyFromLocal lob_input_a1.txt /user/trafodion/lobs/reallyLongDirectoryName0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/lob_input_a1012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.txt;
sh sleep(20);


insert into tlob130txt2 values (1, filetolob('hdfs:///user/trafodion/lobs/lob_input_a1.txt'));

-- second line
insert into tlob130txt2 values (2, filetolob('hdfs:///user/trafodion/lobs/lob_input_b1.txt'));

-- third line
insert into tlob130txt2 values (3, filetolob('hdfs:///user/trafodion/lobs/lob_input_c1.txt'));
select lobtostring(c2, 40 ) from tlob130txt2;

--updates

--should update with full poem
update tlob130txt2 set c2=filetolob('hdfs:///user/trafodion/lobs/lob_input_d1.txt', append) where c1 = 3;
select lobtostring(c2, 200 ) from tlob130txt2;

-- should see wrong text in the last few lines
update tlob130txt2 set c2=filetolob('hdfs:///user/trafodion/lobs/lob_input_e1.txt') where c1 =3 ;
select lobtostring(c2, 200 ) from tlob130txt2;

--delete

 
-- go back to having just the first  line. 
delete from tlob130txt2 where c1 =2;
delete from tlob130txt2 where c1 =3;
-- test extract 

log;
log TMP130 clear;
select c2 from tlob130txt2;
log;

log LOG130;
sh rm t130_extract_command;

sh grep "^LOBH" TMP130 | sed "s/^/extract lobtofile(LOB '/g" | sed "s/$/' , 'hdfs:\/\/\/user\/trafodion\/lobs\/tlob130_txt2.txt');/g" >> t130_extract_command;
obey t130_extract_command;

--binary input/update

insert into tlob130bin2 values (1 , filetolob('deep.jpg'));
--extract // should have a viewable picture file

log;
log TMP130 clear ;
select c2 from tlob130bin2;
log;

log LOG130;
sh rm t130_extract_command;
sh grep "^LOBH" TMP130 | sed "s/^/extract lobtofile(LOB '/g" | sed "s/$/' , 'hdfs:\/\/\/user\/trafodion\/lobs\/tlob130_deep.jpg');/g" >> t130_extract_command;
obey t130_extract_command;

update tlob130bin2 set c2=filetolob('anoush.jpg') ;

--extract into a different file // should have a different viewable picture.

log;
log TMP130 clear;
select c2 from tlob130bin1;
log;

log LOG130;
sh rm t130_extract_command;
sh grep "^LOBH" TMP130 | sed "s/^/extract lobtofile(LOB '/g" | sed "s/$/' , 'hdfs:\/\/\/user\/trafodion\/lobs\/tlob130_anoush.jpg');/g" >> t130_extract_command;

obey t130_extract_command;


sh clitestdriver 2 < TEST130_argfile 2>&1 | tee -a LOG130;



------------------------------------------------------------------------------

?section lob_misc_cleanup
log;
drop table tlob130txt3;
drop table tlob130bin3;
drop table tlob130bt;
sh rm tlob130_deep2.jpg;
sh rm tlob130_txt1.txt;
sh regrhadoop.ksh fs -rm /user/trafodion/lobs/tlob130_anoush2.jpg;
sh rm tlob130_anoush3.jpg;


?section lob_miscfile_test
log LOG130;
-- 2 clob columns
create table tlob130txt3 (c1 int not null, c2 int, c3 clob, c4 clob, primary key (c1));
insert into tlob130txt3 values (1, 1,filetolob('lob_input_a1.txt'), filetolob('lob_input_b1.txt'));
insert into tlob130txt3 values (2, 2,filetolob('lob_input_c1.txt'), filetolob('lob_input_d1.txt'));
select lobtostring(c3,100), lobtostring(c4,100)from tlob130txt3;

-- 2 blob columns
create table tlob130bin3 (c1 int not null, c2 int, c3 blob, c4 blob, primary key (c1));
insert into tlob130bin3 values (1, 1, filetolob('deep.jpg'), filetolob('anoush.jpg'));

log;
log TMP130 clear;
select c3 from tlob130bin3;
log;

log LOG130;
sh rm t130_extract_command;
sh grep "^LOBH" TMP130 | sed "s/^/extract lobtofile(LOB '/g" | sed "s/$/' , 'tlob130_deep2.jpg');/g" >> t130_extract_command;
obey t130_extract_command;

log;
log TMP130 clear;
select c4 from tlob130bin3;
log;

log LOG130;
sh rm t130_extract_command;
sh grep "^LOBH" TMP130 | sed "s/^/extract lobtofile(LOB '/g" | sed "s/$/' , 'hdfs:\/\/\/user\/trafodion\/lobs\/tlob130_anoush2.jpg');/g" >> t130_extract_command;
obey t130_extract_command;

-- combination blob and clob columns
create table tlob130bt (c1 int not null, c2 int, c3 blob, c4 clob, primary key (c1));
insert into tlob130bt values (1,1, filetolob('lob_input_a1.txt'), filetolob('anoush.jpg'));

select lobtostring(c3,40) from tlob130bt;

log;
log TMP130 clear;
select c4 from tlob130bt;
log;

log LOG130;
sh rm t130_extract_command;
sh grep "^LOBH" TMP130 | sed "s/^/extract lobtofile(LOB '/g" | sed "s/$/' , 'tlob130_anoush3.jpg',create,truncate);/g" >> t130_extract_command;
obey t130_extract_command;

--test alter 
alter table tlob130bt add column c5 blob;
--should show default value NULL
select c5 from tlob130bt; 

?section lob_gc_cleanup
log;
drop table tlob130gc;

?section lob_gc_test
log LOG130;
create table tlob130gc (c1 int not null, c2 blob, c3 blob, primary key (c1));
--insert a few rows
insert into tlob130gc values (1, stringtolob('aaaa'), stringtolob('bbbbb'));
insert into tlob130gc values (2, stringtolob('aaaa'), stringtolob('bbbbb'));
insert into tlob130gc values (3, stringtolob('aaaa'), stringtolob('bbbbb'));
insert into tlob130gc values (4, stringtolob('aaaa'), stringtolob('bbbbb'));
insert into tlob130gc values (5, stringtolob('aaaa'), stringtolob('bbbbb'));
insert into tlob130gc values (6, stringtolob('aaaa'), stringtolob('bbbbb'));
insert into tlob130gc values (7, stringtolob('aaaa'), stringtolob('bbbbb'));
insert into tlob130gc values (8, stringtolob('aaaa'), stringtolob('bbbbb'));
--create holes in the lob data file
delete from tlob130gc where c1=2;
delete from tlob130gc where c1=6;
update tlob130gc set c2=stringtolob('xxxx')where c1=7;
--check contents of table
select c1,lobtostring(c2,10),lobtostring(c3,10) from tlob130gc;
cqd LOB_GC_LIMIT_SIZE '0';
--this next insert should trigger a GC
insert into tlob130gc values(9,stringtolob('aaaa'), stringtolob('bbbbb'));
--check contents of table. Should have one extra row compared to above select
select c1,lobtostring(c2,10),lobtostring(c3,10) from tlob130gc;
cqd LOB_GC_LIMIT_SIZE reset;

?section lob_get_cleanup
log;
drop table tlob130gt;

?section lob_get_test
log LOG130;
create table tlob130gt (c1 int not null, c2 blob, c3 clob, c4 blob, primary key (c1));
create table tlob130gt2 (c1 int not null, c2 blob, c3 clob, c4 blob storage 'external', primary key (c1));
get lob stats for table tlob130gt2;
select * from table(lob stats(tlob130gt2));
insert into tlob130gt values (1, stringtolob('xxxx'), stringtolob('yyyy'), stringtolob('zzzzzzzzzzzzzz'));
insert into tlob130gt values (2, stringtolob('xxxxx'), stringtolob('yyyyy'), stringtolob('zzzzzzzzzzzzzzz'));
insert into tlob130gt values (3, stringtolob('xxxxxx'), stringtolob('yyyyyy'), stringtolob('zzzzzzzzzzzzzzzz'));
get lob stats for table tlob130gt;
select * from table(lob stats(tlob130gt));
delete from tlob130gt where c1=2;
insert into tlob130gt values (2, stringtolob('xxxxxxxxxxxxxxx'), stringtolob('yyyyyyyyyyyyyyyy'), stringtolob('zzzzzzzzzzzzzzzzzzzzzzzzzz'));
get lob stats for table tlob130gt;
select * from table(lob stats(tlob130gt));

?section lob_external
--test external lobs
create table tlob130ext (c1 int not null, c2 blob, c3 clob, c4 blob storage 'external', primary key (c1));

create table tlob130ext2 (c1 int not null, c2 blob, c3 clob, c4 blob storage 'external', primary key (c1));
create table tlob130_not_external (c1 int not null , c2 blob, c3 blob, c4 blob, primary key (c1));
insert into tlob130ext values(1, stringtolob('first lob'), filetolob('hdfs:///user/trafodion/lobs/lob_input_a1.txt'),externaltolob('hdfs:///user/trafodion/lobs/lob_input_a1.txt'));
insert into tlob130ext values(2, stringtolob('second lob'), filetolob('hdfs:///user/trafodion/lobs/lob_input_b1.txt'),externaltolob('hdfs:///user/trafodion/lobs/lob_input_b1.txt'));
insert into tlob130ext values(3, stringtolob('third lob'), filetolob('hdfs:///user/trafodion/lobs/lob_input_c1.txt'),externaltolob('hdfs:///user/trafodion/lobs/lob_input_c1.txt'));


log;
log TMP130 clear;
select c3 from tlob130ext where c1=3;
log;

log LOG130;
sh rm t130_extract_command;
sh grep "^LOBH" TMP130 | sed "s/^/extract name(LOB '/g" | sed "s/$/');/g" >> t130_extract_command;
obey t130_extract_command;
sh rm t130_extract_command;
sh grep "^LOBH" TMP130 | sed "s/^/extract offset(LOB '/g" | sed "s/$/');/g" >> t130_extract_command;
obey t130_extract_command;




--negative cases
insert into tlob130ext values(2, externaltolob('first lob'), filetolob('hdfs:///user/trafodion/lobs/lob_input_a1.txt'),externaltolob('hdfs:///user/trafodion/lobs/lob_input_a1.txt'));
insert into tlob130ext values(3, stringtolob('first lob'), filetolob('hdfs:///user/trafodion/lobs/lob_input_a1.txt'),filetolob('hdfs:///user/trafodion/lobs/lob_input_a1.txt'));
update tlob130ext set c4=stringtolob('hdfs:///user/trafodion/lobs/lob_input_a1.txt', append) where c1=1;
update tlob130ext set c4=externaltolob('hdfs:///user/trafodion/lobs/lob_input_a1.txt', append) where c1=1;
update tlob130ext set c3=externaltolob('hdfs:///user/trafodion/lobs/lob_input_b1.txt') where c1=1;
update tlob130ext set c4=stringtolob('cannot allow this') where c1=1;
delete from tlob130ext where c1=1;
insert into tlob130ext values(1, stringtolob('first lob'),externaltolob('hdfs:///user/trafodion/lobs/lob_input_a1.txt'),externaltolob('hdfs:///user/trafodion/lobs/lob_input_a1.txt'));
insert into tlob130ext values(1, stringtolob('first lob'), filetolob('hdfs:///user/trafodion/lobs/lob_input_a1.txt'),externaltolob('hdfs:///user/trafodion/lobs/lob_input_a1.txt'));
-- the next one should see error 8557
insert into tlob130ext values(1, stringtolob('first lob'), filetolob('hdfs:///user/trafodion/lobs/lob_input_a1.txt'),
externaltolob('hdfs:///user/trafodion/lobs/reallyLongDirectoryName0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/lob_input_a1012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.txt'));

select lobtostring(c2,50),lobtostring(c3,50),lobtostring(c4,50) from tlob130ext;
update tlob130ext set c3=stringtolob('can allow this') where c1=1;
select lobtostring(c2,50),lobtostring(c3,50),lobtostring(c4,50) from tlob130ext;



update tlob130ext set c4=externaltolob('hdfs:///user/trafodion/lobs/lob_input_d1.txt') where c1=2;
select lobtostring(c2,50),lobtostring(c3,50),lobtostring(c4,50) from tlob130ext;


update tlob130ext set c2=filetolob('hdfs:///user/trafodion/lobs/lob_input_b1.txt') where c1=2;
select lobtostring(c2,50),lobtostring(c3,50),lobtostring(c3,50) from tlob130ext;
get lob stats for table tlob130ext;
select * from table(lob stats(tlob130ext));
sh clitestdriver 2 < TEST130_argfile2 2>&1 | tee -a LOG130;
sh cat lobc4ext.txt |tee -a LOG130;

--insert select from a source external lob column to a target external lob column
select lobtostring(c2,50),lobtostring(c3,50),lobtostring(c3,50) from tlob130ext;
insert into tlob130ext2 select * from tlob130ext;
select lobtostring(c2,50),lobtostring(c3,50),lobtostring(c3,50) from tlob130ext2;
----negative test
insert into tlob130_not_external select * from tlob130ext; 

?section update_lob_handle
-- test lob update via "update lob" command
log;
drop table t130lob5;
create table t130lob5 (c1 int not null, c2 blob , primary key (c1));
log LOG130;
delete from t130lob5;
insert into t130lob5 values (1,empty_blob());
sh clitestdriver 6 < TEST130_argfile3 2>&1 | tee -a LOG130;
select lobtostring(c2,20) from t130lob5;
sh clitestdriver 7 < TEST130_argfile3 2>&1 | tee -a LOG130;
select lobtostring(c2,40) from t130lob5;
sh clitestdriver 8 < TEST130_argfile3 2>&1 | tee -a LOG130;
select lobtostring(c2,20) from t130lob5;
sh clitestdriver 6 < TEST130_argfile3 2>&1 | tee -a LOG130;
select lobtostring(c2,40) from t130lob5;
delete from t130lob5;


-- test_empty_blob() with external tables
delete from tlob130ext;
-- following empty_blob will be of type 'external'
insert into tlob130ext values(1,empty_blob(),empty_clob(),empty_blob());
select c2 from tlob130ext;
-- following should return error since only external lobs will be allowed
update tlob130ext set c4=stringtolob('gggg'); 
-- following should work. 
update tlob130ext set c4=externaltolob('hdfs:///user/trafodion/lobs/lob_input_b1.txt');
delete from tlob130ext;

-- test to ensure all lob dependent tables and schemas containing lob tables
-- get dropped cleanly.

?section lob_drop_table_schema
log;
cleanup schema trafodion.lobsch;
log LOG130;
create schema trafodion.lobsch;
set schema trafodion.lobsch;
create table tlob130ts1 (c1 int not null, c2 blob, primary key (c1));
create table tlob130ts2 (c1 int not null, c2 blob, primary key (c1));
drop table tlob130ts1;
get tables;
drop schema trafodion.lobsch cascade;
select OBJECT_NAME,OBJECT_TYPE from TRAFODION."_MD_".OBJECTS where catalog_name='TRAFODION' AND schema_name='LOBSCH';
--go back to the schema used for the rest of the tests.
set schema trafodion.lob130;


-- cleanup
?section lob_general_cleanup
log;
sh rm t130_*;
sh regrhadoop.ksh fs -rm /user/trafodion/lobs/tlob130*
sh regrhadoop.ksh fs -rm /user/trafodion/lobs/lobinput_a1.txt
sh regrhadoop.ksh fs -rm /user/trafodion/lobs/lobinput_b1.txt
sh regrhadoop.ksh fs -rm /user/trafodion/lobs/lobinput_c1.txt
sh regrhadoop.ksh fs -rm /user/trafodion/lobs/lobinput_d1.txt
sh regrhadoop.ksh fs -rm /user/trafodion/lobs/lobinput_e1.txt
sh regrhadoop.ksh fs -rm /user/trafodion/lobs/reallyLongDirectoryName0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/lob_input_a1012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.txt;
sh rm lobinput_*;
sh rm deep.jpg;
sh rm anoush.jpg;
drop table tlob130txt1; 
drop table tlob130bin1;
drop table tlob130txt_limit50;
drop table tlob130bin_limit1K;
sh rm TMP130;
sh rm tlob130txt1;

sh rm tlob130_txt*.txt;
sh rm tlob130_deep*.jpg;
sh rm tlob130_anoush*.jpg;
drop table tlob130txt3;
drop table tlob130bin3;
drop table tlob130bt;
drop table tlob130txt2;
drop table tlob130bin2; 
drop table tlob130ext;
drop table tlob130ext2;
sh rm TMP130;
sh rm tlob130txt2;
sh rm lobc2out.jpg;
sh rm lobc4ext.txt;
sh rm TEST130_argfile*;
drop table tlob130gc;
drop table tlob130gt;
drop table tlob130t5;
drop table tlob130_not_external;
drop external table if exists date_dim for hive.hive.date_dim;
drop schema trafodion.lob130 cascade;


exit;





