###########################################################################
#
# Cleanup.
#
###########################################################################

--disable_warnings

# Drop stored routines (if any) for general SP-vars test cases. These routines
# are created in include/sp-vars.inc file.

DROP PROCEDURE IF EXISTS sp_vars_check_dflt;
DROP PROCEDURE IF EXISTS sp_vars_check_assignment;
DROP FUNCTION IF EXISTS sp_vars_check_ret1;
DROP FUNCTION IF EXISTS sp_vars_check_ret2;
DROP FUNCTION IF EXISTS sp_vars_check_ret3;
DROP FUNCTION IF EXISTS sp_vars_check_ret4;
DROP FUNCTION IF EXISTS sp_vars_div_zero;

--enable_warnings

###########################################################################
#
# Some general tests for SP-vars functionality.
#
###########################################################################

# Create the procedure in ANSI mode. Check that all necessary warnings are
# emitted properly.

SET @@sql_mode = 'ansi';

--source include/sp-vars.inc

--echo
--echo ---------------------------------------------------------------
--echo Calling the routines, created in ANSI mode.
--echo ---------------------------------------------------------------
--echo

CALL sp_vars_check_dflt();

CALL sp_vars_check_assignment();

SELECT sp_vars_check_ret1();

SELECT sp_vars_check_ret2();

SELECT sp_vars_check_ret3();

SELECT sp_vars_check_ret4();

SELECT sp_vars_div_zero();

# Check that changing sql_mode after creating a store procedure does not
# matter.

SET @@sql_mode = 'traditional';

--echo
--echo ---------------------------------------------------------------
--echo Calling in TRADITIONAL mode the routines, created in ANSI mode.
--echo ---------------------------------------------------------------
--echo

CALL sp_vars_check_dflt();

CALL sp_vars_check_assignment();

SELECT sp_vars_check_ret1();

SELECT sp_vars_check_ret2();

SELECT sp_vars_check_ret3();

SELECT sp_vars_check_ret4();

SELECT sp_vars_div_zero();

# Create the procedure in TRADITIONAL mode. Check that error will be thrown on
# execution.

DROP PROCEDURE sp_vars_check_dflt;
DROP PROCEDURE sp_vars_check_assignment;
DROP FUNCTION sp_vars_check_ret1;
DROP FUNCTION sp_vars_check_ret2;
DROP FUNCTION sp_vars_check_ret3;
DROP FUNCTION sp_vars_check_ret4;
DROP FUNCTION sp_vars_div_zero;

--source include/sp-vars.inc

--echo
--echo ---------------------------------------------------------------
--echo Calling the routines, created in TRADITIONAL mode.
--echo ---------------------------------------------------------------
--echo

--error ER_WARN_DATA_OUT_OF_RANGE
CALL sp_vars_check_dflt();

--error ER_WARN_DATA_OUT_OF_RANGE
CALL sp_vars_check_assignment();

--error ER_WARN_DATA_OUT_OF_RANGE
SELECT sp_vars_check_ret1();

--error ER_WARN_DATA_OUT_OF_RANGE
SELECT sp_vars_check_ret2();

--error ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
SELECT sp_vars_check_ret3();

# TODO: Is it an error, that only a warning is emitted here? Check the same
# behaviour with tables.

SELECT sp_vars_check_ret4();

--error ER_DIVISION_BY_ZERO
SELECT sp_vars_div_zero();

SET @@sql_mode = 'ansi';

#
# Cleanup.
#

DROP PROCEDURE sp_vars_check_dflt;
DROP PROCEDURE sp_vars_check_assignment;
DROP FUNCTION sp_vars_check_ret1;
DROP FUNCTION sp_vars_check_ret2;
DROP FUNCTION sp_vars_check_ret3;
DROP FUNCTION sp_vars_check_ret4;
DROP FUNCTION sp_vars_div_zero;

###########################################################################
#
# Tests for BIT data type.
#
###########################################################################

--echo
--echo ---------------------------------------------------------------
--echo BIT data type tests
--echo ---------------------------------------------------------------
--echo

#
# Prepare.
#

--disable_warnings
DROP PROCEDURE IF EXISTS p1;
--enable_warnings

#
# Test case.
#

delimiter |;
CREATE PROCEDURE p1()
BEGIN
  DECLARE v1 BIT;
  DECLARE v2 BIT(1);
  DECLARE v3 BIT(3) DEFAULT b'101';
  DECLARE v4 BIT(64) DEFAULT 0x5555555555555555;
  DECLARE v5 BIT(3);
  DECLARE v6 BIT(64);
  DECLARE v7 BIT(8) DEFAULT 128;
  DECLARE v8 BIT(8) DEFAULT '128';
  DECLARE v9 BIT(8) DEFAULT ' 128';
  DECLARE v10 BIT(8) DEFAULT 'x 128';

  SET v1 = v4;
  SET v2 = 0;
  SET v5 = v4; # check overflow
  SET v6 = v3; # check padding

  SELECT HEX(v1);
  SELECT HEX(v2);
  SELECT HEX(v3);
  SELECT HEX(v4);
  SELECT HEX(v5);
  SELECT HEX(v6);
  SELECT HEX(v7);
  SELECT HEX(v8);
  SELECT HEX(v9);
  SELECT HEX(v10);
END|
delimiter ;|

CALL p1();

#
# Cleanup.
#

DROP PROCEDURE p1;

###########################################################################
#
# Tests for CASE statements functionality:
#   - test for general functionality (scopes, nested cases, CASE in loops);
#   - test that if type of the CASE expression is changed on each iteration,
#     the execution will be correct.
#
###########################################################################

--echo
--echo ---------------------------------------------------------------
--echo CASE expression tests.
--echo ---------------------------------------------------------------
--echo

#
# Prepare.
#

DROP PROCEDURE IF EXISTS p1;
DROP PROCEDURE IF EXISTS p2;
DROP TABLE IF EXISTS t1;

#
# Test case.
#

CREATE TABLE t1(log_msg VARCHAR(1024));

delimiter |;

CREATE PROCEDURE p1(arg VARCHAR(255))
BEGIN
  INSERT INTO t1 VALUES('p1: step1');

  CASE arg * 10
    WHEN 10 * 10 THEN
      INSERT INTO t1 VALUES('p1: case1: on 10');
    WHEN 10 * 10 + 10 * 10 THEN
      BEGIN
        CASE arg / 10
          WHEN 1 THEN
            INSERT INTO t1 VALUES('p1: case1: case2: on 1');
          WHEN 2 THEN
            BEGIN
              DECLARE i TINYINT DEFAULT 10;

              WHILE i > 0 DO
                INSERT INTO t1 VALUES(CONCAT('p1: case1: case2: loop: i: ', i));
                
                CASE MOD(i, 2)
                  WHEN 0 THEN
                    INSERT INTO t1 VALUES('p1: case1: case2: loop: i is even');
                  WHEN 1 THEN
                    INSERT INTO t1 VALUES('p1: case1: case2: loop: i is odd');
                  ELSE
                    INSERT INTO t1 VALUES('p1: case1: case2: loop: ERROR');
                END CASE;
                    
                SET i = i - 1;
              END WHILE;
            END;
          ELSE
            INSERT INTO t1 VALUES('p1: case1: case2: ERROR');
        END CASE;

        CASE arg
          WHEN 10 THEN
            INSERT INTO t1 VALUES('p1: case1: case3: on 10');
          WHEN 20 THEN
            INSERT INTO t1 VALUES('p1: case1: case3: on 20');
          ELSE
            INSERT INTO t1 VALUES('p1: case1: case3: ERROR');
        END CASE;
      END;
    ELSE
      INSERT INTO t1 VALUES('p1: case1: ERROR');
  END CASE;

  CASE arg * 10
    WHEN 10 * 10 THEN
      INSERT INTO t1 VALUES('p1: case4: on 10');
    WHEN 10 * 10 + 10 * 10 THEN
      BEGIN
        CASE arg / 10
          WHEN 1 THEN
            INSERT INTO t1 VALUES('p1: case4: case5: on 1');
          WHEN 2 THEN
            BEGIN
              DECLARE i TINYINT DEFAULT 10;

              WHILE i > 0 DO
                INSERT INTO t1 VALUES(CONCAT('p1: case4: case5: loop: i: ', i));
                
                CASE MOD(i, 2)
                  WHEN 0 THEN
                    INSERT INTO t1 VALUES('p1: case4: case5: loop: i is even');
                  WHEN 1 THEN
                    INSERT INTO t1 VALUES('p1: case4: case5: loop: i is odd');
                  ELSE
                    INSERT INTO t1 VALUES('p1: case4: case5: loop: ERROR');
                END CASE;
                    
                SET i = i - 1;
              END WHILE;
            END;
          ELSE
            INSERT INTO t1 VALUES('p1: case4: case5: ERROR');
        END CASE;

        CASE arg
          WHEN 10 THEN
            INSERT INTO t1 VALUES('p1: case4: case6: on 10');
          WHEN 20 THEN
            INSERT INTO t1 VALUES('p1: case4: case6: on 20');
          ELSE
            INSERT INTO t1 VALUES('p1: case4: case6: ERROR');
        END CASE;
      END;
    ELSE
      INSERT INTO t1 VALUES('p1: case4: ERROR');
  END CASE;
END|

CREATE PROCEDURE p2()
BEGIN
  DECLARE i TINYINT DEFAULT 3;

  WHILE i > 0 DO
    IF MOD(i, 2) = 0 THEN
      SET @_test_session_var = 10;
    ELSE
      SET @_test_session_var = 'test';
    END IF;

    CASE @_test_session_var
      WHEN 10 THEN
        INSERT INTO t1 VALUES('p2: case: numerical type');
      WHEN 'test' THEN
        INSERT INTO t1 VALUES('p2: case: string type');
      ELSE
        INSERT INTO t1 VALUES('p2: case: ERROR');
    END CASE;

    SET i = i - 1;
  END WHILE;
END|

delimiter ;|

CALL p1(10);
CALL p1(20);

CALL p2();

SELECT * FROM t1;

#
# Cleanup.
#

DROP PROCEDURE p1;
DROP PROCEDURE p2;
DROP TABLE t1;

###########################################################################
#
# Test case for BUG#14161: Stored procedure cannot retrieve bigint unsigned.
#
###########################################################################

--echo
--echo ---------------------------------------------------------------
--echo BUG#14161
--echo ---------------------------------------------------------------
--echo

#
# Prepare.
#

--disable_warnings
DROP TABLE IF EXISTS t1;
DROP PROCEDURE IF EXISTS p1;
--enable_warnings

#
# Test case.
#

CREATE TABLE t1(col BIGINT UNSIGNED);

INSERT INTO t1 VALUE(18446744073709551614);

delimiter |;
CREATE PROCEDURE p1(IN arg BIGINT UNSIGNED)
BEGIN
  SELECT arg;
  SELECT * FROM t1;
  SELECT * FROM t1 WHERE col = arg;
END|
delimiter ;|

CALL p1(18446744073709551614);

#
# Cleanup.
#

DROP TABLE t1;
DROP PROCEDURE p1;

###########################################################################
#
# Test case for BUG#13705: parameters to stored procedures are not verified.
#
###########################################################################

--echo
--echo ---------------------------------------------------------------
--echo BUG#13705
--echo ---------------------------------------------------------------
--echo

#
# Prepare.
#

--disable_warnings
DROP PROCEDURE IF EXISTS p1;
--enable_warnings

#
# Test case.
#

delimiter |;
CREATE PROCEDURE p1(x VARCHAR(10), y CHAR(3)) READS SQL DATA
BEGIN
  SELECT x, y;
END|
delimiter ;|

CALL p1('alpha', 'abc');
CALL p1('alpha', 'abcdef');

#
# Cleanup.
#

DROP PROCEDURE p1;

###########################################################################
#
# Test case for BUG#13675: DATETIME/DATE type in store proc param seems to be
# converted as varbinary.
#
# TODO: test case failed.
#
###########################################################################

--echo
--echo ---------------------------------------------------------------
--echo BUG#13675
--echo ---------------------------------------------------------------
--echo

#
# Prepare.
#

--disable_warnings
DROP PROCEDURE IF EXISTS p1;
DROP TABLE IF EXISTS t1;
--enable_warnings

#
# Test case.
#

delimiter |;
CREATE PROCEDURE p1(x DATETIME)
BEGIN
  CREATE TABLE t1 SELECT x;
  SHOW CREATE TABLE t1;
  DROP TABLE t1;
END|
delimiter ;|

CALL p1(NOW());

CALL p1('test');

#
# Cleanup.
#

DROP PROCEDURE p1;

###########################################################################
#
# Test case for BUG#12976: Boolean values reversed in stored procedures?
#
###########################################################################

--echo
--echo ---------------------------------------------------------------
--echo BUG#12976
--echo ---------------------------------------------------------------
--echo

#
# Prepare.
#

--disable_warnings
DROP TABLE IF EXISTS t1;
DROP PROCEDURE IF EXISTS p1;
DROP PROCEDURE IF EXISTS p2;
--enable_warnings

#
# Test case.
#

CREATE TABLE t1(b BIT(1));

INSERT INTO t1(b) VALUES(b'0'), (b'1');

delimiter |;
CREATE PROCEDURE p1()
BEGIN
  SELECT HEX(b),
    b = 0,
    b = FALSE,
    b IS FALSE,
    b = 1,
    b = TRUE,
    b IS TRUE
  FROM t1;
END|

CREATE PROCEDURE p2()
BEGIN
  DECLARE vb BIT(1);
  SELECT b INTO vb FROM t1 WHERE b = 0;

  SELECT HEX(vb),
    vb = 0,
    vb = FALSE,
    vb IS FALSE,
    vb = 1,
    vb = TRUE,
    vb IS TRUE;

  SELECT b INTO vb FROM t1 WHERE b = 1;

  SELECT HEX(vb),
    vb = 0,
    vb = FALSE,
    vb IS FALSE,
    vb = 1,
    vb = TRUE,
    vb IS TRUE;
END|
delimiter ;|

call p1();

call p2();

#
# Cleanup.
#

DROP TABLE t1;
DROP PROCEDURE p1;
DROP PROCEDURE p2;

# Additional tests for Bug#12976

--disable_warnings
DROP TABLE IF EXISTS table_12976_a;
DROP TABLE IF EXISTS table_12976_b;
DROP PROCEDURE IF EXISTS proc_12976_a;
DROP PROCEDURE IF EXISTS proc_12976_b;
--enable_warnings

CREATE TABLE table_12976_a (val bit(1));

CREATE TABLE table_12976_b(
  appname varchar(15),
  emailperm bit not null default 1,
  phoneperm bit not null default 0);

insert into table_12976_b values ('A', b'1', b'1'), ('B', b'0', b'0');

delimiter ||;
CREATE PROCEDURE proc_12976_a()
BEGIN
  declare localvar bit(1);
  SELECT val INTO localvar FROM table_12976_a;
  SELECT coalesce(localvar, 1)+1, coalesce(val, 1)+1 FROM table_12976_a;
END||

CREATE PROCEDURE proc_12976_b(
  name varchar(15),
  out ep bit,
  out msg varchar(10))
BEGIN
  SELECT emailperm into ep FROM table_12976_b where (appname = name);
  IF ep is true THEN
    SET msg = 'True';
  ELSE
    SET msg = 'False';
  END IF;
END||

delimiter ;||

INSERT table_12976_a VALUES (0);
call proc_12976_a();
UPDATE table_12976_a set val=1;
call proc_12976_a();

call proc_12976_b('A', @ep, @msg);
select @ep, @msg;

call proc_12976_b('B', @ep, @msg);
select @ep, @msg;

DROP TABLE table_12976_a;
DROP TABLE table_12976_b;
DROP PROCEDURE proc_12976_a;
DROP PROCEDURE proc_12976_b;


###########################################################################
#
# Test case for BUG#9572: Stored procedures: variable type declarations
# ignored.
#
###########################################################################

--echo
--echo ---------------------------------------------------------------
--echo BUG#9572
--echo ---------------------------------------------------------------
--echo

#
# Prepare.
#

--disable_warnings
DROP PROCEDURE IF EXISTS p1;
DROP PROCEDURE IF EXISTS p2;
DROP PROCEDURE IF EXISTS p3;

DROP PROCEDURE IF EXISTS p4;
DROP PROCEDURE IF EXISTS p5;
DROP PROCEDURE IF EXISTS p6;
--enable_warnings

#
# Test case.
#

SET @@sql_mode = 'traditional';

delimiter |;

CREATE PROCEDURE p1()
BEGIN
  DECLARE v TINYINT DEFAULT 1e200;
  SELECT v;
END|

CREATE PROCEDURE p2()
BEGIN
  DECLARE v DECIMAL(5) DEFAULT 1e200;
  SELECT v;
END|

CREATE PROCEDURE p3()
BEGIN
  DECLARE v CHAR(5) DEFAULT 'abcdef';
  SELECT v LIKE 'abc___';
END|

CREATE PROCEDURE p4(arg VARCHAR(2))
BEGIN
    DECLARE var VARCHAR(1);
    SET var := arg;
    SELECT arg, var;
END|

CREATE PROCEDURE p5(arg CHAR(2))
BEGIN
    DECLARE var CHAR(1);
    SET var := arg;
    SELECT arg, var;
END|

CREATE PROCEDURE p6(arg DECIMAL(2))
BEGIN
    DECLARE var DECIMAL(1);
    SET var := arg;
    SELECT arg, var;
END|

delimiter ;|

--error ER_WARN_DATA_OUT_OF_RANGE
CALL p1();
--error ER_WARN_DATA_OUT_OF_RANGE
CALL p2();
--error ER_DATA_TOO_LONG
CALL p3();

--error ER_DATA_TOO_LONG
CALL p4('aaa'); 
--error ER_DATA_TOO_LONG
CALL p5('aa');
--error ER_WARN_DATA_OUT_OF_RANGE
CALL p6(10);

#
# Cleanup.
#

SET @@sql_mode = 'ansi';

DROP PROCEDURE p1;
DROP PROCEDURE p2;
DROP PROCEDURE p3;

DROP PROCEDURE p4;
DROP PROCEDURE p5;
DROP PROCEDURE p6;

###########################################################################
#
# Test case for BUG#9078: STORED PROCDURE: Decimal digits are not displayed
# when we use DECIMAL datatype.
#
###########################################################################

--echo
--echo ---------------------------------------------------------------
--echo BUG#9078
--echo ---------------------------------------------------------------
--echo

#
# Prepare.
#

--disable_warnings
DROP PROCEDURE IF EXISTS p1;
--enable_warnings

#
# Test case.
#

delimiter |;
CREATE PROCEDURE p1 (arg DECIMAL(64,2))
BEGIN
  DECLARE var DECIMAL(64,2);

  SET var = arg;
  SELECT var;
END|
delimiter ;|

CALL p1(1929);
CALL p1(1929.00);
CALL p1(1929.003);

#
# Cleanup.
#

DROP PROCEDURE p1;

###########################################################################
#
# Test case for BUG#8768: Functions: For any unsigned data type, -ve values can
# be passed and returned.
#
# TODO: there is a bug here -- the function created in ANSI mode should not
# throw errors instead of warnings if called in TRADITIONAL mode.
#
###########################################################################

--echo
--echo ---------------------------------------------------------------
--echo BUG#8768
--echo ---------------------------------------------------------------
--echo

#
# Prepare.
#

--disable_warnings
DROP FUNCTION IF EXISTS f1;
--enable_warnings

#
# Test case.
#

# Create a function in ANSI mode.

delimiter |;
CREATE FUNCTION f1(arg TINYINT UNSIGNED) RETURNS TINYINT
BEGIN
  RETURN arg;
END|
delimiter ;|

SELECT f1(-2500);

# Call in TRADITIONAL mode the function created in ANSI mode.

SET @@sql_mode = 'traditional';

# TODO: a warning should be emitted here.
--error ER_WARN_DATA_OUT_OF_RANGE
SELECT f1(-2500);

# Recreate the function in TRADITIONAL mode.

DROP FUNCTION f1;

delimiter |;
CREATE FUNCTION f1(arg TINYINT UNSIGNED) RETURNS TINYINT
BEGIN
  RETURN arg;
END|
delimiter ;|

--error ER_WARN_DATA_OUT_OF_RANGE
SELECT f1(-2500);

#
# Cleanup.
#

SET @@sql_mode = 'ansi';

DROP FUNCTION f1;

###########################################################################
#
# Test case for BUG#8769: Functions: For Int datatypes, out of range values can
# be passed and returned.
#
# TODO: there is a bug here -- the function created in ANSI mode should not
# throw errors instead of warnings if called in TRADITIONAL mode.
#
###########################################################################

--echo
--echo ---------------------------------------------------------------
--echo BUG#8769
--echo ---------------------------------------------------------------
--echo

#
# Prepare.
#

--disable_warnings
DROP FUNCTION IF EXISTS f1;
--enable_warnings

#
# Test case.
#

# Create a function in ANSI mode.

delimiter |;
CREATE FUNCTION f1(arg MEDIUMINT) RETURNS MEDIUMINT
BEGIN
  RETURN arg;
END|
delimiter ;|

SELECT f1(8388699);

# Call in TRADITIONAL mode the function created in ANSI mode.

SET @@sql_mode = 'traditional';

# TODO: a warning should be emitted here.
--error ER_WARN_DATA_OUT_OF_RANGE
SELECT f1(8388699);

# Recreate the function in TRADITIONAL mode.

DROP FUNCTION f1;

delimiter |;
CREATE FUNCTION f1(arg MEDIUMINT) RETURNS MEDIUMINT
BEGIN
  RETURN arg;
END|
delimiter ;|

--error ER_WARN_DATA_OUT_OF_RANGE
SELECT f1(8388699);

#
# Cleanup.
#

SET @@sql_mode = 'ansi';

DROP FUNCTION f1;

###########################################################################
#
# Test case for BUG#8702: Stored Procedures: No Error/Warning shown for
# inappropriate data type matching.
#
###########################################################################

--echo
--echo ---------------------------------------------------------------
--echo BUG#8702
--echo ---------------------------------------------------------------
--echo

#
# Prepare.
#

--disable_warnings
DROP PROCEDURE IF EXISTS p1;
DROP TABLE IF EXISTS t1;
--enable_warnings

#
# Test case.
#

CREATE TABLE t1(col VARCHAR(255));

INSERT INTO t1(col) VALUES('Hello, world!');

delimiter |;
CREATE PROCEDURE p1()
BEGIN
  DECLARE sp_var INTEGER;

  SELECT col INTO sp_var FROM t1 LIMIT 1;
  SET @user_var = sp_var;

  SELECT sp_var;
  SELECT @user_var;
END|
delimiter ;|

CALL p1();

#
# Cleanup.
#

DROP PROCEDURE p1;
DROP TABLE t1;

###########################################################################
#
# Test case for BUG#12903: upper function does not work inside a function.
#
###########################################################################

--echo
--echo ---------------------------------------------------------------
--echo BUG#12903
--echo ---------------------------------------------------------------
--echo

#
# Prepare.
#

--disable_warnings
DROP FUNCTION IF EXISTS f1;
DROP TABLE IF EXISTS t1;
--enable_warnings

#
# Test case.
#

CREATE TABLE t1(txt VARCHAR(255));

delimiter |;
CREATE FUNCTION f1(arg VARCHAR(255)) RETURNS VARCHAR(255)
BEGIN
  DECLARE v1 VARCHAR(255);
  DECLARE v2 VARCHAR(255);

  SET v1 = CONCAT(LOWER(arg), UPPER(arg));
  SET v2 = CONCAT(LOWER(v1), UPPER(v1));

  INSERT INTO t1 VALUES(v1), (v2);

  RETURN CONCAT(LOWER(arg), UPPER(arg));
END|
delimiter ;|

SELECT f1('_aBcDe_');

SELECT * FROM t1;

#
# Cleanup.
#

DROP FUNCTION f1;
DROP TABLE t1;

###########################################################################
#
# Test case for BUG#13808: ENUM type stored procedure parameter accepts
# non-enumerated data.
#
###########################################################################

--echo
--echo ---------------------------------------------------------------
--echo BUG#13808
--echo ---------------------------------------------------------------
--echo

#
# Prepare.
#

--disable_warnings
DROP PROCEDURE IF EXISTS p1;
DROP PROCEDURE IF EXISTS p2;
DROP FUNCTION IF EXISTS f1;
--enable_warnings

#
# Test case.
#

delimiter |;

CREATE PROCEDURE p1(arg ENUM('a', 'b'))
BEGIN
  SELECT arg;
END|

CREATE PROCEDURE p2(arg ENUM('a', 'b'))
BEGIN
  DECLARE var ENUM('c', 'd') DEFAULT arg;

  SELECT arg, var;
END|

CREATE FUNCTION f1(arg ENUM('a', 'b')) RETURNS ENUM('c', 'd')
BEGIN
  RETURN arg;
END|

delimiter ;|

CALL p1('c');

CALL p2('a');

SELECT f1('a');

#
# Cleanup.
#

DROP PROCEDURE p1;
DROP PROCEDURE p2;
DROP FUNCTION f1;

###########################################################################
#
# Test case for BUG#13909: Varchar Stored Procedure Parameter always BINARY
# string (ignores CHARACTER SET).
#
###########################################################################

--echo
--echo ---------------------------------------------------------------
--echo BUG#13909
--echo ---------------------------------------------------------------
--echo

#
# Prepare.
#

--disable_warnings
DROP PROCEDURE IF EXISTS p1;
DROP PROCEDURE IF EXISTS p2;
--enable_warnings

#
# Test case.
#

delimiter |;

CREATE PROCEDURE p1(arg VARCHAR(255))
BEGIN
  SELECT CHARSET(arg);
END|

CREATE PROCEDURE p2(arg VARCHAR(255) CHARACTER SET UTF8)
BEGIN
    SELECT CHARSET(arg);
END|

delimiter ;|

CALL p1('t');
CALL p1(_UTF8 't');


CALL p2('t');
CALL p2(_LATIN1 't');

#
# Cleanup.
#

DROP PROCEDURE p1;
DROP PROCEDURE p2;

###########################################################################
#
# Test case for BUG#14188: BINARY variables have no 0x00 padding.
#
###########################################################################

--echo
--echo ---------------------------------------------------------------
--echo BUG#14188
--echo ---------------------------------------------------------------
--echo

#
# Prepare.
#

--disable_warnings
DROP PROCEDURE IF EXISTS p1;
--enable_warnings

#
# Test case.
#

delimiter |;
CREATE PROCEDURE p1(arg1 BINARY(2), arg2 VARBINARY(2))
BEGIN
  DECLARE var1 BINARY(2) DEFAULT 0x41;
  DECLARE var2 VARBINARY(2) DEFAULT 0x42;

  SELECT HEX(arg1), HEX(arg2);
  SELECT HEX(var1), HEX(var2);
END|
delimiter ;|

CALL p1(0x41, 0x42);

#
# Cleanup.
#

DROP PROCEDURE p1;

###########################################################################
#
# Test case for BUG#15148: Stored procedure variables accept non-scalar values.
#
###########################################################################

--echo
--echo ---------------------------------------------------------------
--echo BUG#15148
--echo ---------------------------------------------------------------
--echo

#
# Prepare.
#

--disable_warnings
DROP PROCEDURE IF EXISTS p1;
DROP TABLE IF EXISTS t1;
--enable_warnings

#
# Test case.
#

CREATE TABLE t1(col1 TINYINT, col2 TINYINT);

INSERT INTO t1 VALUES(1, 2), (11, 12);

delimiter |;
CREATE PROCEDURE p1(arg TINYINT)
BEGIN
  SELECT arg;
END|
delimiter ;|

--error ER_OPERAND_COLUMNS
CALL p1((1, 2));

--error ER_OPERAND_COLUMNS
CALL p1((SELECT * FROM t1 LIMIT 1));

--error ER_OPERAND_COLUMNS
CALL p1((SELECT col1, col2 FROM t1 LIMIT 1));

#
# Cleanup.
#

DROP PROCEDURE p1;
DROP TABLE t1;

###########################################################################
#
# Test case for BUG#13613: substring function in stored procedure.
#
###########################################################################

--echo
--echo ---------------------------------------------------------------
--echo BUG#13613
--echo ---------------------------------------------------------------
--echo

#
# Prepare.
#

--disable_warnings
DROP PROCEDURE IF EXISTS p1;
DROP FUNCTION IF EXISTS f1;
--enable_warnings

#
# Test case.
#

delimiter |;

CREATE PROCEDURE p1(x VARCHAR(50))
BEGIN
  SET x = SUBSTRING(x, 1, 3);
  SELECT x;
END|

CREATE FUNCTION f1(x VARCHAR(50)) RETURNS VARCHAR(50)
BEGIN
  RETURN SUBSTRING(x, 1, 3);
END|

delimiter ;|

CALL p1('abcdef');

SELECT f1('ABCDEF');

#
# Cleanup.
#

DROP PROCEDURE p1;
DROP FUNCTION f1;

###########################################################################
#
# Test case for BUG#13665: concat with '' produce incorrect results in SP.
#
###########################################################################

--echo
--echo ---------------------------------------------------------------
--echo BUG#13665
--echo ---------------------------------------------------------------
--echo

#
# Prepare.
#

--disable_warnings
DROP FUNCTION IF EXISTS f1;
--enable_warnings

#
# Test case.
#

delimiter |;
CREATE FUNCTION f1() RETURNS VARCHAR(20000)
BEGIN
  DECLARE var VARCHAR(2000);

  SET var = '';
  SET var = CONCAT(var, 'abc');
  SET var = CONCAT(var, '');

  RETURN var;
END|
delimiter ;|

SELECT f1();

#
# Cleanup.
#

DROP FUNCTION f1;


#
# Bug#17226: Variable set in cursor on first iteration is assigned
# second iterations value
#
# The problem was in incorrect handling of local variables of type
# TEXT (BLOB).
#
--disable_warnings
DROP PROCEDURE IF EXISTS p1;
--enable_warnings

delimiter |;
CREATE PROCEDURE p1()
BEGIN
  DECLARE v_char VARCHAR(255);
  DECLARE v_text TEXT DEFAULT '';

  SET v_char = 'abc';

  SET v_text = v_char;

  SET v_char = 'def';

  SET v_text = concat(v_text, '|', v_char);

  SELECT v_text;
END|
delimiter ;|

CALL p1();

DROP PROCEDURE p1;

#
# Bug #27415 Text Variables in stored procedures
# If the SP varible was also referenced on the right side
# the result was corrupted.
#
DELIMITER |;

--disable_warnings
DROP PROCEDURE IF EXISTS bug27415_text_test|
DROP PROCEDURE IF EXISTS bug27415_text_test2|
--enable_warnings

CREATE PROCEDURE bug27415_text_test(entity_id_str_in text)
BEGIN
    DECLARE str_remainder text;

    SET str_remainder = entity_id_str_in;

    select 'before substr', str_remainder;
    SET str_remainder = SUBSTRING(str_remainder, 3);
    select 'after substr', str_remainder;
END|

CREATE PROCEDURE bug27415_text_test2(entity_id_str_in text)
BEGIN
    DECLARE str_remainder text;
    DECLARE str_remainder2 text;
 
    SET str_remainder2 = entity_id_str_in;
    select 'before substr', str_remainder2;
    SET str_remainder = SUBSTRING(str_remainder2, 3);
    select 'after substr', str_remainder;
END|

CALL bug27415_text_test('a,b,c')|
CALL bug27415_text_test('a,b,c')|
CALL bug27415_text_test2('a,b,c')|
CALL bug27415_text_test('a,b,c')|

DROP PROCEDURE bug27415_text_test|
DROP PROCEDURE bug27415_text_test2|

DELIMITER ;|

# End of 5.0 tests.

#
# Bug #26277 User variable returns one type in SELECT @v and other for CREATE as SELECT @v
#
--disable_warnings
drop function if exists f1;
drop table if exists t1;
--enable_warnings

delimiter |;
create function f1() returns int 
begin
 if @a=1 then set @b='abc';
 else set @b=1;
 end if;
 set @a=1;
 return 0;
end|

create table t1 (a int)|
insert into t1 (a) values (1), (2)|

set @b=1|
set @a=0|
select f1(), @b from t1|

set @b:='test'|
set @a=0|
select f1(), @b from t1|

delimiter ;|

drop function f1;
drop table t1;
# End of 5.1 tests.

