--
--   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.
--
--
-- this test shows the current supported char, varchar, and long varchar
-- functionality
--


-- create a table with null and non-null char columns of different lengths
create table ct (c1 char, c2 char(5) not null, c3 char(30) default null);

-- insert some rows

-- first, try values that fill each column with non-blanks
insert into ct values ('1', '11111', '111111111111111111111111111111');

-- now try some values that are shorter than the columns
insert into ct values ('', '22', '222');

-- now try some values that are longer than the columns, where the excess
-- characters are blanks
insert into ct values ('3         ', '33333      ', '333333333333333333333333333333          ');

-- now try some values that are longer than the columns, where the excess
-- characters are non-blanks.  These should get errors
insert into ct values ('44', '4', '4');
insert into ct values ('5', '555555', '5');
insert into ct values ('6', '66666', '6666666666666666666666666666666');

-- now try inserting some nulls, first in columns that accept them
insert into ct values (null, '77777', null);

-- now try inserting nulls into columns that don't accept them
insert into ct values ('8', null, '8');

-- now check the rows that made it into the table successfully
select * from ct;

-- now try the char_length function on the columns
select {fn length(c1)}, {fn length(c2)}, {fn length(c3)} from ct;

-- now create a table with varchar columns
create table vt (c1 varchar(1), c2 varchar(5) not null, c3 varchar(30) default null);

-- insert some rows

-- first, try values that fill each column with non-blanks
insert into vt values ('1', '11111', '111111111111111111111111111111');

-- now try some values that are shorter than the columns
insert into vt values ('', '22', '222');

-- now try some values that are longer than the columns, where the excess
-- characters are blanks
insert into vt values ('3         ', '33333      ', '333333333333333333333333333333          ');

-- now try some values that are longer than the columns, where the excess
-- characters are non-blanks.  These should get errors
insert into vt values ('44', '4', '4');
insert into vt values ('5', '555555', '5');
insert into vt values ('6', '66666', '6666666666666666666666666666666');

-- now try inserting some nulls, first in columns that accept them
insert into vt values (null, '77777', null);

-- now try inserting nulls into columns that don't accept them
insert into vt values ('8', null, '8');

-- now check the rows that made it into the table successfully
select * from vt;

-- now try the char_length function on the columns
select {fn length(c1)}, {fn length(c2)}, {fn length(c3)} from vt;

-- now create a table with long varchar columns
create table lvt (c1 long varchar, c2 long varchar not null, c3 long varchar default null);

-- insert some rows
-- first, some short values
insert into lvt values ('1', '11', '111');

-- now some values with trailing blanks (which should be preserved)
insert into lvt values ('2 ', '22  ', '222   ');

-- now some long values
insert into lvt values (
'3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333',
'333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333',
'33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333');

-- now try inserting nulls into columns that accept them
insert into lvt values (null, '4444', null);

-- now try inserting nulls into columns that do not accept them
insert into lvt values ('5', null, '55555');

-- now check the rows that made it into the table successfully
select * from lvt;

-- now try the char_length function on the columns
select {fn length(c1)}, {fn length(c2)}, {fn length(c3)} from lvt;

-- insert-select from varchar columns into char columns
insert into ct select * from vt;
select * from ct;

-- insert-select from char columns into varchar columns
insert into vt select * from ct;
select * from vt;

-- insert-select from varchar columns into char columns with truncation errors
insert into ct select c3, c2, c1 from vt;
select * from ct;

-- insert-select from char columns into varchar columns with truncation errors
insert into vt select c3, c2, c1 from ct;
select * from vt;

-- insert-select from char columns into long varchar columns
insert into lvt select * from ct;
select * from lvt;

-- insert-select from varchar columns into long varchar columns
insert into lvt select * from vt;
select * from lvt;

-- insert-select from long varchar columns into char columns with trunc. errors
insert into ct select * from lvt;
select * from ct;

-- insert-select from long varchar columns into char columns without trunc errs
insert into ct select * from lvt where cast(substr(c1,1,30) as varchar(30)) = '1' or cast(substr(c1,1,30) as varchar(30)) = '2';
select * from ct;

-- insert-select from long varchar columns into varchar columns with trunc. errs
insert into vt select * from lvt;
select * from vt;

-- insert-select from long varchar columns into varchar cols without trunc errs
insert into vt select * from lvt where cast(substr(c1,1,30) as varchar(30)) = '1' or cast(substr(c1,1,30) as varchar(30)) = '2';
select * from vt;

-- Now try insert-select with type conversion where column lengths don't match
-- but there are no truncation errors.  Need new tables for this.
create table ct2 (c1 char(5), c2 char(10));
insert into ct2 values ('111', '111');

create table vt2 (c1 varchar(5), c2 varchar(10));
insert into vt2 values ('222', '222');

create table lvt2 (c1 long varchar, c2 long varchar);
insert into lvt2 values ('333', '333');

insert into ct2 select * from vt2;
insert into ct2 select * from lvt2;
select * from ct2;

insert into vt2 select * from ct2;
insert into vt2 select * from lvt2;
select * from vt2;

insert into lvt2 select * from ct2;
insert into lvt2 select * from vt2;
select * from lvt2;

-- Now try string constants that contain the ' character
delete from vt;

insert into vt values ('''', '12''34', '123''456''''''789');

-- RESOLVE: Would like to do a test of non-terminated string (i.e. string
-- ending with ''), like this:
--
-- insert into vt values ('1', '12345', '12345'');
--
-- However, the unterminated string confuses the ij parser.  ij has to know
-- where string boundaries are, so it can tell whether the ; is a terminator
-- or a character in the string.  So, this test won't work with ij, because
-- it will think the ; is just a character inside the string.
--
-- This test could be done from within a java program, but it would take
-- a fair amount of work for the benefit.

select * from vt;

-- Try creating a column with an illegal length
create table badtab (x char(10.2));

create table badtab2 (x varchar(0));

create table badtab3 (x long varchar(3));

-- JDBC escape syntax for string functions
create table trash(c1 char(10));
insert into trash values 'asdf', 'asdfasdf';
select {fn length(c1)}, length(c1) from trash;
drop table trash;

--- Test for really big literals. Throw an error for now. beetle 2758

CREATE TABLE "LVC"
(
	"LV"     		long varchar
);

INSERT INTO LVC VALUES ('[encoded data, 301464 characters]');

drop table lvc;


