@@ -441,6 +441,131 @@ public function testBuilderCreateProcedure()
441441 );
442442 }
443443
444+ public function testBuilderCreateFunction ()
445+ {
446+ $ parser = new Parser (
447+ 'CREATE DEFINER=`root`@`localhost` '
448+ . ' FUNCTION `inventory_in_stock`(`p_inventory_id` INT) RETURNS tinyint(1) '
449+ . ' READS SQL DATA ' . "\n"
450+ . 'BEGIN ' . "\n"
451+ . ' DECLARE v_rentals INT; ' . "\n"
452+ . ' DECLARE v_out INT; ' . "\n"
453+ . "\n"
454+ . ' ' . "\n"
455+ . ' ' . "\n"
456+ . "\n"
457+ . ' SELECT COUNT(*) INTO v_rentals ' . "\n"
458+ . ' FROM rental ' . "\n"
459+ . ' WHERE inventory_id = p_inventory_id; ' . "\n"
460+ . "\n"
461+ . ' IF v_rentals = 0 THEN ' . "\n"
462+ . ' RETURN TRUE; ' . "\n"
463+ . ' END IF; ' . "\n"
464+ . "\n"
465+ . ' SELECT COUNT(rental_id) INTO v_out ' . "\n"
466+ . ' FROM inventory LEFT JOIN rental USING(inventory_id) ' . "\n"
467+ . ' WHERE inventory.inventory_id = p_inventory_id ' . "\n"
468+ . ' AND rental.return_date IS NULL; ' . "\n"
469+ . "\n"
470+ . ' IF v_out > 0 THEN ' . "\n"
471+ . ' RETURN FALSE; ' . "\n"
472+ . ' ELSE ' . "\n"
473+ . ' RETURN TRUE; ' . "\n"
474+ . ' END IF; ' . "\n"
475+ . 'END '
476+ );
477+
478+ /** @var CreateStatement */
479+ $ stmt = $ parser ->statements [0 ];
480+
481+ $ this ->assertSame (
482+ 'CREATE DEFINER=`root`@`localhost` '
483+ . ' FUNCTION `inventory_in_stock` (`p_inventory_id` INT) RETURNS TINYINT(1) '
484+ . ' READS SQL DATA ' . "\n"
485+ . 'BEGIN ' . "\n"
486+ . ' DECLARE v_rentals INT; ' . "\n"
487+ . ' DECLARE v_out INT; ' . "\n"
488+ . "\n"
489+ . ' ' . "\n"
490+ . ' ' . "\n"
491+ . "\n"
492+ . ' SELECT COUNT(*) INTO v_rentals ' . "\n"
493+ . ' FROM rental ' . "\n"
494+ . ' WHERE inventory_id = p_inventory_id; ' . "\n"
495+ . "\n"
496+ . ' IF v_rentals = 0 THEN ' . "\n"
497+ . ' RETURN TRUE; ' . "\n"
498+ . ' END IF; ' . "\n"
499+ . "\n"
500+ . ' SELECT COUNT(rental_id) INTO v_out ' . "\n"
501+ . ' FROM inventory LEFT JOIN rental USING(inventory_id) ' . "\n"
502+ . ' WHERE inventory.inventory_id = p_inventory_id ' . "\n"
503+ . ' AND rental.return_date IS NULL; ' . "\n"
504+ . "\n"
505+ . ' IF v_out > 0 THEN ' . "\n"
506+ . ' RETURN FALSE; ' . "\n"
507+ . ' ELSE ' . "\n"
508+ . ' RETURN TRUE; ' . "\n"
509+ . ' END IF; ' . "\n"
510+ . 'END ' ,
511+ $ stmt ->build ()
512+ );
513+
514+ $ this ->assertTrue ($ stmt ->entityOptions ->isEmpty ());
515+ $ this ->assertFalse ($ stmt ->options ->isEmpty ());
516+
517+ $ this ->assertSame (
518+ 'DEFINER=`root`@`localhost` FUNCTION ' ,
519+ $ stmt ->options ->__toString ()
520+ );
521+
522+ $ this ->assertSame (
523+ '`inventory_in_stock` ' ,
524+ $ stmt ->name ->__toString ()
525+ );
526+
527+ $ this ->assertSame (
528+ '(`p_inventory_id` INT) ' ,
529+ ParameterDefinition::build ($ stmt ->parameters )
530+ );
531+
532+ $ this ->assertSame (
533+ '' ,
534+ $ stmt ->entityOptions ->__toString ()
535+ );
536+
537+ $ this ->assertSame (
538+ 'READS SQL DATA ' . "\n"
539+ . 'BEGIN ' . "\n"
540+ . ' DECLARE v_rentals INT; ' . "\n"
541+ . ' DECLARE v_out INT; ' . "\n"
542+ . "\n"
543+ . ' ' . "\n"
544+ . ' ' . "\n"
545+ . "\n"
546+ . ' SELECT COUNT(*) INTO v_rentals ' . "\n"
547+ . ' FROM rental ' . "\n"
548+ . ' WHERE inventory_id = p_inventory_id; ' . "\n"
549+ . "\n"
550+ . ' IF v_rentals = 0 THEN ' . "\n"
551+ . ' RETURN TRUE; ' . "\n"
552+ . ' END IF; ' . "\n"
553+ . "\n"
554+ . ' SELECT COUNT(rental_id) INTO v_out ' . "\n"
555+ . ' FROM inventory LEFT JOIN rental USING(inventory_id) ' . "\n"
556+ . ' WHERE inventory.inventory_id = p_inventory_id ' . "\n"
557+ . ' AND rental.return_date IS NULL; ' . "\n"
558+ . "\n"
559+ . ' IF v_out > 0 THEN ' . "\n"
560+ . ' RETURN FALSE; ' . "\n"
561+ . ' ELSE ' . "\n"
562+ . ' RETURN TRUE; ' . "\n"
563+ . ' END IF; ' . "\n"
564+ . 'END ' ,
565+ TokensList::build ($ stmt ->body )
566+ );
567+ }
568+
444569 public function testBuilderTrigger ()
445570 {
446571 $ stmt = new CreateStatement ();
0 commit comments