##============================================================================
## Notes
##============================================================================

# Test case for Bug#11230

# The point of this test is to make sure that '#', '-- ' and '/* ... */'
# comments, as well as empty lines, are sent from the client to the server.
# This is to ensure better error reporting, and to keep comments in the code
# for stored procedures / functions / triggers (Bug#11230).
# As a result, be careful when editing comments in this script, they do
# matter.
#
# Also, note that this is a script for **mysql**, not mysqltest.
# This is critical, as the mysqltest client interprets comments differently.

##============================================================================
## Setup
##============================================================================

## See mysql_comments.test for initial cleanup

# Test tables
#
# t1 is reused throughout the file, and dropped at the end.
#
create table t1 (
  id   char(16) not null default '',
  data int not null
);

##============================================================================
## Comments outside statements
##============================================================================

# Ignored 1a
-- Ignored 1b
/*
   Ignored 1c
*/

select 1;

##============================================================================
## Comments inside statements
##============================================================================

select # comment 1a
# comment 2a
-- comment 2b
/*
   comment 2c
*/
2
; # not strictly inside, but on same line
# ignored

##============================================================================
## Comments inside functions
##============================================================================

drop function if exists foofct ;

create function foofct (x char(20))
returns char(20)
/* not inside the body yet */
return
-- comment 1a
# comment 1b
/* comment 1c */
x; # after body, on same line

select foofct("call 1");

show create function foofct;
drop function foofct;

delimiter |

create function foofct(x char(20))
returns char(20)
begin
  -- comment 1a
  # comment 1b
  /*
     comment 1c
  */

  -- empty line below

  -- empty line above
  return x;
end|

delimiter ;

select foofct("call 2");

show create function foofct;
drop function foofct;

##============================================================================
## Comments inside stored procedures
##============================================================================

# Empty statement
drop procedure if exists `empty`;
create procedure `empty`()
begin
end;

call `empty`();
show create procedure `empty`;
drop procedure `empty`;

drop procedure if exists foosp;

## These comments are before the create, and will be lost
# Comment 1a
-- Comment 1b
/*
   Comment 1c
 */
create procedure foosp()
/* Comment not quiet in the body yet */
  insert into test.t1
## These comments are part of the procedure body, and should be kept.
# Comment 2a
-- Comment 2b
/* Comment 2c */
  -- empty line below

  -- empty line above
  values ("foo", 42); # comment 3, still part of the body
## After the ';', therefore not part of the body
# comment 4a
-- Comment 4b
/*
   Comment 4c
 */

call foosp();
select * from t1;
delete from t1;
show create procedure foosp;
drop procedure foosp;

drop procedure if exists nicesp;

delimiter |

create procedure nicesp(a int)
begin
  -- declare some variables here
  declare b int;
  declare c float;

  -- do more stuff here
  -- commented nicely and so on

  -- famous last words ...
end|

delimiter ;

show create procedure nicesp;
drop procedure nicesp;

##============================================================================
## Comments inside triggers
##============================================================================

drop trigger if exists t1_empty;

create trigger t1_empty after delete on t1
for each row
begin
end;

show create trigger t1_empty;

drop trigger if exists t1_bi;

delimiter |

create trigger t1_bi before insert on t1
for each row
begin
# comment 1a
-- comment 1b
/*
   comment 1c
*/
  -- declare some variables here
  declare b int;
  declare c float;

  -- do more stuff here
  -- commented nicely and so on

  -- famous last words ...
  set NEW.data := 12;
end|

delimiter ;

show create trigger t1_bi;

# also make sure the trigger still works
insert into t1(id) value ("trig");
select * from t1;

##============================================================================
## Cleanup
##============================================================================

drop table t1;
