ocelot-inc / ocelotgui

GUI client for MySQL or MariaDB, including debugger
GNU General Public License v2.0
62 stars 15 forks source link

debug stored procedure fail if enum in parameter #2

Closed Kurairaito closed 7 years ago

Kurairaito commented 7 years ago

Here is an example of stored procedure that fail:

You can execute this code in phpmyadmin

DELIMITER //
CREATE PROCEDURE `test_procedure`(OUT `o_result` ENUM('ok','ko')) NOT DETERMINISTIC NO SQL SQL SECURITY DEFINER BEGIN
    SET o_result = "ok";
END//
DELIMITER ;

in ocelot gui :

DELIMITER //
$install
$setup test_procedure

Error 1064 (42000) You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ko'`*);'); IF xxxmdbug.is_debuggee_and_is_attached()=1 THEN CALL xxxmdbug.xxxmdb' at line 7

if you execute the same procedure from phpMyAdmin, you will have the o_result value set to 'ok'

Other stored procedure that do not use ENUM type in parameter seems to work fine (tested only with BIGINT and BOOLEAN).

ocelot version : latest release (1.0.4) x64 mariaDB version : 10.1.22 host : Ubuntu 17.04 x64

pgulutzan commented 7 years ago

Confirmed. Doesn't seem to apply to declared variables, so probably it's something wrong in insert_into_variables_parameters(). No estimate yet for a fix date.

Kurairaito commented 7 years ago

I tried to fix the issue, now the $setup test_procedure does not fail anymore, and then when doing

$debug test_procedure(@o_bool,@o_result);
$NEXT
$refresh variables;
SELECT * FROM xxxmdbug.variables;

I get what seems to be the good result : result_debug

But the value is never updated. Any hint where it could come from ?

Note : I modified the procedure to add a boolean in first output parameter to check difference in xxxmdbug.variables

My attemp : https://github.com/ocelot-inc/ocelotgui/pull/3

Kurairaito commented 7 years ago

New statement : my fix works. I was tricked because the last line of a procedure cannot be actually debugged. I tried with the following procedure :

BEGIN
    DECLARE test_enum ENUM('test1','test2'); 
    SET test_enum = "test2";
    SET o_bool = 1;
    SET o_result = "ok";
    SET o_bool = 2;
END

And doing the following for each statement:

$NEXT
$refresh variables
SELECT * FROM xxxmdbug.variables

Update all the value except for the last (SET o_bool = 2;)

Will create another issue for this one.

pgulutzan commented 7 years ago

@Kurairaito, I am impressed that you found and fixed my error. Thank you! Patch is accepted and merged. Note to other readers: This patch may also be a fix for SET and DECIMAL. It only works if you run $attach again. It is only in source, until the next release.