Skip to content

Commit bcb442e

Browse files
committed
Add a test for #339 - create function
Signed-off-by: William Desportes <[email protected]>
1 parent 4f1c50c commit bcb442e

1 file changed

Lines changed: 125 additions & 0 deletions

File tree

tests/Builder/CreateStatementTest.php

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)