diff --git a/composer.json b/composer.json index 9185e8b9..8a54ff34 100644 --- a/composer.json +++ b/composer.json @@ -32,7 +32,7 @@ "nesbot/carbon": "^2.49", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/phpstan-deprecation-rules": "^2.0.2", - "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-phpunit": "^2.0.8", "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^9.6.20", "ramsey/uuid": "^4.2", diff --git a/tests/DoctrineIntegration/ODM/DocumentManagerTypeInferenceTest.php b/tests/DoctrineIntegration/ODM/DocumentManagerTypeInferenceTest.php index 050e92f0..a5ff018d 100644 --- a/tests/DoctrineIntegration/ODM/DocumentManagerTypeInferenceTest.php +++ b/tests/DoctrineIntegration/ODM/DocumentManagerTypeInferenceTest.php @@ -8,9 +8,6 @@ final class DocumentManagerTypeInferenceTest extends TypeInferenceTestCase { - /** - * @return iterable - */ public function dataFileAsserts(): iterable { yield from $this->gatherAssertTypes(__DIR__ . '/data/documentManagerDynamicReturn.php'); diff --git a/tests/DoctrineIntegration/ORM/EntityManagerTypeInferenceTest.php b/tests/DoctrineIntegration/ORM/EntityManagerTypeInferenceTest.php index 086a6e0e..52898ad2 100644 --- a/tests/DoctrineIntegration/ORM/EntityManagerTypeInferenceTest.php +++ b/tests/DoctrineIntegration/ORM/EntityManagerTypeInferenceTest.php @@ -9,9 +9,6 @@ class EntityManagerTypeInferenceTest extends TypeInferenceTestCase { - /** - * @return iterable - */ public function dataFileAsserts(): iterable { $ormVersion = InstalledVersions::getVersion('doctrine/orm'); diff --git a/tests/DoctrineIntegration/ORM/EntityManagerWithoutObjectManagerLoaderTypeInferenceTest.php b/tests/DoctrineIntegration/ORM/EntityManagerWithoutObjectManagerLoaderTypeInferenceTest.php index 25308635..56c53fc4 100644 --- a/tests/DoctrineIntegration/ORM/EntityManagerWithoutObjectManagerLoaderTypeInferenceTest.php +++ b/tests/DoctrineIntegration/ORM/EntityManagerWithoutObjectManagerLoaderTypeInferenceTest.php @@ -9,9 +9,6 @@ class EntityManagerWithoutObjectManagerLoaderTypeInferenceTest extends TypeInferenceTestCase { - /** - * @return iterable - */ public function dataFileAsserts(): iterable { $ormVersion = InstalledVersions::getVersion('doctrine/orm'); diff --git a/tests/DoctrineIntegration/Persistence/ManagerRegistryTypeInferenceTest.php b/tests/DoctrineIntegration/Persistence/ManagerRegistryTypeInferenceTest.php index d35df4a2..a25ff2cf 100644 --- a/tests/DoctrineIntegration/Persistence/ManagerRegistryTypeInferenceTest.php +++ b/tests/DoctrineIntegration/Persistence/ManagerRegistryTypeInferenceTest.php @@ -7,9 +7,6 @@ class ManagerRegistryTypeInferenceTest extends TypeInferenceTestCase { - /** - * @return iterable - */ public function dataFileAsserts(): iterable { yield from $this->gatherAssertTypes(__DIR__ . '/data/managerRegistryRepositoryDynamicReturn.php'); diff --git a/tests/DoctrineIntegration/TypeInferenceTest.php b/tests/DoctrineIntegration/TypeInferenceTest.php index ba2c4fd6..0382118b 100644 --- a/tests/DoctrineIntegration/TypeInferenceTest.php +++ b/tests/DoctrineIntegration/TypeInferenceTest.php @@ -7,9 +7,6 @@ class TypeInferenceTest extends TypeInferenceTestCase { - /** - * @return iterable - */ public function dataFileAsserts(): iterable { yield from $this->gatherAssertTypes(__DIR__ . '/data/getRepository.php'); diff --git a/tests/Platform/QueryResultTypeWalkerFetchTypeMatrixTest.php b/tests/Platform/QueryResultTypeWalkerFetchTypeMatrixTest.php index 04cbb552..28a127c3 100644 --- a/tests/Platform/QueryResultTypeWalkerFetchTypeMatrixTest.php +++ b/tests/Platform/QueryResultTypeWalkerFetchTypeMatrixTest.php @@ -630,3803 +630,3803 @@ public static function provideCases(): iterable { yield ' -1' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT -1 FROM %s t', - 'mysql' => new ConstantIntegerType(-1), - 'sqlite' => new ConstantIntegerType(-1), - 'pdo_pgsql' => new ConstantIntegerType(-1), - 'pgsql' => new ConstantIntegerType(-1), - 'mssql' => self::mixed(), - 'mysqlResult' => -1, - 'sqliteResult' => -1, - 'pdoPgsqlResult' => -1, - 'pgsqlResult' => -1, - 'mssqlResult' => -1, + 'dqlTemplate' => 'SELECT -1 FROM %s t', + 'mysqlExpectedType' => new ConstantIntegerType(-1), + 'sqliteExpectedType' => new ConstantIntegerType(-1), + 'pdoPgsqlExpectedType' => new ConstantIntegerType(-1), + 'pgsqlExpectedType' => new ConstantIntegerType(-1), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => -1, + 'sqliteExpectedResult' => -1, + 'pdoPgsqlExpectedResult' => -1, + 'pgsqlExpectedResult' => -1, + 'mssqlExpectedResult' => -1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield ' 1' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT 1 FROM %s t', - 'mysql' => new ConstantIntegerType(1), - 'sqlite' => new ConstantIntegerType(1), - 'pdo_pgsql' => new ConstantIntegerType(1), - 'pgsql' => new ConstantIntegerType(1), - 'mssql' => self::mixed(), - 'mysqlResult' => 1, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT 1 FROM %s t', + 'mysqlExpectedType' => new ConstantIntegerType(1), + 'sqliteExpectedType' => new ConstantIntegerType(1), + 'pdoPgsqlExpectedType' => new ConstantIntegerType(1), + 'pgsqlExpectedType' => new ConstantIntegerType(1), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield ' 1.0' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT 1.0 FROM %s t', - 'mysql' => new ConstantStringType('1.0'), - 'sqlite' => new ConstantFloatType(1.0), - 'pdo_pgsql' => new ConstantStringType('1.0'), - 'pgsql' => new ConstantStringType('1.0'), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.0', - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => '1.0', - 'pgsqlResult' => '1.0', - 'mssqlResult' => '1.0', + 'dqlTemplate' => 'SELECT 1.0 FROM %s t', + 'mysqlExpectedType' => new ConstantStringType('1.0'), + 'sqliteExpectedType' => new ConstantFloatType(1.0), + 'pdoPgsqlExpectedType' => new ConstantStringType('1.0'), + 'pgsqlExpectedType' => new ConstantStringType('1.0'), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.0', + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => '1.0', + 'pgsqlExpectedResult' => '1.0', + 'mssqlExpectedResult' => '1.0', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield ' 1.00' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT 1.00 FROM %s t', - 'mysql' => new ConstantStringType('1.00'), - 'sqlite' => new ConstantFloatType(1.0), - 'pdo_pgsql' => new ConstantStringType('1.00'), - 'pgsql' => new ConstantStringType('1.00'), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.00', - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => '1.00', - 'pgsqlResult' => '1.00', - 'mssqlResult' => '1.00', + 'dqlTemplate' => 'SELECT 1.00 FROM %s t', + 'mysqlExpectedType' => new ConstantStringType('1.00'), + 'sqliteExpectedType' => new ConstantFloatType(1.0), + 'pdoPgsqlExpectedType' => new ConstantStringType('1.00'), + 'pgsqlExpectedType' => new ConstantStringType('1.00'), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.00', + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => '1.00', + 'pgsqlExpectedResult' => '1.00', + 'mssqlExpectedResult' => '1.00', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield ' 0.1' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT 0.1 FROM %s t', - 'mysql' => new ConstantStringType('0.1'), - 'sqlite' => new ConstantFloatType(0.1), - 'pdo_pgsql' => new ConstantStringType('0.1'), - 'pgsql' => new ConstantStringType('0.1'), - 'mssql' => self::mixed(), - 'mysqlResult' => '0.1', - 'sqliteResult' => 0.1, - 'pdoPgsqlResult' => '0.1', - 'pgsqlResult' => '0.1', - 'mssqlResult' => '.1', + 'dqlTemplate' => 'SELECT 0.1 FROM %s t', + 'mysqlExpectedType' => new ConstantStringType('0.1'), + 'sqliteExpectedType' => new ConstantFloatType(0.1), + 'pdoPgsqlExpectedType' => new ConstantStringType('0.1'), + 'pgsqlExpectedType' => new ConstantStringType('0.1'), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '0.1', + 'sqliteExpectedResult' => 0.1, + 'pdoPgsqlExpectedResult' => '0.1', + 'pgsqlExpectedResult' => '0.1', + 'mssqlExpectedResult' => '.1', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield ' 0.10' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT 0.10 FROM %s t', - 'mysql' => new ConstantStringType('0.10'), - 'sqlite' => new ConstantFloatType(0.1), - 'pdo_pgsql' => new ConstantStringType('0.10'), - 'pgsql' => new ConstantStringType('0.10'), - 'mssql' => self::mixed(), - 'mysqlResult' => '0.10', - 'sqliteResult' => 0.1, - 'pdoPgsqlResult' => '0.10', - 'pgsqlResult' => '0.10', - 'mssqlResult' => '.10', + 'dqlTemplate' => 'SELECT 0.10 FROM %s t', + 'mysqlExpectedType' => new ConstantStringType('0.10'), + 'sqliteExpectedType' => new ConstantFloatType(0.1), + 'pdoPgsqlExpectedType' => new ConstantStringType('0.10'), + 'pgsqlExpectedType' => new ConstantStringType('0.10'), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '0.10', + 'sqliteExpectedResult' => 0.1, + 'pdoPgsqlExpectedResult' => '0.10', + 'pgsqlExpectedResult' => '0.10', + 'mssqlExpectedResult' => '.10', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield '0.125e0' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT 0.125e0 FROM %s t', - 'mysql' => new ConstantFloatType(0.125), - 'sqlite' => new ConstantFloatType(0.125), - 'pdo_pgsql' => new ConstantStringType('0.125'), - 'pgsql' => new ConstantStringType('0.125'), - 'mssql' => self::mixed(), - 'mysqlResult' => 0.125, - 'sqliteResult' => 0.125, - 'pdoPgsqlResult' => '0.125', - 'pgsqlResult' => '0.125', - 'mssqlResult' => 0.125, + 'dqlTemplate' => 'SELECT 0.125e0 FROM %s t', + 'mysqlExpectedType' => new ConstantFloatType(0.125), + 'sqliteExpectedType' => new ConstantFloatType(0.125), + 'pdoPgsqlExpectedType' => new ConstantStringType('0.125'), + 'pgsqlExpectedType' => new ConstantStringType('0.125'), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0.125, + 'sqliteExpectedResult' => 0.125, + 'pdoPgsqlExpectedResult' => '0.125', + 'pgsqlExpectedResult' => '0.125', + 'mssqlExpectedResult' => 0.125, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield ' 1e0' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT 1e0 FROM %s t', - 'mysql' => new ConstantFloatType(1.0), - 'sqlite' => new ConstantFloatType(1.0), - 'pdo_pgsql' => new ConstantStringType('1'), - 'pgsql' => new ConstantStringType('1'), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => '1', - 'pgsqlResult' => '1', - 'mssqlResult' => 1.0, + 'dqlTemplate' => 'SELECT 1e0 FROM %s t', + 'mysqlExpectedType' => new ConstantFloatType(1.0), + 'sqliteExpectedType' => new ConstantFloatType(1.0), + 'pdoPgsqlExpectedType' => new ConstantStringType('1'), + 'pgsqlExpectedType' => new ConstantStringType('1'), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => '1', + 'pgsqlExpectedResult' => '1', + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield " '1'" => [ 'data' => self::dataDefault(), - 'select' => "SELECT '1' FROM %s t", - 'mysql' => new ConstantStringType('1'), - 'sqlite' => new ConstantStringType('1'), - 'pdo_pgsql' => new ConstantStringType('1'), - 'pgsql' => new ConstantStringType('1'), - 'mssql' => self::mixed(), - 'mysqlResult' => '1', - 'sqliteResult' => '1', - 'pdoPgsqlResult' => '1', - 'pgsqlResult' => '1', - 'mssqlResult' => '1', + 'dqlTemplate' => "SELECT '1' FROM %s t", + 'mysqlExpectedType' => new ConstantStringType('1'), + 'sqliteExpectedType' => new ConstantStringType('1'), + 'pdoPgsqlExpectedType' => new ConstantStringType('1'), + 'pgsqlExpectedType' => new ConstantStringType('1'), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1', + 'sqliteExpectedResult' => '1', + 'pdoPgsqlExpectedResult' => '1', + 'pgsqlExpectedResult' => '1', + 'mssqlExpectedResult' => '1', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield " '1e0'" => [ 'data' => self::dataDefault(), - 'select' => "SELECT '1e0' FROM %s t", - 'mysql' => new ConstantStringType('1e0'), - 'sqlite' => new ConstantStringType('1e0'), - 'pdo_pgsql' => new ConstantStringType('1e0'), - 'pgsql' => new ConstantStringType('1e0'), - 'mssql' => self::mixed(), - 'mysqlResult' => '1e0', - 'sqliteResult' => '1e0', - 'pdoPgsqlResult' => '1e0', - 'pgsqlResult' => '1e0', - 'mssqlResult' => '1e0', + 'dqlTemplate' => "SELECT '1e0' FROM %s t", + 'mysqlExpectedType' => new ConstantStringType('1e0'), + 'sqliteExpectedType' => new ConstantStringType('1e0'), + 'pdoPgsqlExpectedType' => new ConstantStringType('1e0'), + 'pgsqlExpectedType' => new ConstantStringType('1e0'), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1e0', + 'sqliteExpectedResult' => '1e0', + 'pdoPgsqlExpectedResult' => '1e0', + 'pgsqlExpectedResult' => '1e0', + 'mssqlExpectedResult' => '1e0', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield '1 + 1' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT (1 + 1) FROM %s t', - 'mysql' => self::int(), - 'sqlite' => self::int(), - 'pdo_pgsql' => self::int(), - 'pgsql' => self::int(), - 'mssql' => self::mixed(), - 'mysqlResult' => 2, - 'sqliteResult' => 2, - 'pdoPgsqlResult' => 2, - 'pgsqlResult' => 2, - 'mssqlResult' => 2, + 'dqlTemplate' => 'SELECT (1 + 1) FROM %s t', + 'mysqlExpectedType' => self::int(), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => self::int(), + 'pgsqlExpectedType' => self::int(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 2, + 'sqliteExpectedResult' => 2, + 'pdoPgsqlExpectedResult' => 2, + 'pgsqlExpectedResult' => 2, + 'mssqlExpectedResult' => 2, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "1 + 'foo'" => [ 'data' => self::dataDefault(), - 'select' => "SELECT (1 + 'foo') FROM %s t", - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => null, // Invalid text representation - 'pgsql' => null, // Invalid text representation - 'mssql' => null, // Conversion failed - 'mysqlResult' => 1.0, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => "SELECT (1 + 'foo') FROM %s t", + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => null, // Invalid text representation + 'pgsqlExpectedType' => null, // Invalid text representation + 'mssqlExpectedType' => null, // Conversion failed + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "1 + '1.0'" => [ 'data' => self::dataDefault(), - 'select' => "SELECT (1 + '1.0') FROM %s t", - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => null, // Invalid text representation - 'pgsql' => null, // Invalid text representation - 'mssql' => null, // Conversion failed - 'mysqlResult' => 2.0, - 'sqliteResult' => 2.0, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => "SELECT (1 + '1.0') FROM %s t", + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => null, // Invalid text representation + 'pgsqlExpectedType' => null, // Invalid text representation + 'mssqlExpectedType' => null, // Conversion failed + 'mysqlExpectedResult' => 2.0, + 'sqliteExpectedResult' => 2.0, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "1 + '1'" => [ 'data' => self::dataDefault(), - 'select' => "SELECT (1 + '1') FROM %s t", - 'mysql' => self::float(), - 'sqlite' => self::int(), - 'pdo_pgsql' => self::int(), - 'pgsql' => self::int(), - 'mssql' => self::mixed(), - 'mysqlResult' => 2.0, - 'sqliteResult' => 2, - 'pdoPgsqlResult' => 2, - 'pgsqlResult' => 2, - 'mssqlResult' => 2, + 'dqlTemplate' => "SELECT (1 + '1') FROM %s t", + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => self::int(), + 'pgsqlExpectedType' => self::int(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 2.0, + 'sqliteExpectedResult' => 2, + 'pdoPgsqlExpectedResult' => 2, + 'pgsqlExpectedResult' => 2, + 'mssqlExpectedResult' => 2, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "1 + '1e0'" => [ 'data' => self::dataDefault(), - 'select' => "SELECT (1 + '1e0') FROM %s t", - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => null, // Invalid text representation - 'pgsql' => null, // Invalid text representation - 'mssql' => null, // Conversion failed - 'mysqlResult' => 2.0, - 'sqliteResult' => 2.0, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => "SELECT (1 + '1e0') FROM %s t", + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => null, // Invalid text representation + 'pgsqlExpectedType' => null, // Invalid text representation + 'mssqlExpectedType' => null, // Conversion failed + 'mysqlExpectedResult' => 2.0, + 'sqliteExpectedResult' => 2.0, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield '1 + 1 * 1 - 1' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT (1 + 1 * 1 - 1) FROM %s t', - 'mysql' => self::int(), - 'sqlite' => self::int(), - 'pdo_pgsql' => self::int(), - 'pgsql' => self::int(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT (1 + 1 * 1 - 1) FROM %s t', + 'mysqlExpectedType' => self::int(), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => self::int(), + 'pgsqlExpectedType' => self::int(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield '1 + 1 * 1 / 1 - 1' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT (1 + 1 * 1 / 1 - 1) FROM %s t', - 'mysql' => self::numericString(true, true), - 'sqlite' => self::int(), - 'pdo_pgsql' => self::int(), - 'pgsql' => self::int(), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.0000', - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT (1 + 1 * 1 / 1 - 1) FROM %s t', + 'mysqlExpectedType' => self::numericString(true, true), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => self::int(), + 'pgsqlExpectedType' => self::int(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.0000', + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_int + t.col_int' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_int + t.col_int FROM %s t', - 'mysql' => self::int(), - 'sqlite' => self::int(), - 'pdo_pgsql' => self::int(), - 'pgsql' => self::int(), - 'mssql' => self::mixed(), - 'mysqlResult' => 18, - 'sqliteResult' => 18, - 'pdoPgsqlResult' => 18, - 'pgsqlResult' => 18, - 'mssqlResult' => 18, + 'dqlTemplate' => 'SELECT t.col_int + t.col_int FROM %s t', + 'mysqlExpectedType' => self::int(), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => self::int(), + 'pgsqlExpectedType' => self::int(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 18, + 'sqliteExpectedResult' => 18, + 'pdoPgsqlExpectedResult' => 18, + 'pgsqlExpectedResult' => 18, + 'mssqlExpectedResult' => 18, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_bigint + t.col_bigint' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_bigint + t.col_bigint FROM %s t', - 'mysql' => self::int(), - 'sqlite' => self::int(), - 'pdo_pgsql' => self::int(), - 'pgsql' => self::int(), - 'mssql' => self::mixed(), - 'mysqlResult' => 4294967296, - 'sqliteResult' => 4294967296, - 'pdoPgsqlResult' => 4294967296, - 'pgsqlResult' => 4294967296, - 'mssqlResult' => '4294967296', + 'dqlTemplate' => 'SELECT t.col_bigint + t.col_bigint FROM %s t', + 'mysqlExpectedType' => self::int(), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => self::int(), + 'pgsqlExpectedType' => self::int(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 4294967296, + 'sqliteExpectedResult' => 4294967296, + 'pdoPgsqlExpectedResult' => 4294967296, + 'pgsqlExpectedResult' => 4294967296, + 'mssqlExpectedResult' => '4294967296', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_int + t.col_float' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_int + t.col_float FROM %s t', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 9.125, - 'sqliteResult' => 9.125, - 'pdoPgsqlResult' => 9.125, - 'pgsqlResult' => 9.125, - 'mssqlResult' => 9.125, + 'dqlTemplate' => 'SELECT t.col_int + t.col_float FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 9.125, + 'sqliteExpectedResult' => 9.125, + 'pdoPgsqlExpectedResult' => 9.125, + 'pgsqlExpectedResult' => 9.125, + 'mssqlExpectedResult' => 9.125, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 't.col_int + t.col_mixed' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_int + t.col_mixed FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => self::mixed(), - 'pgsql' => self::mixed(), - 'mssql' => self::mixed(), - 'mysqlResult' => 10, - 'sqliteResult' => 10, - 'pdoPgsqlResult' => 10, - 'pgsqlResult' => 10, - 'mssqlResult' => 10, + 'dqlTemplate' => 'SELECT t.col_int + t.col_mixed FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => self::mixed(), + 'pgsqlExpectedType' => self::mixed(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 10, + 'sqliteExpectedResult' => 10, + 'pdoPgsqlExpectedResult' => 10, + 'pgsqlExpectedResult' => 10, + 'mssqlExpectedResult' => 10, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_bigint + t.col_float' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_bigint + t.col_float FROM %s t', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 2147483648.125, - 'sqliteResult' => 2147483648.125, - 'pdoPgsqlResult' => 2147483648.125, - 'pgsqlResult' => 2147483648.125, - 'mssqlResult' => 2147483648.125, + 'dqlTemplate' => 'SELECT t.col_bigint + t.col_float FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 2147483648.125, + 'sqliteExpectedResult' => 2147483648.125, + 'pdoPgsqlExpectedResult' => 2147483648.125, + 'pgsqlExpectedResult' => 2147483648.125, + 'mssqlExpectedResult' => 2147483648.125, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 't.col_bigint + t.col_float (int data)' => [ 'data' => self::dataAllIntLike(), - 'select' => 'SELECT t.col_bigint + t.col_float FROM %s t', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 2.0, - 'sqliteResult' => 2.0, - 'pdoPgsqlResult' => 2.0, - 'pgsqlResult' => 2.0, - 'mssqlResult' => 2.0, + 'dqlTemplate' => 'SELECT t.col_bigint + t.col_float FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 2.0, + 'sqliteExpectedResult' => 2.0, + 'pdoPgsqlExpectedResult' => 2.0, + 'pgsqlExpectedResult' => 2.0, + 'mssqlExpectedResult' => 2.0, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 't.col_float + t.col_float' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_float + t.col_float FROM %s t', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 0.25, - 'sqliteResult' => 0.25, - 'pdoPgsqlResult' => 0.25, - 'pgsqlResult' => 0.25, - 'mssqlResult' => 0.25, + 'dqlTemplate' => 'SELECT t.col_float + t.col_float FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0.25, + 'sqliteExpectedResult' => 0.25, + 'pdoPgsqlExpectedResult' => 0.25, + 'pgsqlExpectedResult' => 0.25, + 'mssqlExpectedResult' => 0.25, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 't.col_int + t.col_decimal' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_int + t.col_decimal FROM %s t', - 'mysql' => self::numericString(false, true), - 'sqlite' => self::floatOrInt(), - 'pdo_pgsql' => self::numericString(false, true), - 'pgsql' => self::numericString(false, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '9.1', - 'sqliteResult' => 9.1, - 'pdoPgsqlResult' => '9.1', - 'pgsqlResult' => '9.1', - 'mssqlResult' => '9.1', + 'dqlTemplate' => 'SELECT t.col_int + t.col_decimal FROM %s t', + 'mysqlExpectedType' => self::numericString(false, true), + 'sqliteExpectedType' => self::floatOrInt(), + 'pdoPgsqlExpectedType' => self::numericString(false, true), + 'pgsqlExpectedType' => self::numericString(false, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '9.1', + 'sqliteExpectedResult' => 9.1, + 'pdoPgsqlExpectedResult' => '9.1', + 'pgsqlExpectedResult' => '9.1', + 'mssqlExpectedResult' => '9.1', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_int + t.col_decimal (int data)' => [ 'data' => self::dataAllIntLike(), - 'select' => 'SELECT t.col_int + t.col_decimal FROM %s t', - 'mysql' => self::numericString(false, true), - 'sqlite' => self::floatOrInt(), - 'pdo_pgsql' => self::numericString(false, true), - 'pgsql' => self::numericString(false, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '2.0', - 'sqliteResult' => 2, - 'pdoPgsqlResult' => '2.0', - 'pgsqlResult' => '2.0', - 'mssqlResult' => '2.0', + 'dqlTemplate' => 'SELECT t.col_int + t.col_decimal FROM %s t', + 'mysqlExpectedType' => self::numericString(false, true), + 'sqliteExpectedType' => self::floatOrInt(), + 'pdoPgsqlExpectedType' => self::numericString(false, true), + 'pgsqlExpectedType' => self::numericString(false, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '2.0', + 'sqliteExpectedResult' => 2, + 'pdoPgsqlExpectedResult' => '2.0', + 'pgsqlExpectedResult' => '2.0', + 'mssqlExpectedResult' => '2.0', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_float + t.col_decimal' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_float + t.col_decimal FROM %s t', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 0.225, - 'sqliteResult' => 0.225, - 'pdoPgsqlResult' => 0.225, - 'pgsqlResult' => 0.225, - 'mssqlResult' => 0.225, + 'dqlTemplate' => 'SELECT t.col_float + t.col_decimal FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0.225, + 'sqliteExpectedResult' => 0.225, + 'pdoPgsqlExpectedResult' => 0.225, + 'pgsqlExpectedResult' => 0.225, + 'mssqlExpectedResult' => 0.225, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 't.col_float + t.col_decimal (int data)' => [ 'data' => self::dataAllIntLike(), - 'select' => 'SELECT t.col_float + t.col_decimal FROM %s t', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 2.0, - 'sqliteResult' => 2.0, - 'pdoPgsqlResult' => 2.0, - 'pgsqlResult' => 2.0, - 'mssqlResult' => 2.0, + 'dqlTemplate' => 'SELECT t.col_float + t.col_decimal FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 2.0, + 'sqliteExpectedResult' => 2.0, + 'pdoPgsqlExpectedResult' => 2.0, + 'pgsqlExpectedResult' => 2.0, + 'mssqlExpectedResult' => 2.0, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 't.col_decimal + t.col_decimal (int data)' => [ 'data' => self::dataAllIntLike(), - 'select' => 'SELECT t.col_decimal + t.col_decimal FROM %s t', - 'mysql' => self::numericString(false, true), - 'sqlite' => self::floatOrInt(), - 'pdo_pgsql' => self::numericString(false, true), - 'pgsql' => self::numericString(false, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '2.0', - 'sqliteResult' => 2, - 'pdoPgsqlResult' => '2.0', - 'pgsqlResult' => '2.0', - 'mssqlResult' => '2.0', + 'dqlTemplate' => 'SELECT t.col_decimal + t.col_decimal FROM %s t', + 'mysqlExpectedType' => self::numericString(false, true), + 'sqliteExpectedType' => self::floatOrInt(), + 'pdoPgsqlExpectedType' => self::numericString(false, true), + 'pgsqlExpectedType' => self::numericString(false, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '2.0', + 'sqliteExpectedResult' => 2, + 'pdoPgsqlExpectedResult' => '2.0', + 'pgsqlExpectedResult' => '2.0', + 'mssqlExpectedResult' => '2.0', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_int + t.col_float + t.col_decimal' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_int + t.col_float + t.col_decimal FROM %s t', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 9.225, - 'sqliteResult' => 9.225, - 'pdoPgsqlResult' => 9.225, - 'pgsqlResult' => 9.225, - 'mssqlResult' => 9.225, + 'dqlTemplate' => 'SELECT t.col_int + t.col_float + t.col_decimal FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 9.225, + 'sqliteExpectedResult' => 9.225, + 'pdoPgsqlExpectedResult' => 9.225, + 'pgsqlExpectedResult' => 9.225, + 'mssqlExpectedResult' => 9.225, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 't.col_decimal + t.col_decimal' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_decimal + t.col_decimal FROM %s t', - 'mysql' => self::numericString(false, true), - 'sqlite' => self::floatOrInt(), - 'pdo_pgsql' => self::numericString(false, true), - 'pgsql' => self::numericString(false, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '0.2', - 'sqliteResult' => 0.2, - 'pdoPgsqlResult' => '0.2', - 'pgsqlResult' => '0.2', - 'mssqlResult' => '.2', + 'dqlTemplate' => 'SELECT t.col_decimal + t.col_decimal FROM %s t', + 'mysqlExpectedType' => self::numericString(false, true), + 'sqliteExpectedType' => self::floatOrInt(), + 'pdoPgsqlExpectedType' => self::numericString(false, true), + 'pgsqlExpectedType' => self::numericString(false, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '0.2', + 'sqliteExpectedResult' => 0.2, + 'pdoPgsqlExpectedResult' => '0.2', + 'pgsqlExpectedResult' => '0.2', + 'mssqlExpectedResult' => '.2', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_int + t.col_string' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_int + t.col_string FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // Error converting data type - 'mysqlResult' => 9.0, - 'sqliteResult' => 9, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT t.col_int + t.col_string FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // Error converting data type + 'mysqlExpectedResult' => 9.0, + 'sqliteExpectedResult' => 9, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_int + t.col_string (int data)' => [ 'data' => self::dataAllIntLike(), - 'select' => 'SELECT t.col_int + t.col_string FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => self::mixed(), - 'mysqlResult' => 2.0, - 'sqliteResult' => 2, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => 2, + 'dqlTemplate' => 'SELECT t.col_int + t.col_string FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 2.0, + 'sqliteExpectedResult' => 2, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => 2, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_int + t.col_bool' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_int + t.col_bool FROM %s t', - 'mysql' => self::int(), - 'sqlite' => self::int(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, - 'mssql' => self::mixed(), // Undefined function - 'mysqlResult' => 10, - 'sqliteResult' => 10, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => 10, + 'dqlTemplate' => 'SELECT t.col_int + t.col_bool FROM %s t', + 'mysqlExpectedType' => self::int(), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, + 'mssqlExpectedType' => self::mixed(), // Undefined function + 'mysqlExpectedResult' => 10, + 'sqliteExpectedResult' => 10, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => 10, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_float + t.col_string' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_float + t.col_string FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // Error converting data type - 'mysqlResult' => 0.125, - 'sqliteResult' => 0.125, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT t.col_float + t.col_string FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // Error converting data type + 'mysqlExpectedResult' => 0.125, + 'sqliteExpectedResult' => 0.125, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_decimal + t.col_bool' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_decimal + t.col_bool FROM %s t', - 'mysql' => self::numericString(false, true), - 'sqlite' => self::floatOrInt(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => self::mixed(), - 'mysqlResult' => '1.1', - 'sqliteResult' => 1.1, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => '1.1', + 'dqlTemplate' => 'SELECT t.col_decimal + t.col_bool FROM %s t', + 'mysqlExpectedType' => self::numericString(false, true), + 'sqliteExpectedType' => self::floatOrInt(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.1', + 'sqliteExpectedResult' => 1.1, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => '1.1', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_decimal + t.col_string' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_decimal + t.col_string FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // Error converting data type - 'mysqlResult' => 0.1, - 'sqliteResult' => 0.1, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT t.col_decimal + t.col_string FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // Error converting data type + 'mysqlExpectedResult' => 0.1, + 'sqliteExpectedResult' => 0.1, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_int + t.col_int_nullable' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_int + t.col_int_nullable FROM %s t', - 'mysql' => self::intOrNull(), - 'sqlite' => self::intOrNull(), - 'pdo_pgsql' => self::intOrNull(), - 'pgsql' => self::intOrNull(), - 'mssql' => self::mixed(), - 'mysqlResult' => null, - 'sqliteResult' => null, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT t.col_int + t.col_int_nullable FROM %s t', + 'mysqlExpectedType' => self::intOrNull(), + 'sqliteExpectedType' => self::intOrNull(), + 'pdoPgsqlExpectedType' => self::intOrNull(), + 'pgsqlExpectedType' => self::intOrNull(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => null, + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_int / t.col_int' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_int / t.col_int FROM %s t', - 'mysql' => self::numericString(true, true), - 'sqlite' => self::int(), - 'pdo_pgsql' => self::int(), - 'pgsql' => self::int(), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.0000', - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT t.col_int / t.col_int FROM %s t', + 'mysqlExpectedType' => self::numericString(true, true), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => self::int(), + 'pgsqlExpectedType' => self::int(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.0000', + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_bigint / t.col_bigint' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_bigint / t.col_bigint FROM %s t', - 'mysql' => self::numericString(true, true), - 'sqlite' => self::int(), - 'pdo_pgsql' => self::int(), - 'pgsql' => self::int(), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.0000', - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => '1', + 'dqlTemplate' => 'SELECT t.col_bigint / t.col_bigint FROM %s t', + 'mysqlExpectedType' => self::numericString(true, true), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => self::int(), + 'pgsqlExpectedType' => self::int(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.0000', + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => '1', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_int / t.col_float' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_int / t.col_float FROM %s t', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 72.0, - 'sqliteResult' => 72.0, - 'pdoPgsqlResult' => 72.0, - 'pgsqlResult' => 72.0, - 'mssqlResult' => 72.0, + 'dqlTemplate' => 'SELECT t.col_int / t.col_float FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 72.0, + 'sqliteExpectedResult' => 72.0, + 'pdoPgsqlExpectedResult' => 72.0, + 'pgsqlExpectedResult' => 72.0, + 'mssqlExpectedResult' => 72.0, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 't.col_int / t.col_float / t.col_decimal' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_int / t.col_float / t.col_decimal FROM %s t', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 720.0, - 'sqliteResult' => 720.0, - 'pdoPgsqlResult' => 720.0, - 'pgsqlResult' => 720.0, - 'mssqlResult' => 720.0, + 'dqlTemplate' => 'SELECT t.col_int / t.col_float / t.col_decimal FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 720.0, + 'sqliteExpectedResult' => 720.0, + 'pdoPgsqlExpectedResult' => 720.0, + 'pgsqlExpectedResult' => 720.0, + 'mssqlExpectedResult' => 720.0, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 't.col_bigint / t.col_float' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_bigint / t.col_float FROM %s t', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 17179869184.0, - 'sqliteResult' => 17179869184.0, - 'pdoPgsqlResult' => 17179869184.0, - 'pgsqlResult' => 17179869184.0, - 'mssqlResult' => 17179869184.0, + 'dqlTemplate' => 'SELECT t.col_bigint / t.col_float FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 17179869184.0, + 'sqliteExpectedResult' => 17179869184.0, + 'pdoPgsqlExpectedResult' => 17179869184.0, + 'pgsqlExpectedResult' => 17179869184.0, + 'mssqlExpectedResult' => 17179869184.0, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 't.col_float / t.col_float' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_float / t.col_float FROM %s t', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => 1.0, - 'pgsqlResult' => 1.0, - 'mssqlResult' => 1.0, + 'dqlTemplate' => 'SELECT t.col_float / t.col_float FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => 1.0, + 'pgsqlExpectedResult' => 1.0, + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 't.col_int / t.col_decimal' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_int / t.col_decimal FROM %s t', - 'mysql' => self::numericString(false, true), - 'sqlite' => self::floatOrInt(), - 'pdo_pgsql' => self::numericString(false, true), - 'pgsql' => self::numericString(false, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '90.0000', - 'sqliteResult' => 90.0, - 'pdoPgsqlResult' => '90.0000000000000000', - 'pgsqlResult' => '90.0000000000000000', - 'mssqlResult' => '90.000000', + 'dqlTemplate' => 'SELECT t.col_int / t.col_decimal FROM %s t', + 'mysqlExpectedType' => self::numericString(false, true), + 'sqliteExpectedType' => self::floatOrInt(), + 'pdoPgsqlExpectedType' => self::numericString(false, true), + 'pgsqlExpectedType' => self::numericString(false, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '90.0000', + 'sqliteExpectedResult' => 90.0, + 'pdoPgsqlExpectedResult' => '90.0000000000000000', + 'pgsqlExpectedResult' => '90.0000000000000000', + 'mssqlExpectedResult' => '90.000000', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_int / t.col_decimal (int data)' => [ 'data' => self::dataAllIntLike(), - 'select' => 'SELECT t.col_int / t.col_decimal FROM %s t', - 'mysql' => self::numericString(false, true), - 'sqlite' => self::floatOrInt(), - 'pdo_pgsql' => self::numericString(false, true), - 'pgsql' => self::numericString(false, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.0000', - 'sqliteResult' => 1, - 'pdoPgsqlResult' => '1.00000000000000000000', - 'pgsqlResult' => '1.00000000000000000000', - 'mssqlResult' => '1.000000', + 'dqlTemplate' => 'SELECT t.col_int / t.col_decimal FROM %s t', + 'mysqlExpectedType' => self::numericString(false, true), + 'sqliteExpectedType' => self::floatOrInt(), + 'pdoPgsqlExpectedType' => self::numericString(false, true), + 'pgsqlExpectedType' => self::numericString(false, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.0000', + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => '1.00000000000000000000', + 'pgsqlExpectedResult' => '1.00000000000000000000', + 'mssqlExpectedResult' => '1.000000', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_float / t.col_decimal' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_float / t.col_decimal FROM %s t', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.25, - 'sqliteResult' => 1.25, - 'pdoPgsqlResult' => 1.25, - 'pgsqlResult' => 1.25, - 'mssqlResult' => 1.25, + 'dqlTemplate' => 'SELECT t.col_float / t.col_decimal FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.25, + 'sqliteExpectedResult' => 1.25, + 'pdoPgsqlExpectedResult' => 1.25, + 'pgsqlExpectedResult' => 1.25, + 'mssqlExpectedResult' => 1.25, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 't.col_decimal / t.col_decimal' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_decimal / t.col_decimal FROM %s t', - 'mysql' => self::numericString(false, true), - 'sqlite' => self::floatOrInt(), - 'pdo_pgsql' => self::numericString(false, true), - 'pgsql' => self::numericString(false, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.00000', - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => '1.00000000000000000000', - 'pgsqlResult' => '1.00000000000000000000', - 'mssqlResult' => '1.000000', + 'dqlTemplate' => 'SELECT t.col_decimal / t.col_decimal FROM %s t', + 'mysqlExpectedType' => self::numericString(false, true), + 'sqliteExpectedType' => self::floatOrInt(), + 'pdoPgsqlExpectedType' => self::numericString(false, true), + 'pgsqlExpectedType' => self::numericString(false, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.00000', + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => '1.00000000000000000000', + 'pgsqlExpectedResult' => '1.00000000000000000000', + 'mssqlExpectedResult' => '1.000000', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_decimal / t.col_decimal (int data)' => [ 'data' => self::dataAllIntLike(), - 'select' => 'SELECT t.col_decimal / t.col_decimal FROM %s t', - 'mysql' => self::numericString(false, true), - 'sqlite' => self::floatOrInt(), - 'pdo_pgsql' => self::numericString(false, true), - 'pgsql' => self::numericString(false, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.00000', - 'sqliteResult' => 1, - 'pdoPgsqlResult' => '1.00000000000000000000', - 'pgsqlResult' => '1.00000000000000000000', - 'mssqlResult' => '1.000000', + 'dqlTemplate' => 'SELECT t.col_decimal / t.col_decimal FROM %s t', + 'mysqlExpectedType' => self::numericString(false, true), + 'sqliteExpectedType' => self::floatOrInt(), + 'pdoPgsqlExpectedType' => self::numericString(false, true), + 'pgsqlExpectedType' => self::numericString(false, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.00000', + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => '1.00000000000000000000', + 'pgsqlExpectedResult' => '1.00000000000000000000', + 'mssqlExpectedResult' => '1.000000', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_decimal / t.col_mixed' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_decimal / t.col_mixed FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => self::mixed(), - 'pgsql' => self::mixed(), - 'mssql' => self::mixed(), - 'mysqlResult' => '0.10000', - 'sqliteResult' => 0.1, - 'pdoPgsqlResult' => '0.10000000000000000000', - 'pgsqlResult' => '0.10000000000000000000', - 'mssqlResult' => '.100000000000', + 'dqlTemplate' => 'SELECT t.col_decimal / t.col_mixed FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => self::mixed(), + 'pgsqlExpectedType' => self::mixed(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '0.10000', + 'sqliteExpectedResult' => 0.1, + 'pdoPgsqlExpectedResult' => '0.10000000000000000000', + 'pgsqlExpectedResult' => '0.10000000000000000000', + 'mssqlExpectedResult' => '.100000000000', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_int / t.col_string' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_int / t.col_string FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // Conversion failed - 'mysqlResult' => null, - 'sqliteResult' => null, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT t.col_int / t.col_string FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // Conversion failed + 'mysqlExpectedResult' => null, + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_int / t.col_string (int data)' => [ 'data' => self::dataAllIntLike(), - 'select' => 'SELECT t.col_int / t.col_string FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT t.col_int / t.col_string FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_string / t.col_int' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_string / t.col_int FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // Conversion failed - 'mysqlResult' => 0.0, - 'sqliteResult' => 0, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT t.col_string / t.col_int FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // Conversion failed + 'mysqlExpectedResult' => 0.0, + 'sqliteExpectedResult' => 0, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_int / t.col_bool' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_int / t.col_bool FROM %s t', - 'mysql' => self::numericString(true, true), - 'sqlite' => self::int(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => self::mixed(), - 'mysqlResult' => '9.0000', - 'sqliteResult' => 9, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => 9, + 'dqlTemplate' => 'SELECT t.col_int / t.col_bool FROM %s t', + 'mysqlExpectedType' => self::numericString(true, true), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '9.0000', + 'sqliteExpectedResult' => 9, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => 9, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_float / t.col_string' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_float / t.col_string FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // Error converting data type - 'mysqlResult' => null, - 'sqliteResult' => null, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT t.col_float / t.col_string FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // Error converting data type + 'mysqlExpectedResult' => null, + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_string / t.col_float' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_string / t.col_float FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // Error converting data type - 'mysqlResult' => 0.0, - 'sqliteResult' => 0.0, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT t.col_string / t.col_float FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // Error converting data type + 'mysqlExpectedResult' => 0.0, + 'sqliteExpectedResult' => 0.0, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_decimal / t.col_bool' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_decimal / t.col_bool FROM %s t', - 'mysql' => self::numericString(false, true), - 'sqlite' => self::floatOrInt(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => self::mixed(), - 'mysqlResult' => '0.10000', - 'sqliteResult' => 0.1, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => '.100000', + 'dqlTemplate' => 'SELECT t.col_decimal / t.col_bool FROM %s t', + 'mysqlExpectedType' => self::numericString(false, true), + 'sqliteExpectedType' => self::floatOrInt(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '0.10000', + 'sqliteExpectedResult' => 0.1, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => '.100000', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_decimal / t.col_bool (int data)' => [ 'data' => self::dataAllIntLike(), - 'select' => 'SELECT t.col_decimal / t.col_bool FROM %s t', - 'mysql' => self::numericString(false, true), - 'sqlite' => self::floatOrInt(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => self::mixed(), - 'mysqlResult' => '1.00000', - 'sqliteResult' => 1, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => '1.000000', + 'dqlTemplate' => 'SELECT t.col_decimal / t.col_bool FROM %s t', + 'mysqlExpectedType' => self::numericString(false, true), + 'sqliteExpectedType' => self::floatOrInt(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.00000', + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => '1.000000', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_decimal / t.col_string' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_decimal / t.col_string FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // Error converting data type - 'mysqlResult' => null, - 'sqliteResult' => null, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT t.col_decimal / t.col_string FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // Error converting data type + 'mysqlExpectedResult' => null, + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_string / t.col_decimal' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_string / t.col_decimal FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // Error converting data type - 'mysqlResult' => 0.0, - 'sqliteResult' => 0.0, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT t.col_string / t.col_decimal FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // Error converting data type + 'mysqlExpectedResult' => 0.0, + 'sqliteExpectedResult' => 0.0, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 't.col_int / t.col_int_nullable' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_int / t.col_int_nullable FROM %s t', - 'mysql' => self::numericStringOrNull(true, true), - 'sqlite' => self::intOrNull(), - 'pdo_pgsql' => self::intOrNull(), - 'pgsql' => self::intOrNull(), - 'mssql' => self::mixed(), - 'mysqlResult' => null, - 'sqliteResult' => null, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT t.col_int / t.col_int_nullable FROM %s t', + 'mysqlExpectedType' => self::numericStringOrNull(true, true), + 'sqliteExpectedType' => self::intOrNull(), + 'pdoPgsqlExpectedType' => self::intOrNull(), + 'pgsqlExpectedType' => self::intOrNull(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => null, + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield '1 - 1' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT (1 - 1) FROM %s t', - 'mysql' => self::int(), - 'sqlite' => self::int(), - 'pdo_pgsql' => self::int(), - 'pgsql' => self::int(), - 'mssql' => self::mixed(), - 'mysqlResult' => 0, - 'sqliteResult' => 0, - 'pdoPgsqlResult' => 0, - 'pgsqlResult' => 0, - 'mssqlResult' => 0, + 'dqlTemplate' => 'SELECT (1 - 1) FROM %s t', + 'mysqlExpectedType' => self::int(), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => self::int(), + 'pgsqlExpectedType' => self::int(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0, + 'sqliteExpectedResult' => 0, + 'pdoPgsqlExpectedResult' => 0, + 'pgsqlExpectedResult' => 0, + 'mssqlExpectedResult' => 0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield '1 * 1' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT (1 * 1) FROM %s t', - 'mysql' => self::int(), - 'sqlite' => self::int(), - 'pdo_pgsql' => self::int(), - 'pgsql' => self::int(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT (1 * 1) FROM %s t', + 'mysqlExpectedType' => self::int(), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => self::int(), + 'pgsqlExpectedType' => self::int(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "1 * '1'" => [ 'data' => self::dataDefault(), - 'select' => "SELECT (1 * '1') FROM %s t", - 'mysql' => self::float(), - 'sqlite' => self::int(), - 'pdo_pgsql' => self::int(), - 'pgsql' => self::int(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => "SELECT (1 * '1') FROM %s t", + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => self::int(), + 'pgsqlExpectedType' => self::int(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "1 * '1.0'" => [ 'data' => self::dataDefault(), - 'select' => "SELECT (1 * '1.0') FROM %s t", - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => null, // Invalid text representation - 'pgsql' => null, // Invalid text representation - 'mssql' => null, // Conversion failed - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => "SELECT (1 * '1.0') FROM %s t", + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => null, // Invalid text representation + 'pgsqlExpectedType' => null, // Invalid text representation + 'mssqlExpectedType' => null, // Conversion failed + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield '1 / 1' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT (1 / 1) FROM %s t', - 'mysql' => self::numericString(true, true), - 'sqlite' => self::int(), - 'pdo_pgsql' => self::int(), - 'pgsql' => self::int(), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.0000', - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT (1 / 1) FROM %s t', + 'mysqlExpectedType' => self::numericString(true, true), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => self::int(), + 'pgsqlExpectedType' => self::int(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.0000', + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield '1 / 1.0' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT (1 / 1.0) FROM %s t', - 'mysql' => self::numericString(true, true), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::numericString(true, true), - 'pgsql' => self::numericString(true, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.0000', - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => '1.00000000000000000000', - 'pgsqlResult' => '1.00000000000000000000', - 'mssqlResult' => '1.000000', + 'dqlTemplate' => 'SELECT (1 / 1.0) FROM %s t', + 'mysqlExpectedType' => self::numericString(true, true), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::numericString(true, true), + 'pgsqlExpectedType' => self::numericString(true, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.0000', + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => '1.00000000000000000000', + 'pgsqlExpectedResult' => '1.00000000000000000000', + 'mssqlExpectedResult' => '1.000000', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield '1 / 1e0' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT (1 / 1e0) FROM %s t', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::numericString(true, true), - 'pgsql' => self::numericString(true, true), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => '1.00000000000000000000', - 'pgsqlResult' => '1.00000000000000000000', - 'mssqlResult' => 1.0, + 'dqlTemplate' => 'SELECT (1 / 1e0) FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::numericString(true, true), + 'pgsqlExpectedType' => self::numericString(true, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => '1.00000000000000000000', + 'pgsqlExpectedResult' => '1.00000000000000000000', + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "'foo' / 1" => [ 'data' => self::dataDefault(), - 'select' => "SELECT ('foo' / 1) FROM %s t", - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => null, // Invalid text representation - 'pgsql' => null, // Invalid text representation - 'mssql' => null, // Conversion failed - 'mysqlResult' => 0.0, - 'sqliteResult' => 0, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => "SELECT ('foo' / 1) FROM %s t", + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => null, // Invalid text representation + 'pgsqlExpectedType' => null, // Invalid text representation + 'mssqlExpectedType' => null, // Conversion failed + 'mysqlExpectedResult' => 0.0, + 'sqliteExpectedResult' => 0, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "1 / 'foo'" => [ 'data' => self::dataDefault(), - 'select' => "SELECT (1 / 'foo') FROM %s t", - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => null, // Invalid text representation - 'pgsql' => null, // Invalid text representation - 'mssql' => null, // Conversion failed - 'mysqlResult' => null, - 'sqliteResult' => null, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => "SELECT (1 / 'foo') FROM %s t", + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => null, // Invalid text representation + 'pgsqlExpectedType' => null, // Invalid text representation + 'mssqlExpectedType' => null, // Conversion failed + 'mysqlExpectedResult' => null, + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "1 / '1'" => [ 'data' => self::dataDefault(), - 'select' => "SELECT (1 / '1') FROM %s t", - 'mysql' => self::float(), - 'sqlite' => self::int(), - 'pdo_pgsql' => self::int(), - 'pgsql' => self::int(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => "SELECT (1 / '1') FROM %s t", + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => self::int(), + 'pgsqlExpectedType' => self::int(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "'1' / 1" => [ 'data' => self::dataDefault(), - 'select' => "SELECT ('1' / 1) FROM %s t", - 'mysql' => self::float(), - 'sqlite' => self::int(), - 'pdo_pgsql' => self::int(), - 'pgsql' => self::int(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => "SELECT ('1' / 1) FROM %s t", + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => self::int(), + 'pgsqlExpectedType' => self::int(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "1 / '1.0'" => [ 'data' => self::dataDefault(), - 'select' => "SELECT (1 / '1.0') FROM %s t", - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => null, // Invalid text representation - 'pgsql' => null, // Invalid text representation - 'mssql' => null, // Conversion failed - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => "SELECT (1 / '1.0') FROM %s t", + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => null, // Invalid text representation + 'pgsqlExpectedType' => null, // Invalid text representation + 'mssqlExpectedType' => null, // Conversion failed + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield '2147483648 ' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT 2147483648 FROM %s t', - 'mysql' => new ConstantIntegerType(2147483648), - 'sqlite' => new ConstantIntegerType(2147483648), - 'pdo_pgsql' => new ConstantIntegerType(2147483648), - 'pgsql' => new ConstantIntegerType(2147483648), - 'mssql' => self::mixed(), - 'mysqlResult' => 2147483648, - 'sqliteResult' => 2147483648, - 'pdoPgsqlResult' => 2147483648, - 'pgsqlResult' => 2147483648, - 'mssqlResult' => '2147483648', + 'dqlTemplate' => 'SELECT 2147483648 FROM %s t', + 'mysqlExpectedType' => new ConstantIntegerType(2147483648), + 'sqliteExpectedType' => new ConstantIntegerType(2147483648), + 'pdoPgsqlExpectedType' => new ConstantIntegerType(2147483648), + 'pgsqlExpectedType' => new ConstantIntegerType(2147483648), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 2147483648, + 'sqliteExpectedResult' => 2147483648, + 'pdoPgsqlExpectedResult' => 2147483648, + 'pgsqlExpectedResult' => 2147483648, + 'mssqlExpectedResult' => '2147483648', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "''" => [ 'data' => self::dataDefault(), - 'select' => 'SELECT \'\' FROM %s t', - 'mysql' => new ConstantStringType(''), - 'sqlite' => new ConstantStringType(''), - 'pdo_pgsql' => new ConstantStringType(''), - 'pgsql' => new ConstantStringType(''), - 'mssql' => self::mixed(), - 'mysqlResult' => '', - 'sqliteResult' => '', - 'pdoPgsqlResult' => '', - 'pgsqlResult' => '', - 'mssqlResult' => '', + 'dqlTemplate' => 'SELECT \'\' FROM %s t', + 'mysqlExpectedType' => new ConstantStringType(''), + 'sqliteExpectedType' => new ConstantStringType(''), + 'pdoPgsqlExpectedType' => new ConstantStringType(''), + 'pgsqlExpectedType' => new ConstantStringType(''), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '', + 'sqliteExpectedResult' => '', + 'pdoPgsqlExpectedResult' => '', + 'pgsqlExpectedResult' => '', + 'mssqlExpectedResult' => '', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield '(TRUE)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT (TRUE) FROM %s t', - 'mysql' => new ConstantIntegerType(1), - 'sqlite' => new ConstantIntegerType(1), - 'pdo_pgsql' => new ConstantBooleanType(true), - 'pgsql' => new ConstantBooleanType(true), - 'mssql' => self::mixed(), - 'mysqlResult' => 1, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => true, - 'pgsqlResult' => true, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT (TRUE) FROM %s t', + 'mysqlExpectedType' => new ConstantIntegerType(1), + 'sqliteExpectedType' => new ConstantIntegerType(1), + 'pdoPgsqlExpectedType' => new ConstantBooleanType(true), + 'pgsqlExpectedType' => new ConstantBooleanType(true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => true, + 'pgsqlExpectedResult' => true, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_PG_BOOL, ]; yield '(FALSE)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT (FALSE) FROM %s t', - 'mysql' => new ConstantIntegerType(0), - 'sqlite' => new ConstantIntegerType(0), - 'pdo_pgsql' => new ConstantBooleanType(false), - 'pgsql' => new ConstantBooleanType(false), - 'mssql' => self::mixed(), - 'mysqlResult' => 0, - 'sqliteResult' => 0, - 'pdoPgsqlResult' => false, - 'pgsqlResult' => false, - 'mssqlResult' => 0, + 'dqlTemplate' => 'SELECT (FALSE) FROM %s t', + 'mysqlExpectedType' => new ConstantIntegerType(0), + 'sqliteExpectedType' => new ConstantIntegerType(0), + 'pdoPgsqlExpectedType' => new ConstantBooleanType(false), + 'pgsqlExpectedType' => new ConstantBooleanType(false), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0, + 'sqliteExpectedResult' => 0, + 'pdoPgsqlExpectedResult' => false, + 'pgsqlExpectedResult' => false, + 'mssqlExpectedResult' => 0, 'stringify' => self::STRINGIFY_PG_BOOL, ]; yield 't.col_bool' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_bool FROM %s t', - 'mysql' => self::bool(), - 'sqlite' => self::bool(), - 'pdo_pgsql' => self::bool(), - 'pgsql' => self::bool(), - 'mssql' => self::bool(), - 'mysqlResult' => true, - 'sqliteResult' => true, - 'pdoPgsqlResult' => true, - 'pgsqlResult' => true, - 'mssqlResult' => true, + 'dqlTemplate' => 'SELECT t.col_bool FROM %s t', + 'mysqlExpectedType' => self::bool(), + 'sqliteExpectedType' => self::bool(), + 'pdoPgsqlExpectedType' => self::bool(), + 'pgsqlExpectedType' => self::bool(), + 'mssqlExpectedType' => self::bool(), + 'mysqlExpectedResult' => true, + 'sqliteExpectedResult' => true, + 'pdoPgsqlExpectedResult' => true, + 'pgsqlExpectedResult' => true, + 'mssqlExpectedResult' => true, 'stringify' => self::STRINGIFY_NONE, ]; yield 't.col_bool_nullable' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_bool_nullable FROM %s t', - 'mysql' => self::boolOrNull(), - 'sqlite' => self::boolOrNull(), - 'pdo_pgsql' => self::boolOrNull(), - 'pgsql' => self::boolOrNull(), - 'mssql' => self::boolOrNull(), - 'mysqlResult' => null, - 'sqliteResult' => null, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT t.col_bool_nullable FROM %s t', + 'mysqlExpectedType' => self::boolOrNull(), + 'sqliteExpectedType' => self::boolOrNull(), + 'pdoPgsqlExpectedType' => self::boolOrNull(), + 'pgsqlExpectedType' => self::boolOrNull(), + 'mssqlExpectedType' => self::boolOrNull(), + 'mysqlExpectedResult' => null, + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_NONE, ]; yield 'COALESCE(t.col_bool, t.col_bool)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COALESCE(t.col_bool, t.col_bool) FROM %s t', - 'mysql' => self::int(), - 'sqlite' => self::int(), - 'pdo_pgsql' => self::bool(), - 'pgsql' => self::bool(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => true, - 'pgsqlResult' => true, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT COALESCE(t.col_bool, t.col_bool) FROM %s t', + 'mysqlExpectedType' => self::int(), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => self::bool(), + 'pgsqlExpectedType' => self::bool(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => true, + 'pgsqlExpectedResult' => true, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_PG_BOOL, ]; yield 'COALESCE(t.col_decimal, t.col_decimal) + int data' => [ 'data' => self::dataAllIntLike(), - 'select' => 'SELECT COALESCE(t.col_decimal, t.col_decimal) FROM %s t', - 'mysql' => self::numericString(false, true), - 'sqlite' => self::floatOrInt(), - 'pdo_pgsql' => self::numericString(false, true), - 'pgsql' => self::numericString(false, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.0', - 'sqliteResult' => 1, - 'pdoPgsqlResult' => '1.0', - 'pgsqlResult' => '1.0', - 'mssqlResult' => '1.0', + 'dqlTemplate' => 'SELECT COALESCE(t.col_decimal, t.col_decimal) FROM %s t', + 'mysqlExpectedType' => self::numericString(false, true), + 'sqliteExpectedType' => self::floatOrInt(), + 'pdoPgsqlExpectedType' => self::numericString(false, true), + 'pgsqlExpectedType' => self::numericString(false, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.0', + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => '1.0', + 'pgsqlExpectedResult' => '1.0', + 'mssqlExpectedResult' => '1.0', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'COALESCE(t.col_float, t.col_float)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COALESCE(t.col_float, t.col_float) FROM %s t', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 0.125, - 'sqliteResult' => 0.125, - 'pdoPgsqlResult' => 0.125, - 'pgsqlResult' => 0.125, - 'mssqlResult' => 0.125, + 'dqlTemplate' => 'SELECT COALESCE(t.col_float, t.col_float) FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0.125, + 'sqliteExpectedResult' => 0.125, + 'pdoPgsqlExpectedResult' => 0.125, + 'pgsqlExpectedResult' => 0.125, + 'mssqlExpectedResult' => 0.125, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 'COALESCE(t.col_float, t.col_float) + int data' => [ 'data' => self::dataAllIntLike(), - 'select' => 'SELECT COALESCE(t.col_float, t.col_float) FROM %s t', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => 1.0, - 'pgsqlResult' => 1.0, - 'mssqlResult' => 1.0, + 'dqlTemplate' => 'SELECT COALESCE(t.col_float, t.col_float) FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => 1.0, + 'pgsqlExpectedResult' => 1.0, + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 't.col_decimal' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_decimal FROM %s t', - 'mysql' => self::numericString(false, true), - 'sqlite' => self::numericString(false, true), - 'pdo_pgsql' => self::numericString(false, true), - 'pgsql' => self::numericString(false, true), - 'mssql' => self::numericString(false, true), - 'mysqlResult' => '0.1', - 'sqliteResult' => '0.1', - 'pdoPgsqlResult' => '0.1', - 'pgsqlResult' => '0.1', - 'mssqlResult' => '.1', + 'dqlTemplate' => 'SELECT t.col_decimal FROM %s t', + 'mysqlExpectedType' => self::numericString(false, true), + 'sqliteExpectedType' => self::numericString(false, true), + 'pdoPgsqlExpectedType' => self::numericString(false, true), + 'pgsqlExpectedType' => self::numericString(false, true), + 'mssqlExpectedType' => self::numericString(false, true), + 'mysqlExpectedResult' => '0.1', + 'sqliteExpectedResult' => '0.1', + 'pdoPgsqlExpectedResult' => '0.1', + 'pgsqlExpectedResult' => '0.1', + 'mssqlExpectedResult' => '.1', 'stringify' => self::STRINGIFY_NONE, ]; yield 't.col_int' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_int FROM %s t', - 'mysql' => self::int(), - 'sqlite' => self::int(), - 'pdo_pgsql' => self::int(), - 'pgsql' => self::int(), - 'mssql' => self::int(), - 'mysqlResult' => 9, - 'sqliteResult' => 9, - 'pdoPgsqlResult' => 9, - 'pgsqlResult' => 9, - 'mssqlResult' => 9, + 'dqlTemplate' => 'SELECT t.col_int FROM %s t', + 'mysqlExpectedType' => self::int(), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => self::int(), + 'pgsqlExpectedType' => self::int(), + 'mssqlExpectedType' => self::int(), + 'mysqlExpectedResult' => 9, + 'sqliteExpectedResult' => 9, + 'pdoPgsqlExpectedResult' => 9, + 'pgsqlExpectedResult' => 9, + 'mssqlExpectedResult' => 9, 'stringify' => self::STRINGIFY_NONE, ]; yield 't.col_bigint' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_bigint FROM %s t', - 'mysql' => self::hasDbal4() ? self::int() : self::numericString(true, true), - 'sqlite' => self::hasDbal4() ? self::int() : self::numericString(true, true), - 'pdo_pgsql' => self::hasDbal4() ? self::int() : self::numericString(true, true), - 'pgsql' => self::hasDbal4() ? self::int() : self::numericString(true, true), - 'mssql' => self::hasDbal4() ? self::int() : self::numericString(true, true), - 'mysqlResult' => self::hasDbal4() ? 2147483648 : '2147483648', - 'sqliteResult' => self::hasDbal4() ? 2147483648 : '2147483648', - 'pdoPgsqlResult' => self::hasDbal4() ? 2147483648 : '2147483648', - 'pgsqlResult' => self::hasDbal4() ? 2147483648 : '2147483648', - 'mssqlResult' => self::hasDbal4() ? 2147483648 : '2147483648', + 'dqlTemplate' => 'SELECT t.col_bigint FROM %s t', + 'mysqlExpectedType' => self::hasDbal4() ? self::int() : self::numericString(true, true), + 'sqliteExpectedType' => self::hasDbal4() ? self::int() : self::numericString(true, true), + 'pdoPgsqlExpectedType' => self::hasDbal4() ? self::int() : self::numericString(true, true), + 'pgsqlExpectedType' => self::hasDbal4() ? self::int() : self::numericString(true, true), + 'mssqlExpectedType' => self::hasDbal4() ? self::int() : self::numericString(true, true), + 'mysqlExpectedResult' => self::hasDbal4() ? 2147483648 : '2147483648', + 'sqliteExpectedResult' => self::hasDbal4() ? 2147483648 : '2147483648', + 'pdoPgsqlExpectedResult' => self::hasDbal4() ? 2147483648 : '2147483648', + 'pgsqlExpectedResult' => self::hasDbal4() ? 2147483648 : '2147483648', + 'mssqlExpectedResult' => self::hasDbal4() ? 2147483648 : '2147483648', 'stringify' => self::STRINGIFY_NONE, ]; yield 't.col_float' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_float FROM %s t', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::float(), - 'mysqlResult' => 0.125, - 'sqliteResult' => 0.125, - 'pdoPgsqlResult' => 0.125, - 'pgsqlResult' => 0.125, - 'mssqlResult' => 0.125, + 'dqlTemplate' => 'SELECT t.col_float FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::float(), + 'mysqlExpectedResult' => 0.125, + 'sqliteExpectedResult' => 0.125, + 'pdoPgsqlExpectedResult' => 0.125, + 'pgsqlExpectedResult' => 0.125, + 'mssqlExpectedResult' => 0.125, 'stringify' => self::STRINGIFY_NONE, ]; yield 'AVG(t.col_float)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT AVG(t.col_float) FROM %s t', - 'mysql' => self::floatOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => self::floatOrNull(), - 'pgsql' => self::floatOrNull(), - 'mssql' => self::mixed(), - 'mysqlResult' => 0.125, - 'sqliteResult' => 0.125, - 'pdoPgsqlResult' => 0.125, - 'pgsqlResult' => 0.125, - 'mssqlResult' => 0.125, + 'dqlTemplate' => 'SELECT AVG(t.col_float) FROM %s t', + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => self::floatOrNull(), + 'pgsqlExpectedType' => self::floatOrNull(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0.125, + 'sqliteExpectedResult' => 0.125, + 'pdoPgsqlExpectedResult' => 0.125, + 'pgsqlExpectedResult' => 0.125, + 'mssqlExpectedResult' => 0.125, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 'AVG(t.col_float) + no data' => [ 'data' => self::dataNone(), - 'select' => 'SELECT AVG(t.col_float) FROM %s t', - 'mysql' => self::floatOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => self::floatOrNull(), - 'pgsql' => self::floatOrNull(), - 'mssql' => self::mixed(), - 'mysqlResult' => null, - 'sqliteResult' => null, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT AVG(t.col_float) FROM %s t', + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => self::floatOrNull(), + 'pgsqlExpectedType' => self::floatOrNull(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => null, + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 'AVG(t.col_float) + GROUP BY' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT AVG(t.col_float) FROM %s t GROUP BY t.col_int', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 0.125, - 'sqliteResult' => 0.125, - 'pdoPgsqlResult' => 0.125, - 'pgsqlResult' => 0.125, - 'mssqlResult' => 0.125, + 'dqlTemplate' => 'SELECT AVG(t.col_float) FROM %s t GROUP BY t.col_int', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0.125, + 'sqliteExpectedResult' => 0.125, + 'pdoPgsqlExpectedResult' => 0.125, + 'pgsqlExpectedResult' => 0.125, + 'mssqlExpectedResult' => 0.125, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 'AVG(t.col_float_nullable) + GROUP BY' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT AVG(t.col_float_nullable) FROM %s t GROUP BY t.col_int', - 'mysql' => self::floatOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => self::floatOrNull(), - 'pgsql' => self::floatOrNull(), - 'mssql' => self::mixed(), - 'mysqlResult' => null, - 'sqliteResult' => null, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT AVG(t.col_float_nullable) FROM %s t GROUP BY t.col_int', + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => self::floatOrNull(), + 'pgsqlExpectedType' => self::floatOrNull(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => null, + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 'AVG(t.col_decimal)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT AVG(t.col_decimal) FROM %s t', - 'mysql' => self::numericStringOrNull(false, true), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => self::numericStringOrNull(false, true), - 'pgsql' => self::numericStringOrNull(false, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '0.10000', - 'sqliteResult' => 0.1, - 'pdoPgsqlResult' => '0.10000000000000000000', - 'pgsqlResult' => '0.10000000000000000000', - 'mssqlResult' => '.100000', + 'dqlTemplate' => 'SELECT AVG(t.col_decimal) FROM %s t', + 'mysqlExpectedType' => self::numericStringOrNull(false, true), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => self::numericStringOrNull(false, true), + 'pgsqlExpectedType' => self::numericStringOrNull(false, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '0.10000', + 'sqliteExpectedResult' => 0.1, + 'pdoPgsqlExpectedResult' => '0.10000000000000000000', + 'pgsqlExpectedResult' => '0.10000000000000000000', + 'mssqlExpectedResult' => '.100000', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'AVG(t.col_decimal) + int data' => [ 'data' => self::dataAllIntLike(), - 'select' => 'SELECT AVG(t.col_decimal) FROM %s t', - 'mysql' => self::numericStringOrNull(false, true), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => self::numericStringOrNull(false, true), - 'pgsql' => self::numericStringOrNull(false, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.00000', - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => '1.00000000000000000000', - 'pgsqlResult' => '1.00000000000000000000', - 'mssqlResult' => '1.000000', + 'dqlTemplate' => 'SELECT AVG(t.col_decimal) FROM %s t', + 'mysqlExpectedType' => self::numericStringOrNull(false, true), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => self::numericStringOrNull(false, true), + 'pgsqlExpectedType' => self::numericStringOrNull(false, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.00000', + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => '1.00000000000000000000', + 'pgsqlExpectedResult' => '1.00000000000000000000', + 'mssqlExpectedResult' => '1.000000', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'AVG(t.col_mixed)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT AVG(t.col_mixed) FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::floatOrNull(), // always float|null, see https://www.sqlite.org/lang_aggfunc.html - 'pdo_pgsql' => self::mixed(), - 'pgsql' => self::mixed(), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.0000', - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => '1.00000000000000000000', - 'pgsqlResult' => '1.00000000000000000000', - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT AVG(t.col_mixed) FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::floatOrNull(), // always float|null, see https://www.sqlite.org/lang_aggfunc.html + 'pdoPgsqlExpectedType' => self::mixed(), + 'pgsqlExpectedType' => self::mixed(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.0000', + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => '1.00000000000000000000', + 'pgsqlExpectedResult' => '1.00000000000000000000', + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'AVG(t.col_int)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT AVG(t.col_int) FROM %s t', - 'mysql' => self::numericStringOrNull(true, true), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => self::numericStringOrNull(true, true), - 'pgsql' => self::numericStringOrNull(true, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '9.0000', - 'sqliteResult' => 9.0, - 'pdoPgsqlResult' => '9.0000000000000000', - 'pgsqlResult' => '9.0000000000000000', - 'mssqlResult' => 9, + 'dqlTemplate' => 'SELECT AVG(t.col_int) FROM %s t', + 'mysqlExpectedType' => self::numericStringOrNull(true, true), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => self::numericStringOrNull(true, true), + 'pgsqlExpectedType' => self::numericStringOrNull(true, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '9.0000', + 'sqliteExpectedResult' => 9.0, + 'pdoPgsqlExpectedResult' => '9.0000000000000000', + 'pgsqlExpectedResult' => '9.0000000000000000', + 'mssqlExpectedResult' => 9, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'AVG(t.col_bool)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT AVG(t.col_bool) FROM %s t', - 'mysql' => self::numericStringOrNull(true, true), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // perand data type bit is invalid for avg operator. - 'mysqlResult' => '1.0000', - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT AVG(t.col_bool) FROM %s t', + 'mysqlExpectedType' => self::numericStringOrNull(true, true), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // perand data type bit is invalid for avg operator. + 'mysqlExpectedResult' => '1.0000', + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'AVG(t.col_string)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT AVG(t.col_string) FROM %s t', - 'mysql' => self::floatOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // Operand data type nvarchar is invalid for avg operator - 'mysqlResult' => 0.0, - 'sqliteResult' => 0.0, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT AVG(t.col_string) FROM %s t', + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // Operand data type nvarchar is invalid for avg operator + 'mysqlExpectedResult' => 0.0, + 'sqliteExpectedResult' => 0.0, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'AVG(1)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT AVG(1) FROM %s t', - 'mysql' => self::numericStringOrNull(true, true), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => self::numericStringOrNull(true, true), - 'pgsql' => self::numericStringOrNull(true, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.0000', - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => '1.00000000000000000000', - 'pgsqlResult' => '1.00000000000000000000', - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT AVG(1) FROM %s t', + 'mysqlExpectedType' => self::numericStringOrNull(true, true), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => self::numericStringOrNull(true, true), + 'pgsqlExpectedType' => self::numericStringOrNull(true, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.0000', + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => '1.00000000000000000000', + 'pgsqlExpectedResult' => '1.00000000000000000000', + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "AVG('1')" => [ 'data' => self::dataDefault(), - 'select' => "SELECT AVG('1') FROM %s t", - 'mysql' => self::floatOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // Operand data type is invalid - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => "SELECT AVG('1') FROM %s t", + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // Operand data type is invalid + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "AVG('1.0')" => [ 'data' => self::dataDefault(), - 'select' => "SELECT AVG('1.0') FROM %s t", - 'mysql' => self::floatOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // Operand data type is invalid - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => "SELECT AVG('1.0') FROM %s t", + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // Operand data type is invalid + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "AVG('1e0')" => [ 'data' => self::dataDefault(), - 'select' => "SELECT AVG('1e0') FROM %s t", - 'mysql' => self::floatOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // Operand data type is invalid - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => "SELECT AVG('1e0') FROM %s t", + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // Operand data type is invalid + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "AVG('foo')" => [ 'data' => self::dataDefault(), - 'select' => "SELECT AVG('foo') FROM %s t", - 'mysql' => self::floatOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // Operand data type is invalid - 'mysqlResult' => 0.0, - 'sqliteResult' => 0.0, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => "SELECT AVG('foo') FROM %s t", + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // Operand data type is invalid + 'mysqlExpectedResult' => 0.0, + 'sqliteExpectedResult' => 0.0, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'AVG(1) + GROUP BY' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT AVG(1) FROM %s t GROUP BY t.col_int', - 'mysql' => self::numericString(true, true), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::numericString(true, true), - 'pgsql' => self::numericString(true, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.0000', - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => '1.00000000000000000000', - 'pgsqlResult' => '1.00000000000000000000', - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT AVG(1) FROM %s t GROUP BY t.col_int', + 'mysqlExpectedType' => self::numericString(true, true), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::numericString(true, true), + 'pgsqlExpectedType' => self::numericString(true, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.0000', + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => '1.00000000000000000000', + 'pgsqlExpectedResult' => '1.00000000000000000000', + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'AVG(1.0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT AVG(1.0) FROM %s t', - 'mysql' => self::numericStringOrNull(true, true), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => self::numericStringOrNull(true, true), - 'pgsql' => self::numericStringOrNull(true, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.00000', - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => '1.00000000000000000000', - 'pgsqlResult' => '1.00000000000000000000', - 'mssqlResult' => '1.000000', + 'dqlTemplate' => 'SELECT AVG(1.0) FROM %s t', + 'mysqlExpectedType' => self::numericStringOrNull(true, true), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => self::numericStringOrNull(true, true), + 'pgsqlExpectedType' => self::numericStringOrNull(true, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.00000', + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => '1.00000000000000000000', + 'pgsqlExpectedResult' => '1.00000000000000000000', + 'mssqlExpectedResult' => '1.000000', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'AVG(1e0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT AVG(1.0) FROM %s t', - 'mysql' => self::numericStringOrNull(true, true), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => self::numericStringOrNull(true, true), - 'pgsql' => self::numericStringOrNull(true, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.00000', - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => '1.00000000000000000000', - 'pgsqlResult' => '1.00000000000000000000', - 'mssqlResult' => '1.000000', + 'dqlTemplate' => 'SELECT AVG(1.0) FROM %s t', + 'mysqlExpectedType' => self::numericStringOrNull(true, true), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => self::numericStringOrNull(true, true), + 'pgsqlExpectedType' => self::numericStringOrNull(true, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.00000', + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => '1.00000000000000000000', + 'pgsqlExpectedResult' => '1.00000000000000000000', + 'mssqlExpectedResult' => '1.000000', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'AVG(t.col_bigint)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT AVG(t.col_bigint) FROM %s t', - 'mysql' => self::numericStringOrNull(true, true), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => self::numericStringOrNull(true, true), - 'pgsql' => self::numericStringOrNull(true, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '2147483648.0000', - 'sqliteResult' => 2147483648.0, - 'pdoPgsqlResult' => '2147483648.00000000', - 'pgsqlResult' => '2147483648.00000000', - 'mssqlResult' => '2147483648', + 'dqlTemplate' => 'SELECT AVG(t.col_bigint) FROM %s t', + 'mysqlExpectedType' => self::numericStringOrNull(true, true), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => self::numericStringOrNull(true, true), + 'pgsqlExpectedType' => self::numericStringOrNull(true, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '2147483648.0000', + 'sqliteExpectedResult' => 2147483648.0, + 'pdoPgsqlExpectedResult' => '2147483648.00000000', + 'pgsqlExpectedResult' => '2147483648.00000000', + 'mssqlExpectedResult' => '2147483648', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'SUM(t.col_float)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT SUM(t.col_float) FROM %s t', - 'mysql' => self::floatOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => self::floatOrNull(), - 'pgsql' => self::floatOrNull(), - 'mssql' => self::mixed(), - 'mysqlResult' => 0.125, - 'sqliteResult' => 0.125, - 'pdoPgsqlResult' => 0.125, - 'pgsqlResult' => 0.125, - 'mssqlResult' => 0.125, + 'dqlTemplate' => 'SELECT SUM(t.col_float) FROM %s t', + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => self::floatOrNull(), + 'pgsqlExpectedType' => self::floatOrNull(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0.125, + 'sqliteExpectedResult' => 0.125, + 'pdoPgsqlExpectedResult' => 0.125, + 'pgsqlExpectedResult' => 0.125, + 'mssqlExpectedResult' => 0.125, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 'SUM(t.col_float) + no data' => [ 'data' => self::dataNone(), - 'select' => 'SELECT SUM(t.col_float) FROM %s t', - 'mysql' => self::floatOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => self::floatOrNull(), - 'pgsql' => self::floatOrNull(), - 'mssql' => self::mixed(), - 'mysqlResult' => null, - 'sqliteResult' => null, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT SUM(t.col_float) FROM %s t', + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => self::floatOrNull(), + 'pgsqlExpectedType' => self::floatOrNull(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => null, + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 'SUM(t.col_float) + GROUP BY' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT SUM(t.col_float) FROM %s t GROUP BY t.col_int', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 0.125, - 'sqliteResult' => 0.125, - 'pdoPgsqlResult' => 0.125, - 'pgsqlResult' => 0.125, - 'mssqlResult' => 0.125, + 'dqlTemplate' => 'SELECT SUM(t.col_float) FROM %s t GROUP BY t.col_int', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0.125, + 'sqliteExpectedResult' => 0.125, + 'pdoPgsqlExpectedResult' => 0.125, + 'pgsqlExpectedResult' => 0.125, + 'mssqlExpectedResult' => 0.125, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield '1 + -(CASE WHEN MIN(t.col_float) = 0 THEN SUM(t.col_float) ELSE 0 END)' => [ // agg function (causing null) deeply inside AST 'data' => self::dataDefault(), - 'select' => 'SELECT 1 + -(CASE WHEN MIN(t.col_float) = 0 THEN SUM(t.col_float) ELSE 0 END) FROM %s t', - 'mysql' => self::floatOrNull(), - 'sqlite' => self::floatOrIntOrNull(), - 'pdo_pgsql' => self::floatOrNull(), - 'pgsql' => self::floatOrNull(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1.0, - 'pgsqlResult' => 1.0, - 'mssqlResult' => 1.0, + 'dqlTemplate' => 'SELECT 1 + -(CASE WHEN MIN(t.col_float) = 0 THEN SUM(t.col_float) ELSE 0 END) FROM %s t', + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::floatOrIntOrNull(), + 'pdoPgsqlExpectedType' => self::floatOrNull(), + 'pgsqlExpectedType' => self::floatOrNull(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1.0, + 'pgsqlExpectedResult' => 1.0, + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 'SUM(t.col_decimal)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT SUM(t.col_decimal) FROM %s t', - 'mysql' => self::numericStringOrNull(false, true), - 'sqlite' => self::floatOrIntOrNull(), - 'pdo_pgsql' => self::numericStringOrNull(false, true), - 'pgsql' => self::numericStringOrNull(false, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '0.1', - 'sqliteResult' => 0.1, - 'pdoPgsqlResult' => '0.1', - 'pgsqlResult' => '0.1', - 'mssqlResult' => '.1', + 'dqlTemplate' => 'SELECT SUM(t.col_decimal) FROM %s t', + 'mysqlExpectedType' => self::numericStringOrNull(false, true), + 'sqliteExpectedType' => self::floatOrIntOrNull(), + 'pdoPgsqlExpectedType' => self::numericStringOrNull(false, true), + 'pgsqlExpectedType' => self::numericStringOrNull(false, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '0.1', + 'sqliteExpectedResult' => 0.1, + 'pdoPgsqlExpectedResult' => '0.1', + 'pgsqlExpectedResult' => '0.1', + 'mssqlExpectedResult' => '.1', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'SUM(t.col_decimal) + int data' => [ 'data' => self::dataAllIntLike(), - 'select' => 'SELECT SUM(t.col_decimal) FROM %s t', - 'mysql' => self::numericStringOrNull(false, true), - 'sqlite' => self::floatOrIntOrNull(), - 'pdo_pgsql' => self::numericStringOrNull(false, true), - 'pgsql' => self::numericStringOrNull(false, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.0', - 'sqliteResult' => 1, - 'pdoPgsqlResult' => '1.0', - 'pgsqlResult' => '1.0', - 'mssqlResult' => '1.0', + 'dqlTemplate' => 'SELECT SUM(t.col_decimal) FROM %s t', + 'mysqlExpectedType' => self::numericStringOrNull(false, true), + 'sqliteExpectedType' => self::floatOrIntOrNull(), + 'pdoPgsqlExpectedType' => self::numericStringOrNull(false, true), + 'pgsqlExpectedType' => self::numericStringOrNull(false, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.0', + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => '1.0', + 'pgsqlExpectedResult' => '1.0', + 'mssqlExpectedResult' => '1.0', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'SUM(t.col_int)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT SUM(t.col_int) FROM %s t', - 'mysql' => self::numericStringOrNull(true, true), - 'sqlite' => self::intOrNull(), - 'pdo_pgsql' => TypeCombinator::union(self::numericStringOrNull(true, true), self::intOrNull()), - 'pgsql' => TypeCombinator::union(self::numericStringOrNull(true, true), self::intOrNull()), - 'mssql' => self::mixed(), - 'mysqlResult' => '9', - 'sqliteResult' => 9, - 'pdoPgsqlResult' => 9, - 'pgsqlResult' => 9, - 'mssqlResult' => 9, + 'dqlTemplate' => 'SELECT SUM(t.col_int) FROM %s t', + 'mysqlExpectedType' => self::numericStringOrNull(true, true), + 'sqliteExpectedType' => self::intOrNull(), + 'pdoPgsqlExpectedType' => TypeCombinator::union(self::numericStringOrNull(true, true), self::intOrNull()), + 'pgsqlExpectedType' => TypeCombinator::union(self::numericStringOrNull(true, true), self::intOrNull()), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '9', + 'sqliteExpectedResult' => 9, + 'pdoPgsqlExpectedResult' => 9, + 'pgsqlExpectedResult' => 9, + 'mssqlExpectedResult' => 9, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield '-SUM(t.col_int)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT -SUM(t.col_int) FROM %s t', - 'mysql' => self::numericStringOrNull(true, true), - 'sqlite' => self::intOrNull(), - 'pdo_pgsql' => TypeCombinator::union(self::numericStringOrNull(true, true), self::intOrNull()), - 'pgsql' => TypeCombinator::union(self::numericStringOrNull(true, true), self::intOrNull()), - 'mssql' => self::mixed(), - 'mysqlResult' => '-9', - 'sqliteResult' => -9, - 'pdoPgsqlResult' => -9, - 'pgsqlResult' => -9, - 'mssqlResult' => -9, + 'dqlTemplate' => 'SELECT -SUM(t.col_int) FROM %s t', + 'mysqlExpectedType' => self::numericStringOrNull(true, true), + 'sqliteExpectedType' => self::intOrNull(), + 'pdoPgsqlExpectedType' => TypeCombinator::union(self::numericStringOrNull(true, true), self::intOrNull()), + 'pgsqlExpectedType' => TypeCombinator::union(self::numericStringOrNull(true, true), self::intOrNull()), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '-9', + 'sqliteExpectedResult' => -9, + 'pdoPgsqlExpectedResult' => -9, + 'pgsqlExpectedResult' => -9, + 'mssqlExpectedResult' => -9, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield '-SUM(t.col_int) + no data' => [ 'data' => self::dataNone(), - 'select' => 'SELECT -SUM(t.col_int) FROM %s t', - 'mysql' => self::numericStringOrNull(true, true), - 'sqlite' => self::intOrNull(), - 'pdo_pgsql' => TypeCombinator::union(self::numericStringOrNull(true, true), self::intOrNull()), - 'pgsql' => TypeCombinator::union(self::numericStringOrNull(true, true), self::intOrNull()), - 'mssql' => self::mixed(), - 'mysqlResult' => null, - 'sqliteResult' => null, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT -SUM(t.col_int) FROM %s t', + 'mysqlExpectedType' => self::numericStringOrNull(true, true), + 'sqliteExpectedType' => self::intOrNull(), + 'pdoPgsqlExpectedType' => TypeCombinator::union(self::numericStringOrNull(true, true), self::intOrNull()), + 'pgsqlExpectedType' => TypeCombinator::union(self::numericStringOrNull(true, true), self::intOrNull()), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => null, + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'SUM(t.col_mixed)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT SUM(t.col_mixed) FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => self::mixed(), - 'pgsql' => self::mixed(), - 'mssql' => self::mixed(), - 'mysqlResult' => '1', - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT SUM(t.col_mixed) FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => self::mixed(), + 'pgsqlExpectedType' => self::mixed(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1', + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'SUM(t.col_bool)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT SUM(t.col_bool) FROM %s t', - 'mysql' => self::numericStringOrNull(true, true), - 'sqlite' => self::intOrNull(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // Operand data type is invalid - 'mysqlResult' => '1', - 'sqliteResult' => 1, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT SUM(t.col_bool) FROM %s t', + 'mysqlExpectedType' => self::numericStringOrNull(true, true), + 'sqliteExpectedType' => self::intOrNull(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // Operand data type is invalid + 'mysqlExpectedResult' => '1', + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'SUM(t.col_string)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT SUM(t.col_string) FROM %s t', - 'mysql' => self::floatOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // Operand data type is invalid - 'mysqlResult' => 0.0, - 'sqliteResult' => 0.0, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT SUM(t.col_string) FROM %s t', + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // Operand data type is invalid + 'mysqlExpectedResult' => 0.0, + 'sqliteExpectedResult' => 0.0, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "SUM('foo')" => [ 'data' => self::dataDefault(), - 'select' => "SELECT SUM('foo') FROM %s t", - 'mysql' => self::floatOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // Operand data type is invalid - 'mysqlResult' => 0.0, - 'sqliteResult' => 0.0, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => "SELECT SUM('foo') FROM %s t", + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // Operand data type is invalid + 'mysqlExpectedResult' => 0.0, + 'sqliteExpectedResult' => 0.0, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "SUM('1')" => [ 'data' => self::dataDefault(), - 'select' => "SELECT SUM('1') FROM %s t", - 'mysql' => self::floatOrNull(), - 'sqlite' => self::intOrNull(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // Operand data type is invalid - 'mysqlResult' => 1.0, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => "SELECT SUM('1') FROM %s t", + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::intOrNull(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // Operand data type is invalid + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "SUM('1.0')" => [ 'data' => self::dataDefault(), - 'select' => "SELECT SUM('1.0') FROM %s t", - 'mysql' => self::floatOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // Operand data type is invalid - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => "SELECT SUM('1.0') FROM %s t", + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // Operand data type is invalid + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "SUM('1.1')" => [ 'data' => self::dataDefault(), - 'select' => "SELECT SUM('1.1') FROM %s t", - 'mysql' => self::floatOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // Operand data type is invalid - 'mysqlResult' => 1.1, - 'sqliteResult' => 1.1, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => "SELECT SUM('1.1') FROM %s t", + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // Operand data type is invalid + 'mysqlExpectedResult' => 1.1, + 'sqliteExpectedResult' => 1.1, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'SUM(1)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT SUM(1) FROM %s t', - 'mysql' => self::numericStringOrNull(true, true), - 'sqlite' => self::intOrNull(), - 'pdo_pgsql' => TypeCombinator::union(self::numericStringOrNull(true, true), self::intOrNull()), - 'pgsql' => TypeCombinator::union(self::numericStringOrNull(true, true), self::intOrNull()), - 'mssql' => self::mixed(), - 'mysqlResult' => '1', - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT SUM(1) FROM %s t', + 'mysqlExpectedType' => self::numericStringOrNull(true, true), + 'sqliteExpectedType' => self::intOrNull(), + 'pdoPgsqlExpectedType' => TypeCombinator::union(self::numericStringOrNull(true, true), self::intOrNull()), + 'pgsqlExpectedType' => TypeCombinator::union(self::numericStringOrNull(true, true), self::intOrNull()), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1', + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'SUM(1) + GROUP BY' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT SUM(1) FROM %s t GROUP BY t.col_int', - 'mysql' => self::numericString(true, true), - 'sqlite' => self::int(), - 'pdo_pgsql' => TypeCombinator::union(self::numericString(true, true), self::int()), - 'pgsql' => TypeCombinator::union(self::numericString(true, true), self::int()), - 'mssql' => self::mixed(), - 'mysqlResult' => '1', - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT SUM(1) FROM %s t GROUP BY t.col_int', + 'mysqlExpectedType' => self::numericString(true, true), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => TypeCombinator::union(self::numericString(true, true), self::int()), + 'pgsqlExpectedType' => TypeCombinator::union(self::numericString(true, true), self::int()), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1', + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'SUM(1.0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT SUM(1.0) FROM %s t', - 'mysql' => self::numericStringOrNull(true, true), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => self::numericStringOrNull(true, true), - 'pgsql' => self::numericStringOrNull(true, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.0', - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => '1.0', - 'pgsqlResult' => '1.0', - 'mssqlResult' => '1.0', + 'dqlTemplate' => 'SELECT SUM(1.0) FROM %s t', + 'mysqlExpectedType' => self::numericStringOrNull(true, true), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => self::numericStringOrNull(true, true), + 'pgsqlExpectedType' => self::numericStringOrNull(true, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.0', + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => '1.0', + 'pgsqlExpectedResult' => '1.0', + 'mssqlExpectedResult' => '1.0', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'SUM(1e0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT SUM(1e0) FROM %s t', - 'mysql' => self::floatOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => self::numericStringOrNull(true, true), - 'pgsql' => self::numericStringOrNull(true, true), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => '1', - 'pgsqlResult' => '1', - 'mssqlResult' => 1.0, + 'dqlTemplate' => 'SELECT SUM(1e0) FROM %s t', + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => self::numericStringOrNull(true, true), + 'pgsqlExpectedType' => self::numericStringOrNull(true, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => '1', + 'pgsqlExpectedResult' => '1', + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'SUM(t.col_bigint)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT SUM(t.col_bigint) FROM %s t', - 'mysql' => self::numericStringOrNull(true, true), - 'sqlite' => self::intOrNull(), - 'pdo_pgsql' => TypeCombinator::union(self::numericStringOrNull(true, true), self::intOrNull()), - 'pgsql' => TypeCombinator::union(self::numericStringOrNull(true, true), self::intOrNull()), - 'mssql' => self::mixed(), - 'mysqlResult' => '2147483648', - 'sqliteResult' => 2147483648, - 'pdoPgsqlResult' => '2147483648', - 'pgsqlResult' => '2147483648', - 'mssqlResult' => '2147483648', + 'dqlTemplate' => 'SELECT SUM(t.col_bigint) FROM %s t', + 'mysqlExpectedType' => self::numericStringOrNull(true, true), + 'sqliteExpectedType' => self::intOrNull(), + 'pdoPgsqlExpectedType' => TypeCombinator::union(self::numericStringOrNull(true, true), self::intOrNull()), + 'pgsqlExpectedType' => TypeCombinator::union(self::numericStringOrNull(true, true), self::intOrNull()), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '2147483648', + 'sqliteExpectedResult' => 2147483648, + 'pdoPgsqlExpectedResult' => '2147483648', + 'pgsqlExpectedResult' => '2147483648', + 'mssqlExpectedResult' => '2147483648', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MAX(t.col_float)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MAX(t.col_float) FROM %s t', - 'mysql' => self::floatOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => self::floatOrNull(), - 'pgsql' => self::floatOrNull(), - 'mssql' => self::mixed(), - 'mysqlResult' => 0.125, - 'sqliteResult' => 0.125, - 'pdoPgsqlResult' => 0.125, - 'pgsqlResult' => 0.125, - 'mssqlResult' => 0.125, + 'dqlTemplate' => 'SELECT MAX(t.col_float) FROM %s t', + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => self::floatOrNull(), + 'pgsqlExpectedType' => self::floatOrNull(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0.125, + 'sqliteExpectedResult' => 0.125, + 'pdoPgsqlExpectedResult' => 0.125, + 'pgsqlExpectedResult' => 0.125, + 'mssqlExpectedResult' => 0.125, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 'MAX(t.col_float) + no data' => [ 'data' => self::dataNone(), - 'select' => 'SELECT MAX(t.col_float) FROM %s t', - 'mysql' => self::floatOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => self::floatOrNull(), - 'pgsql' => self::floatOrNull(), - 'mssql' => self::mixed(), - 'mysqlResult' => null, - 'sqliteResult' => null, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT MAX(t.col_float) FROM %s t', + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => self::floatOrNull(), + 'pgsqlExpectedType' => self::floatOrNull(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => null, + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 'MAX(t.col_float) + GROUP BY' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MAX(t.col_float) FROM %s t GROUP BY t.col_int', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 0.125, - 'sqliteResult' => 0.125, - 'pdoPgsqlResult' => 0.125, - 'pgsqlResult' => 0.125, - 'mssqlResult' => 0.125, + 'dqlTemplate' => 'SELECT MAX(t.col_float) FROM %s t GROUP BY t.col_int', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0.125, + 'sqliteExpectedResult' => 0.125, + 'pdoPgsqlExpectedResult' => 0.125, + 'pgsqlExpectedResult' => 0.125, + 'mssqlExpectedResult' => 0.125, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 'MAX(t.col_decimal)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MAX(t.col_decimal) FROM %s t', - 'mysql' => self::numericStringOrNull(false, true), - 'sqlite' => self::floatOrIntOrNull(), - 'pdo_pgsql' => self::numericStringOrNull(false, true), - 'pgsql' => self::numericStringOrNull(false, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '0.1', - 'sqliteResult' => 0.1, - 'pdoPgsqlResult' => '0.1', - 'pgsqlResult' => '0.1', - 'mssqlResult' => '.1', + 'dqlTemplate' => 'SELECT MAX(t.col_decimal) FROM %s t', + 'mysqlExpectedType' => self::numericStringOrNull(false, true), + 'sqliteExpectedType' => self::floatOrIntOrNull(), + 'pdoPgsqlExpectedType' => self::numericStringOrNull(false, true), + 'pgsqlExpectedType' => self::numericStringOrNull(false, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '0.1', + 'sqliteExpectedResult' => 0.1, + 'pdoPgsqlExpectedResult' => '0.1', + 'pgsqlExpectedResult' => '0.1', + 'mssqlExpectedResult' => '.1', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MAX(t.col_decimal) + int data' => [ 'data' => self::dataAllIntLike(), - 'select' => 'SELECT MAX(t.col_decimal) FROM %s t', - 'mysql' => self::numericStringOrNull(false, true), - 'sqlite' => self::floatOrIntOrNull(), - 'pdo_pgsql' => self::numericStringOrNull(false, true), - 'pgsql' => self::numericStringOrNull(false, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.0', - 'sqliteResult' => 1, - 'pdoPgsqlResult' => '1.0', - 'pgsqlResult' => '1.0', - 'mssqlResult' => '1.0', + 'dqlTemplate' => 'SELECT MAX(t.col_decimal) FROM %s t', + 'mysqlExpectedType' => self::numericStringOrNull(false, true), + 'sqliteExpectedType' => self::floatOrIntOrNull(), + 'pdoPgsqlExpectedType' => self::numericStringOrNull(false, true), + 'pgsqlExpectedType' => self::numericStringOrNull(false, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.0', + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => '1.0', + 'pgsqlExpectedResult' => '1.0', + 'mssqlExpectedResult' => '1.0', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MAX(t.col_int)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MAX(t.col_int) FROM %s t', - 'mysql' => self::intOrNull(), - 'sqlite' => self::intOrNull(), - 'pdo_pgsql' => self::intOrNull(), - 'pgsql' => self::intOrNull(), - 'mssql' => self::mixed(), - 'mysqlResult' => 9, - 'sqliteResult' => 9, - 'pdoPgsqlResult' => 9, - 'pgsqlResult' => 9, - 'mssqlResult' => 9, + 'dqlTemplate' => 'SELECT MAX(t.col_int) FROM %s t', + 'mysqlExpectedType' => self::intOrNull(), + 'sqliteExpectedType' => self::intOrNull(), + 'pdoPgsqlExpectedType' => self::intOrNull(), + 'pgsqlExpectedType' => self::intOrNull(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 9, + 'sqliteExpectedResult' => 9, + 'pdoPgsqlExpectedResult' => 9, + 'pgsqlExpectedResult' => 9, + 'mssqlExpectedResult' => 9, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MAX(t.col_mixed)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MAX(t.col_mixed) FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => self::mixed(), - 'pgsql' => self::mixed(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT MAX(t.col_mixed) FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => self::mixed(), + 'pgsqlExpectedType' => self::mixed(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MAX(t.col_bool)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MAX(t.col_bool) FROM %s t', - 'mysql' => self::intOrNull(), - 'sqlite' => self::intOrNull(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // Operand data type is invalid - 'mysqlResult' => 1, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT MAX(t.col_bool) FROM %s t', + 'mysqlExpectedType' => self::intOrNull(), + 'sqliteExpectedType' => self::intOrNull(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // Operand data type is invalid + 'mysqlExpectedResult' => 1, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MAX(t.col_string)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MAX(t.col_string) FROM %s t', - 'mysql' => self::stringOrNull(), - 'sqlite' => self::stringOrNull(), - 'pdo_pgsql' => self::stringOrNull(), - 'pgsql' => self::stringOrNull(), - 'mssql' => self::mixed(), - 'mysqlResult' => 'foobar', - 'sqliteResult' => 'foobar', - 'pdoPgsqlResult' => 'foobar', - 'pgsqlResult' => 'foobar', - 'mssqlResult' => 'foobar', + 'dqlTemplate' => 'SELECT MAX(t.col_string) FROM %s t', + 'mysqlExpectedType' => self::stringOrNull(), + 'sqliteExpectedType' => self::stringOrNull(), + 'pdoPgsqlExpectedType' => self::stringOrNull(), + 'pgsqlExpectedType' => self::stringOrNull(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 'foobar', + 'sqliteExpectedResult' => 'foobar', + 'pdoPgsqlExpectedResult' => 'foobar', + 'pgsqlExpectedResult' => 'foobar', + 'mssqlExpectedResult' => 'foobar', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "MAX('foobar')" => [ 'data' => self::dataDefault(), - 'select' => "SELECT MAX('foobar') FROM %s t", - 'mysql' => TypeCombinator::addNull(self::string()), - 'sqlite' => TypeCombinator::addNull(self::string()), - 'pdo_pgsql' => TypeCombinator::addNull(self::string()), - 'pgsql' => TypeCombinator::addNull(self::string()), - 'mssql' => self::mixed(), - 'mysqlResult' => 'foobar', - 'sqliteResult' => 'foobar', - 'pdoPgsqlResult' => 'foobar', - 'pgsqlResult' => 'foobar', - 'mssqlResult' => 'foobar', + 'dqlTemplate' => "SELECT MAX('foobar') FROM %s t", + 'mysqlExpectedType' => TypeCombinator::addNull(self::string()), + 'sqliteExpectedType' => TypeCombinator::addNull(self::string()), + 'pdoPgsqlExpectedType' => TypeCombinator::addNull(self::string()), + 'pgsqlExpectedType' => TypeCombinator::addNull(self::string()), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 'foobar', + 'sqliteExpectedResult' => 'foobar', + 'pdoPgsqlExpectedResult' => 'foobar', + 'pgsqlExpectedResult' => 'foobar', + 'mssqlExpectedResult' => 'foobar', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "MAX('1')" => [ 'data' => self::dataDefault(), - 'select' => "SELECT MAX('1') FROM %s t", - 'mysql' => self::numericStringOrNull(true, true), - 'sqlite' => self::numericStringOrNull(true, true), - 'pdo_pgsql' => self::numericStringOrNull(true, true), - 'pgsql' => self::numericStringOrNull(true, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '1', - 'sqliteResult' => '1', - 'pdoPgsqlResult' => '1', - 'pgsqlResult' => '1', - 'mssqlResult' => '1', + 'dqlTemplate' => "SELECT MAX('1') FROM %s t", + 'mysqlExpectedType' => self::numericStringOrNull(true, true), + 'sqliteExpectedType' => self::numericStringOrNull(true, true), + 'pdoPgsqlExpectedType' => self::numericStringOrNull(true, true), + 'pgsqlExpectedType' => self::numericStringOrNull(true, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1', + 'sqliteExpectedResult' => '1', + 'pdoPgsqlExpectedResult' => '1', + 'pgsqlExpectedResult' => '1', + 'mssqlExpectedResult' => '1', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "MAX('1.0')" => [ 'data' => self::dataDefault(), - 'select' => "SELECT MAX('1.0') FROM %s t", - 'mysql' => self::numericStringOrNull(true, true), - 'sqlite' => self::numericStringOrNull(true, true), - 'pdo_pgsql' => self::numericStringOrNull(true, true), - 'pgsql' => self::numericStringOrNull(true, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.0', - 'sqliteResult' => '1.0', - 'pdoPgsqlResult' => '1.0', - 'pgsqlResult' => '1.0', - 'mssqlResult' => '1.0', + 'dqlTemplate' => "SELECT MAX('1.0') FROM %s t", + 'mysqlExpectedType' => self::numericStringOrNull(true, true), + 'sqliteExpectedType' => self::numericStringOrNull(true, true), + 'pdoPgsqlExpectedType' => self::numericStringOrNull(true, true), + 'pgsqlExpectedType' => self::numericStringOrNull(true, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.0', + 'sqliteExpectedResult' => '1.0', + 'pdoPgsqlExpectedResult' => '1.0', + 'pgsqlExpectedResult' => '1.0', + 'mssqlExpectedResult' => '1.0', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MAX(1)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MAX(1) FROM %s t', - 'mysql' => self::intOrNull(), - 'sqlite' => self::intOrNull(), - 'pdo_pgsql' => self::intOrNull(), - 'pgsql' => self::intOrNull(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT MAX(1) FROM %s t', + 'mysqlExpectedType' => self::intOrNull(), + 'sqliteExpectedType' => self::intOrNull(), + 'pdoPgsqlExpectedType' => self::intOrNull(), + 'pgsqlExpectedType' => self::intOrNull(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MAX(1) + GROUP BY' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MAX(1) FROM %s t GROUP BY t.col_int', - 'mysql' => self::int(), - 'sqlite' => self::int(), - 'pdo_pgsql' => self::int(), - 'pgsql' => self::int(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT MAX(1) FROM %s t GROUP BY t.col_int', + 'mysqlExpectedType' => self::int(), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => self::int(), + 'pgsqlExpectedType' => self::int(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MAX(1.0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MAX(1.0) FROM %s t', - 'mysql' => self::numericStringOrNull(true, true), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => self::numericStringOrNull(true, true), - 'pgsql' => self::numericStringOrNull(true, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.0', - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => '1.0', - 'pgsqlResult' => '1.0', - 'mssqlResult' => '1.0', + 'dqlTemplate' => 'SELECT MAX(1.0) FROM %s t', + 'mysqlExpectedType' => self::numericStringOrNull(true, true), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => self::numericStringOrNull(true, true), + 'pgsqlExpectedType' => self::numericStringOrNull(true, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.0', + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => '1.0', + 'pgsqlExpectedResult' => '1.0', + 'mssqlExpectedResult' => '1.0', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MAX(1e0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MAX(1e0) FROM %s t', - 'mysql' => self::floatOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => self::numericStringOrNull(true, true), - 'pgsql' => self::numericStringOrNull(true, true), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => '1', - 'pgsqlResult' => '1', - 'mssqlResult' => 1.0, + 'dqlTemplate' => 'SELECT MAX(1e0) FROM %s t', + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => self::numericStringOrNull(true, true), + 'pgsqlExpectedType' => self::numericStringOrNull(true, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => '1', + 'pgsqlExpectedResult' => '1', + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MAX(t.col_bigint)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MAX(t.col_bigint) FROM %s t', - 'mysql' => self::intOrNull(), - 'sqlite' => self::intOrNull(), - 'pdo_pgsql' => self::intOrNull(), - 'pgsql' => self::intOrNull(), - 'mssql' => self::mixed(), - 'mysqlResult' => 2147483648, - 'sqliteResult' => 2147483648, - 'pdoPgsqlResult' => 2147483648, - 'pgsqlResult' => 2147483648, - 'mssqlResult' => '2147483648', + 'dqlTemplate' => 'SELECT MAX(t.col_bigint) FROM %s t', + 'mysqlExpectedType' => self::intOrNull(), + 'sqliteExpectedType' => self::intOrNull(), + 'pdoPgsqlExpectedType' => self::intOrNull(), + 'pgsqlExpectedType' => self::intOrNull(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 2147483648, + 'sqliteExpectedResult' => 2147483648, + 'pdoPgsqlExpectedResult' => 2147483648, + 'pgsqlExpectedResult' => 2147483648, + 'mssqlExpectedResult' => '2147483648', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'ABS(t.col_float)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT ABS(t.col_float) FROM %s t', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 0.125, - 'sqliteResult' => 0.125, - 'pdoPgsqlResult' => 0.125, - 'pgsqlResult' => 0.125, - 'mssqlResult' => 0.125, + 'dqlTemplate' => 'SELECT ABS(t.col_float) FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0.125, + 'sqliteExpectedResult' => 0.125, + 'pdoPgsqlExpectedResult' => 0.125, + 'pgsqlExpectedResult' => 0.125, + 'mssqlExpectedResult' => 0.125, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 'ABS(t.col_decimal)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT ABS(t.col_decimal) FROM %s t', - 'mysql' => self::numericString(false, true), - 'sqlite' => self::floatOrInt(), - 'pdo_pgsql' => self::numericString(false, true), - 'pgsql' => self::numericString(false, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '0.1', - 'sqliteResult' => 0.1, - 'pdoPgsqlResult' => '0.1', - 'pgsqlResult' => '0.1', - 'mssqlResult' => '.1', + 'dqlTemplate' => 'SELECT ABS(t.col_decimal) FROM %s t', + 'mysqlExpectedType' => self::numericString(false, true), + 'sqliteExpectedType' => self::floatOrInt(), + 'pdoPgsqlExpectedType' => self::numericString(false, true), + 'pgsqlExpectedType' => self::numericString(false, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '0.1', + 'sqliteExpectedResult' => 0.1, + 'pdoPgsqlExpectedResult' => '0.1', + 'pgsqlExpectedResult' => '0.1', + 'mssqlExpectedResult' => '.1', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'ABS(t.col_decimal) + int data' => [ 'data' => self::dataAllIntLike(), - 'select' => 'SELECT ABS(t.col_decimal) FROM %s t', - 'mysql' => self::numericString(false, true), - 'sqlite' => self::floatOrInt(), - 'pdo_pgsql' => self::numericString(false, true), - 'pgsql' => self::numericString(false, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.0', - 'sqliteResult' => 1, - 'pdoPgsqlResult' => '1.0', - 'pgsqlResult' => '1.0', - 'mssqlResult' => '1.0', + 'dqlTemplate' => 'SELECT ABS(t.col_decimal) FROM %s t', + 'mysqlExpectedType' => self::numericString(false, true), + 'sqliteExpectedType' => self::floatOrInt(), + 'pdoPgsqlExpectedType' => self::numericString(false, true), + 'pgsqlExpectedType' => self::numericString(false, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.0', + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => '1.0', + 'pgsqlExpectedResult' => '1.0', + 'mssqlExpectedResult' => '1.0', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'ABS(t.col_int)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT ABS(t.col_int) FROM %s t', - 'mysql' => self::intNonNegative(), - 'sqlite' => self::intNonNegative(), - 'pdo_pgsql' => self::intNonNegative(), - 'pgsql' => self::intNonNegative(), - 'mssql' => self::mixed(), - 'mysqlResult' => 9, - 'sqliteResult' => 9, - 'pdoPgsqlResult' => 9, - 'pgsqlResult' => 9, - 'mssqlResult' => 9, + 'dqlTemplate' => 'SELECT ABS(t.col_int) FROM %s t', + 'mysqlExpectedType' => self::intNonNegative(), + 'sqliteExpectedType' => self::intNonNegative(), + 'pdoPgsqlExpectedType' => self::intNonNegative(), + 'pgsqlExpectedType' => self::intNonNegative(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 9, + 'sqliteExpectedResult' => 9, + 'pdoPgsqlExpectedResult' => 9, + 'pgsqlExpectedResult' => 9, + 'mssqlExpectedResult' => 9, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield '-ABS(t.col_int)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT -ABS(t.col_int) FROM %s t', - 'mysql' => IntegerRangeType::fromInterval(null, 0), - 'sqlite' => IntegerRangeType::fromInterval(null, 0), - 'pdo_pgsql' => IntegerRangeType::fromInterval(null, 0), - 'pgsql' => IntegerRangeType::fromInterval(null, 0), - 'mssql' => self::mixed(), - 'mysqlResult' => -9, - 'sqliteResult' => -9, - 'pdoPgsqlResult' => -9, - 'pgsqlResult' => -9, - 'mssqlResult' => -9, + 'dqlTemplate' => 'SELECT -ABS(t.col_int) FROM %s t', + 'mysqlExpectedType' => IntegerRangeType::fromInterval(null, 0), + 'sqliteExpectedType' => IntegerRangeType::fromInterval(null, 0), + 'pdoPgsqlExpectedType' => IntegerRangeType::fromInterval(null, 0), + 'pgsqlExpectedType' => IntegerRangeType::fromInterval(null, 0), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => -9, + 'sqliteExpectedResult' => -9, + 'pdoPgsqlExpectedResult' => -9, + 'pgsqlExpectedResult' => -9, + 'mssqlExpectedResult' => -9, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'ABS(t.col_int_nullable)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT ABS(t.col_int_nullable) FROM %s t', - 'mysql' => self::intNonNegativeOrNull(), - 'sqlite' => self::intNonNegativeOrNull(), - 'pdo_pgsql' => self::intNonNegativeOrNull(), - 'pgsql' => self::intNonNegativeOrNull(), - 'mssql' => self::mixed(), - 'mysqlResult' => null, - 'sqliteResult' => null, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT ABS(t.col_int_nullable) FROM %s t', + 'mysqlExpectedType' => self::intNonNegativeOrNull(), + 'sqliteExpectedType' => self::intNonNegativeOrNull(), + 'pdoPgsqlExpectedType' => self::intNonNegativeOrNull(), + 'pgsqlExpectedType' => self::intNonNegativeOrNull(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => null, + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'ABS(t.col_string)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT ABS(t.col_string) FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // Operand data type is invalid - 'mysqlResult' => 0.0, - 'sqliteResult' => 0.0, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT ABS(t.col_string) FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // Operand data type is invalid + 'mysqlExpectedResult' => 0.0, + 'sqliteExpectedResult' => 0.0, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'ABS(t.col_string) + int data' => [ 'data' => self::dataAllIntLike(), - 'select' => 'SELECT ABS(t.col_string) FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => 1.0, + 'dqlTemplate' => 'SELECT ABS(t.col_string) FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'ABS(t.col_bool)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT ABS(t.col_bool) FROM %s t', - 'mysql' => self::intNonNegative(), - 'sqlite' => self::intNonNegative(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => self::mixed(), - 'mysqlResult' => 1, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => 1.0, + 'dqlTemplate' => 'SELECT ABS(t.col_bool) FROM %s t', + 'mysqlExpectedType' => self::intNonNegative(), + 'sqliteExpectedType' => self::intNonNegative(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'ABS(-1)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT ABS(-1) FROM %s t', - 'mysql' => self::intNonNegative(), - 'sqlite' => self::intNonNegative(), - 'pdo_pgsql' => self::intNonNegative(), - 'pgsql' => self::intNonNegative(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT ABS(-1) FROM %s t', + 'mysqlExpectedType' => self::intNonNegative(), + 'sqliteExpectedType' => self::intNonNegative(), + 'pdoPgsqlExpectedType' => self::intNonNegative(), + 'pgsqlExpectedType' => self::intNonNegative(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'ABS(1)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT ABS(1) FROM %s t', - 'mysql' => self::intNonNegative(), - 'sqlite' => self::intNonNegative(), - 'pdo_pgsql' => self::intNonNegative(), - 'pgsql' => self::intNonNegative(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT ABS(1) FROM %s t', + 'mysqlExpectedType' => self::intNonNegative(), + 'sqliteExpectedType' => self::intNonNegative(), + 'pdoPgsqlExpectedType' => self::intNonNegative(), + 'pgsqlExpectedType' => self::intNonNegative(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'ABS(1.0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT ABS(1.0) FROM %s t', - 'mysql' => self::numericString(true, true), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::numericString(true, true), - 'pgsql' => self::numericString(true, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.0', - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => '1.0', - 'pgsqlResult' => '1.0', - 'mssqlResult' => '1.0', + 'dqlTemplate' => 'SELECT ABS(1.0) FROM %s t', + 'mysqlExpectedType' => self::numericString(true, true), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::numericString(true, true), + 'pgsqlExpectedType' => self::numericString(true, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.0', + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => '1.0', + 'pgsqlExpectedResult' => '1.0', + 'mssqlExpectedResult' => '1.0', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'ABS(1e0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT ABS(1e0) FROM %s t', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::numericString(true, true), - 'pgsql' => self::numericString(true, true), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => '1', - 'pgsqlResult' => '1', - 'mssqlResult' => 1.0, + 'dqlTemplate' => 'SELECT ABS(1e0) FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::numericString(true, true), + 'pgsqlExpectedType' => self::numericString(true, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => '1', + 'pgsqlExpectedResult' => '1', + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "ABS('1.0')" => [ 'data' => self::dataDefault(), - 'select' => "SELECT ABS('1.0') FROM %s t", - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => 1.0, - 'pgsqlResult' => 1.0, - 'mssqlResult' => 1.0, + 'dqlTemplate' => "SELECT ABS('1.0') FROM %s t", + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => 1.0, + 'pgsqlExpectedResult' => 1.0, + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield "ABS('1')" => [ 'data' => self::dataDefault(), - 'select' => "SELECT ABS('1') FROM %s t", - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => 1.0, - 'pgsqlResult' => 1.0, - 'mssqlResult' => 1.0, + 'dqlTemplate' => "SELECT ABS('1') FROM %s t", + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => 1.0, + 'pgsqlExpectedResult' => 1.0, + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 'ABS(t.col_bigint)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT ABS(t.col_bigint) FROM %s t', - 'mysql' => self::intNonNegative(), - 'sqlite' => self::intNonNegative(), - 'pdo_pgsql' => self::intNonNegative(), - 'pgsql' => self::intNonNegative(), - 'mssql' => self::mixed(), - 'mysqlResult' => 2147483648, - 'sqliteResult' => 2147483648, - 'pdoPgsqlResult' => 2147483648, - 'pgsqlResult' => 2147483648, - 'mssqlResult' => '2147483648', + 'dqlTemplate' => 'SELECT ABS(t.col_bigint) FROM %s t', + 'mysqlExpectedType' => self::intNonNegative(), + 'sqliteExpectedType' => self::intNonNegative(), + 'pdoPgsqlExpectedType' => self::intNonNegative(), + 'pgsqlExpectedType' => self::intNonNegative(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 2147483648, + 'sqliteExpectedResult' => 2147483648, + 'pdoPgsqlExpectedResult' => 2147483648, + 'pgsqlExpectedResult' => 2147483648, + 'mssqlExpectedResult' => '2147483648', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'ABS(t.col_mixed)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT ABS(t.col_mixed) FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => self::mixed(), - 'pgsql' => self::mixed(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT ABS(t.col_mixed) FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => self::mixed(), + 'pgsqlExpectedType' => self::mixed(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MOD(t.col_int, 0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MOD(t.col_int, 0) FROM %s t', - 'mysql' => self::intNonNegativeOrNull(), - 'sqlite' => self::intNonNegativeOrNull(), - 'pdo_pgsql' => null, - 'pgsql' => null, - 'mssql' => null, // Divide by zero error encountered. - 'mysqlResult' => null, - 'sqliteResult' => null, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT MOD(t.col_int, 0) FROM %s t', + 'mysqlExpectedType' => self::intNonNegativeOrNull(), + 'sqliteExpectedType' => self::intNonNegativeOrNull(), + 'pdoPgsqlExpectedType' => null, + 'pgsqlExpectedType' => null, + 'mssqlExpectedType' => null, // Divide by zero error encountered. + 'mysqlExpectedResult' => null, + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MOD(t.col_int, 1)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MOD(t.col_int, 1) FROM %s t', - 'mysql' => self::intNonNegative(), - 'sqlite' => self::intNonNegative(), - 'pdo_pgsql' => self::intNonNegative(), - 'pgsql' => self::intNonNegative(), - 'mssql' => self::mixed(), - 'mysqlResult' => 0, - 'sqliteResult' => 0, - 'pdoPgsqlResult' => 0, - 'pgsqlResult' => 0, - 'mssqlResult' => 0, + 'dqlTemplate' => 'SELECT MOD(t.col_int, 1) FROM %s t', + 'mysqlExpectedType' => self::intNonNegative(), + 'sqliteExpectedType' => self::intNonNegative(), + 'pdoPgsqlExpectedType' => self::intNonNegative(), + 'pgsqlExpectedType' => self::intNonNegative(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0, + 'sqliteExpectedResult' => 0, + 'pdoPgsqlExpectedResult' => 0, + 'pgsqlExpectedResult' => 0, + 'mssqlExpectedResult' => 0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MOD(t.col_mixed, 1)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MOD(t.col_mixed, 1) FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => self::mixed(), - 'pgsql' => self::mixed(), - 'mssql' => self::mixed(), - 'mysqlResult' => 0, - 'sqliteResult' => 0, - 'pdoPgsqlResult' => 0, - 'pgsqlResult' => 0, - 'mssqlResult' => 0, + 'dqlTemplate' => 'SELECT MOD(t.col_mixed, 1) FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => self::mixed(), + 'pgsqlExpectedType' => self::mixed(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0, + 'sqliteExpectedResult' => 0, + 'pdoPgsqlExpectedResult' => 0, + 'pgsqlExpectedResult' => 0, + 'mssqlExpectedResult' => 0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "MOD(t.col_int, '1')" => [ 'data' => self::dataDefault(), - 'select' => "SELECT MOD(t.col_int, '1') FROM %s t", - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => self::mixed(), - 'pgsql' => self::mixed(), - 'mssql' => self::mixed(), - 'mysqlResult' => 0.0, - 'sqliteResult' => 0, - 'pdoPgsqlResult' => 0, - 'pgsqlResult' => 0, - 'mssqlResult' => 0, + 'dqlTemplate' => "SELECT MOD(t.col_int, '1') FROM %s t", + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => self::mixed(), + 'pgsqlExpectedType' => self::mixed(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0.0, + 'sqliteExpectedResult' => 0, + 'pdoPgsqlExpectedResult' => 0, + 'pgsqlExpectedResult' => 0, + 'mssqlExpectedResult' => 0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "MOD(t.col_int, '1.0')" => [ 'data' => self::dataDefault(), - 'select' => "SELECT MOD(t.col_int, '1') FROM %s t", - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => self::mixed(), - 'pgsql' => self::mixed(), - 'mssql' => self::mixed(), - 'mysqlResult' => 0.0, - 'sqliteResult' => 0, - 'pdoPgsqlResult' => 0, - 'pgsqlResult' => 0, - 'mssqlResult' => 0, + 'dqlTemplate' => "SELECT MOD(t.col_int, '1') FROM %s t", + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => self::mixed(), + 'pgsqlExpectedType' => self::mixed(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0.0, + 'sqliteExpectedResult' => 0, + 'pdoPgsqlExpectedResult' => 0, + 'pgsqlExpectedResult' => 0, + 'mssqlExpectedResult' => 0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MOD(t.col_int, t.col_float)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MOD(t.col_int, t.col_float) FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // The data types are incompatible in the modulo operator. - 'mysqlResult' => 0.0, - 'sqliteResult' => null, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT MOD(t.col_int, t.col_float) FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // The data types are incompatible in the modulo operator. + 'mysqlExpectedResult' => 0.0, + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MOD(t.col_int, t.col_decimal)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MOD(t.col_int, t.col_decimal) FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => self::mixed(), - 'pgsql' => self::mixed(), - 'mssql' => self::mixed(), - 'mysqlResult' => '0.0', - 'sqliteResult' => null, - 'pdoPgsqlResult' => '0.0', - 'pgsqlResult' => '0.0', - 'mssqlResult' => '.0', + 'dqlTemplate' => 'SELECT MOD(t.col_int, t.col_decimal) FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => self::mixed(), + 'pgsqlExpectedType' => self::mixed(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '0.0', + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => '0.0', + 'pgsqlExpectedResult' => '0.0', + 'mssqlExpectedResult' => '.0', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MOD(t.col_float, t.col_int)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MOD(t.col_float, t.col_int) FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // The data types are incompatible in the modulo operator. - 'mysqlResult' => 0.125, - 'sqliteResult' => 0.0, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT MOD(t.col_float, t.col_int) FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // The data types are incompatible in the modulo operator. + 'mysqlExpectedResult' => 0.125, + 'sqliteExpectedResult' => 0.0, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MOD(t.col_decimal, t.col_int)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MOD(t.col_decimal, t.col_int) FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => self::mixed(), - 'pgsql' => self::mixed(), - 'mssql' => self::mixed(), - 'mysqlResult' => '0.1', - 'sqliteResult' => 0.0, - 'pdoPgsqlResult' => '0.1', - 'pgsqlResult' => '0.1', - 'mssqlResult' => '.1', + 'dqlTemplate' => 'SELECT MOD(t.col_decimal, t.col_int) FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => self::mixed(), + 'pgsqlExpectedType' => self::mixed(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '0.1', + 'sqliteExpectedResult' => 0.0, + 'pdoPgsqlExpectedResult' => '0.1', + 'pgsqlExpectedResult' => '0.1', + 'mssqlExpectedResult' => '.1', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MOD(t.col_string, t.col_string)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MOD(t.col_string, t.col_string) FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => null, // Undefined function - 'pgsql' => null, // Undefined function - 'mssql' => null, // The data types are incompatible in the modulo operator. - 'mysqlResult' => null, - 'sqliteResult' => null, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT MOD(t.col_string, t.col_string) FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => null, // Undefined function + 'pgsqlExpectedType' => null, // Undefined function + 'mssqlExpectedType' => null, // The data types are incompatible in the modulo operator. + 'mysqlExpectedResult' => null, + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MOD(t.col_int, t.col_int)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MOD(t.col_int, t.col_int) FROM %s t', - 'mysql' => self::intNonNegativeOrNull(), - 'sqlite' => self::intNonNegativeOrNull(), - 'pdo_pgsql' => self::intNonNegative(), - 'pgsql' => self::intNonNegative(), - 'mssql' => self::mixed(), - 'mysqlResult' => 0, - 'sqliteResult' => 0, - 'pdoPgsqlResult' => 0, - 'pgsqlResult' => 0, - 'mssqlResult' => 0, + 'dqlTemplate' => 'SELECT MOD(t.col_int, t.col_int) FROM %s t', + 'mysqlExpectedType' => self::intNonNegativeOrNull(), + 'sqliteExpectedType' => self::intNonNegativeOrNull(), + 'pdoPgsqlExpectedType' => self::intNonNegative(), + 'pgsqlExpectedType' => self::intNonNegative(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0, + 'sqliteExpectedResult' => 0, + 'pdoPgsqlExpectedResult' => 0, + 'pgsqlExpectedResult' => 0, + 'mssqlExpectedResult' => 0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MOD(t.col_int, t.col_int_nullable)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MOD(t.col_int, t.col_int_nullable) FROM %s t', - 'mysql' => self::intNonNegativeOrNull(), - 'sqlite' => self::intNonNegativeOrNull(), - 'pdo_pgsql' => self::intNonNegativeOrNull(), - 'pgsql' => self::intNonNegativeOrNull(), - 'mssql' => self::mixed(), - 'mysqlResult' => null, - 'sqliteResult' => null, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT MOD(t.col_int, t.col_int_nullable) FROM %s t', + 'mysqlExpectedType' => self::intNonNegativeOrNull(), + 'sqliteExpectedType' => self::intNonNegativeOrNull(), + 'pdoPgsqlExpectedType' => self::intNonNegativeOrNull(), + 'pgsqlExpectedType' => self::intNonNegativeOrNull(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => null, + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MOD(10, 7)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MOD(10, 7) FROM %s t', - 'mysql' => self::intNonNegative(), - 'sqlite' => self::intNonNegative(), - 'pdo_pgsql' => self::intNonNegative(), - 'pgsql' => self::intNonNegative(), - 'mssql' => self::mixed(), - 'mysqlResult' => 3, - 'sqliteResult' => 3, - 'pdoPgsqlResult' => 3, - 'pgsqlResult' => 3, - 'mssqlResult' => 3, + 'dqlTemplate' => 'SELECT MOD(10, 7) FROM %s t', + 'mysqlExpectedType' => self::intNonNegative(), + 'sqliteExpectedType' => self::intNonNegative(), + 'pdoPgsqlExpectedType' => self::intNonNegative(), + 'pgsqlExpectedType' => self::intNonNegative(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 3, + 'sqliteExpectedResult' => 3, + 'pdoPgsqlExpectedResult' => 3, + 'pgsqlExpectedResult' => 3, + 'mssqlExpectedResult' => 3, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MOD(10, -7)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MOD(10, -7) FROM %s t', - 'mysql' => self::intNonNegative(), - 'sqlite' => self::intNonNegative(), - 'pdo_pgsql' => self::intNonNegative(), - 'pgsql' => self::intNonNegative(), - 'mssql' => self::mixed(), - 'mysqlResult' => 3, - 'sqliteResult' => 3, - 'pdoPgsqlResult' => 3, - 'pgsqlResult' => 3, - 'mssqlResult' => 3, + 'dqlTemplate' => 'SELECT MOD(10, -7) FROM %s t', + 'mysqlExpectedType' => self::intNonNegative(), + 'sqliteExpectedType' => self::intNonNegative(), + 'pdoPgsqlExpectedType' => self::intNonNegative(), + 'pgsqlExpectedType' => self::intNonNegative(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 3, + 'sqliteExpectedResult' => 3, + 'pdoPgsqlExpectedResult' => 3, + 'pgsqlExpectedResult' => 3, + 'mssqlExpectedResult' => 3, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'MOD(t.col_bigint, t.col_bigint)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT MOD(t.col_bigint, t.col_bigint) FROM %s t', - 'mysql' => self::intNonNegativeOrNull(), - 'sqlite' => self::intNonNegativeOrNull(), - 'pdo_pgsql' => self::intNonNegative(), - 'pgsql' => self::intNonNegative(), - 'mssql' => self::mixed(), - 'mysqlResult' => 0, - 'sqliteResult' => 0, - 'pdoPgsqlResult' => 0, - 'pgsqlResult' => 0, - 'mssqlResult' => '0', + 'dqlTemplate' => 'SELECT MOD(t.col_bigint, t.col_bigint) FROM %s t', + 'mysqlExpectedType' => self::intNonNegativeOrNull(), + 'sqliteExpectedType' => self::intNonNegativeOrNull(), + 'pdoPgsqlExpectedType' => self::intNonNegative(), + 'pgsqlExpectedType' => self::intNonNegative(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0, + 'sqliteExpectedResult' => 0, + 'pdoPgsqlExpectedResult' => 0, + 'pgsqlExpectedResult' => 0, + 'mssqlExpectedResult' => '0', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'BIT_AND(t.col_bigint, t.col_bigint)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT BIT_AND(t.col_bigint, t.col_bigint) FROM %s t', - 'mysql' => self::intNonNegative(), - 'sqlite' => self::intNonNegative(), - 'pdo_pgsql' => self::intNonNegative(), - 'pgsql' => self::intNonNegative(), - 'mssql' => self::mixed(), - 'mysqlResult' => 2147483648, - 'sqliteResult' => 2147483648, - 'pdoPgsqlResult' => 2147483648, - 'pgsqlResult' => 2147483648, - 'mssqlResult' => '2147483648', + 'dqlTemplate' => 'SELECT BIT_AND(t.col_bigint, t.col_bigint) FROM %s t', + 'mysqlExpectedType' => self::intNonNegative(), + 'sqliteExpectedType' => self::intNonNegative(), + 'pdoPgsqlExpectedType' => self::intNonNegative(), + 'pgsqlExpectedType' => self::intNonNegative(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 2147483648, + 'sqliteExpectedResult' => 2147483648, + 'pdoPgsqlExpectedResult' => 2147483648, + 'pgsqlExpectedResult' => 2147483648, + 'mssqlExpectedResult' => '2147483648', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'BIT_AND(t.col_int, t.col_int)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT BIT_AND(t.col_int, t.col_int) FROM %s t', - 'mysql' => self::intNonNegative(), - 'sqlite' => self::intNonNegative(), - 'pdo_pgsql' => self::intNonNegative(), - 'pgsql' => self::intNonNegative(), - 'mssql' => self::mixed(), - 'mysqlResult' => 9, - 'sqliteResult' => 9, - 'pdoPgsqlResult' => 9, - 'pgsqlResult' => 9, - 'mssqlResult' => 9, + 'dqlTemplate' => 'SELECT BIT_AND(t.col_int, t.col_int) FROM %s t', + 'mysqlExpectedType' => self::intNonNegative(), + 'sqliteExpectedType' => self::intNonNegative(), + 'pdoPgsqlExpectedType' => self::intNonNegative(), + 'pgsqlExpectedType' => self::intNonNegative(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 9, + 'sqliteExpectedResult' => 9, + 'pdoPgsqlExpectedResult' => 9, + 'pgsqlExpectedResult' => 9, + 'mssqlExpectedResult' => 9, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'BIT_AND(t.col_mixed, t.col_mixed)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT BIT_AND(t.col_mixed, t.col_mixed) FROM %s t', - 'mysql' => self::intNonNegativeOrNull(), - 'sqlite' => self::intNonNegativeOrNull(), - 'pdo_pgsql' => self::intNonNegativeOrNull(), - 'pgsql' => self::intNonNegativeOrNull(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT BIT_AND(t.col_mixed, t.col_mixed) FROM %s t', + 'mysqlExpectedType' => self::intNonNegativeOrNull(), + 'sqliteExpectedType' => self::intNonNegativeOrNull(), + 'pdoPgsqlExpectedType' => self::intNonNegativeOrNull(), + 'pgsqlExpectedType' => self::intNonNegativeOrNull(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'BIT_AND(t.col_int, t.col_int_nullable)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT BIT_AND(t.col_int, t.col_int_nullable) FROM %s t', - 'mysql' => self::intNonNegativeOrNull(), - 'sqlite' => self::intNonNegativeOrNull(), - 'pdo_pgsql' => self::intNonNegativeOrNull(), - 'pgsql' => self::intNonNegativeOrNull(), - 'mssql' => self::mixed(), - 'mysqlResult' => null, - 'sqliteResult' => null, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT BIT_AND(t.col_int, t.col_int_nullable) FROM %s t', + 'mysqlExpectedType' => self::intNonNegativeOrNull(), + 'sqliteExpectedType' => self::intNonNegativeOrNull(), + 'pdoPgsqlExpectedType' => self::intNonNegativeOrNull(), + 'pgsqlExpectedType' => self::intNonNegativeOrNull(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => null, + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'BIT_AND(1, 0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT BIT_AND(1, 0) FROM %s t', - 'mysql' => self::intNonNegative(), - 'sqlite' => self::intNonNegative(), - 'pdo_pgsql' => self::intNonNegative(), - 'pgsql' => self::intNonNegative(), - 'mssql' => self::mixed(), - 'mysqlResult' => 0, - 'sqliteResult' => 0, - 'pdoPgsqlResult' => 0, - 'pgsqlResult' => 0, - 'mssqlResult' => 0, + 'dqlTemplate' => 'SELECT BIT_AND(1, 0) FROM %s t', + 'mysqlExpectedType' => self::intNonNegative(), + 'sqliteExpectedType' => self::intNonNegative(), + 'pdoPgsqlExpectedType' => self::intNonNegative(), + 'pgsqlExpectedType' => self::intNonNegative(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0, + 'sqliteExpectedResult' => 0, + 'pdoPgsqlExpectedResult' => 0, + 'pgsqlExpectedResult' => 0, + 'mssqlExpectedResult' => 0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'BIT_AND(t.col_string, t.col_string)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT BIT_AND(t.col_string, t.col_string) FROM %s t', - 'mysql' => self::intNonNegative(), - 'sqlite' => self::intNonNegative(), - 'pdo_pgsql' => null, - 'pgsql' => null, - 'mssql' => null, - 'mysqlResult' => 0, - 'sqliteResult' => 0, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT BIT_AND(t.col_string, t.col_string) FROM %s t', + 'mysqlExpectedType' => self::intNonNegative(), + 'sqliteExpectedType' => self::intNonNegative(), + 'pdoPgsqlExpectedType' => null, + 'pgsqlExpectedType' => null, + 'mssqlExpectedType' => null, + 'mysqlExpectedResult' => 0, + 'sqliteExpectedResult' => 0, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'DATE_DIFF(CURRENT_DATE(), CURRENT_DATE())' => [ 'data' => self::dataDefault(), - 'select' => "SELECT DATE_DIFF('2024-01-01 12:00', '2024-01-01 11:00') FROM %s t", - 'mysql' => self::int(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::int(), - 'pgsql' => self::int(), - 'mssql' => self::mixed(), - 'mysqlResult' => 0, - 'sqliteResult' => 0.0, - 'pdoPgsqlResult' => 0, - 'pgsqlResult' => 0, - 'mssqlResult' => 0, + 'dqlTemplate' => "SELECT DATE_DIFF('2024-01-01 12:00', '2024-01-01 11:00') FROM %s t", + 'mysqlExpectedType' => self::int(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::int(), + 'pgsqlExpectedType' => self::int(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0, + 'sqliteExpectedResult' => 0.0, + 'pdoPgsqlExpectedResult' => 0, + 'pgsqlExpectedResult' => 0, + 'mssqlExpectedResult' => 0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'DATE_DIFF(CURRENT_DATE(), t.col_string_nullable)' => [ 'data' => self::dataDefault(), - 'select' => "SELECT DATE_DIFF('2024-01-01 12:00', t.col_string_nullable) FROM %s t", - 'mysql' => self::intOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => self::intOrNull(), - 'pgsql' => self::intOrNull(), - 'mssql' => self::mixed(), - 'mysqlResult' => null, - 'sqliteResult' => null, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => "SELECT DATE_DIFF('2024-01-01 12:00', t.col_string_nullable) FROM %s t", + 'mysqlExpectedType' => self::intOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => self::intOrNull(), + 'pgsqlExpectedType' => self::intOrNull(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => null, + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'DATE_DIFF(CURRENT_DATE(), t.col_mixed)' => [ 'data' => self::dataDefault(), - 'select' => "SELECT DATE_DIFF('2024-01-01 12:00', t.col_mixed) FROM %s t", - 'mysql' => self::intOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => null, - 'pgsql' => null, - 'mssql' => self::mixed(), - 'mysqlResult' => null, - 'sqliteResult' => 2460310.0, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => 45289, + 'dqlTemplate' => "SELECT DATE_DIFF('2024-01-01 12:00', t.col_mixed) FROM %s t", + 'mysqlExpectedType' => self::intOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => null, + 'pgsqlExpectedType' => null, + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => null, + 'sqliteExpectedResult' => 2460310.0, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => 45289, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'SQRT(t.col_float)' => [ 'data' => self::dataSqrt(), - 'select' => 'SELECT SQRT(t.col_float) FROM %s t', - 'mysql' => self::floatOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => 1.0, - 'pgsqlResult' => 1.0, - 'mssqlResult' => 1.0, + 'dqlTemplate' => 'SELECT SQRT(t.col_float) FROM %s t', + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => 1.0, + 'pgsqlExpectedResult' => 1.0, + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 'SQRT(t.col_decimal)' => [ 'data' => self::dataSqrt(), - 'select' => 'SELECT SQRT(t.col_decimal) FROM %s t', - 'mysql' => self::floatOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => self::numericString(false, true), - 'pgsql' => self::numericString(false, true), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => '1.000000000000000', - 'pgsqlResult' => '1.000000000000000', - 'mssqlResult' => 1.0, + 'dqlTemplate' => 'SELECT SQRT(t.col_decimal) FROM %s t', + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => self::numericString(false, true), + 'pgsqlExpectedType' => self::numericString(false, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => '1.000000000000000', + 'pgsqlExpectedResult' => '1.000000000000000', + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'SQRT(t.col_int)' => [ 'data' => self::dataSqrt(), - 'select' => 'SELECT SQRT(t.col_int) FROM %s t', - 'mysql' => self::floatOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 3.0, - 'sqliteResult' => 3.0, - 'pdoPgsqlResult' => 3.0, - 'pgsqlResult' => 3.0, - 'mssqlResult' => 3.0, + 'dqlTemplate' => 'SELECT SQRT(t.col_int) FROM %s t', + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 3.0, + 'sqliteExpectedResult' => 3.0, + 'pdoPgsqlExpectedResult' => 3.0, + 'pgsqlExpectedResult' => 3.0, + 'mssqlExpectedResult' => 3.0, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 'SQRT(t.col_mixed)' => [ 'data' => self::dataSqrt(), - 'select' => 'SELECT SQRT(t.col_mixed) FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => self::mixed(), - 'pgsql' => self::mixed(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => 1.0, - 'pgsqlResult' => 1.0, - 'mssqlResult' => 1.0, + 'dqlTemplate' => 'SELECT SQRT(t.col_mixed) FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => self::mixed(), + 'pgsqlExpectedType' => self::mixed(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => 1.0, + 'pgsqlExpectedResult' => 1.0, + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 'SQRT(t.col_int_nullable)' => [ 'data' => self::dataSqrt(), - 'select' => 'SELECT SQRT(t.col_int_nullable) FROM %s t', - 'mysql' => self::floatOrNull(), - 'sqlite' => PHP_VERSION_ID >= 80100 && !self::hasDbal4() ? null : self::floatOrNull(), // fails in UDF since PHP 8.1: sqrt(): Passing null to parameter #1 ($num) of type float is deprecated - 'pdo_pgsql' => self::floatOrNull(), - 'pgsql' => self::floatOrNull(), - 'mssql' => self::mixed(), - 'mysqlResult' => null, - 'sqliteResult' => self::hasDbal4() ? null : 0.0, // 0.0 caused by UDF wired through PHP's sqrt() which returns 0.0 for null - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT SQRT(t.col_int_nullable) FROM %s t', + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => PHP_VERSION_ID >= 80100 && !self::hasDbal4() ? null : self::floatOrNull(), // fails in UDF since PHP 8.1: sqrt(): Passing null to parameter #1 ($num) of type float is deprecated + 'pdoPgsqlExpectedType' => self::floatOrNull(), + 'pgsqlExpectedType' => self::floatOrNull(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => null, + 'sqliteExpectedResult' => self::hasDbal4() ? null : 0.0, // 0.0 caused by UDF wired through PHP's sqrt() which returns 0.0 for null + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 'SQRT(-1)' => [ 'data' => self::dataSqrt(), - 'select' => 'SELECT SQRT(-1) FROM %s t', - 'mysql' => self::floatOrNull(), - 'sqlite' => self::floatOrNull(), - 'pdo_pgsql' => null, // failure: cannot take square root of a negative number - 'pgsql' => null, // failure: cannot take square root of a negative number - 'mssql' => null, // An invalid floating point operation occurred. - 'mysqlResult' => null, - 'sqliteResult' => null, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT SQRT(-1) FROM %s t', + 'mysqlExpectedType' => self::floatOrNull(), + 'sqliteExpectedType' => self::floatOrNull(), + 'pdoPgsqlExpectedType' => null, // failure: cannot take square root of a negative number + 'pgsqlExpectedType' => null, // failure: cannot take square root of a negative number + 'mssqlExpectedType' => null, // An invalid floating point operation occurred. + 'mysqlExpectedResult' => null, + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'SQRT(1)' => [ 'data' => self::dataSqrt(), - 'select' => 'SELECT SQRT(1) FROM %s t', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => 1.0, - 'pgsqlResult' => 1.0, - 'mssqlResult' => 1.0, + 'dqlTemplate' => 'SELECT SQRT(1) FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => 1.0, + 'pgsqlExpectedResult' => 1.0, + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield "SQRT('1')" => [ 'data' => self::dataSqrt(), - 'select' => "SELECT SQRT('1') FROM %s t", - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => 1.0, - 'pgsqlResult' => 1.0, - 'mssqlResult' => 1.0, + 'dqlTemplate' => "SELECT SQRT('1') FROM %s t", + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => 1.0, + 'pgsqlExpectedResult' => 1.0, + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield "SQRT('1.0')" => [ 'data' => self::dataSqrt(), - 'select' => "SELECT SQRT('1.0') FROM %s t", - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => 1.0, - 'pgsqlResult' => 1.0, - 'mssqlResult' => 1.0, + 'dqlTemplate' => "SELECT SQRT('1.0') FROM %s t", + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => 1.0, + 'pgsqlExpectedResult' => 1.0, + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield "SQRT('1e0')" => [ 'data' => self::dataSqrt(), - 'select' => "SELECT SQRT('1e0') FROM %s t", - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::float(), - 'pgsql' => self::float(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => 1.0, - 'pgsqlResult' => 1.0, - 'mssqlResult' => 1.0, + 'dqlTemplate' => "SELECT SQRT('1e0') FROM %s t", + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::float(), + 'pgsqlExpectedType' => self::float(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => 1.0, + 'pgsqlExpectedResult' => 1.0, + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield "SQRT('foo')" => [ 'data' => self::dataSqrt(), - 'select' => "SELECT SQRT('foo') FROM %s t", - 'mysql' => self::mixed(), - 'sqlite' => self::hasDbal4() ? self::mixed() : null, // fails in UDF: sqrt(): Argument #1 ($num) must be of type float, string given - 'pdo_pgsql' => null, // Invalid text representation - 'pgsql' => null, // Invalid text representation - 'mssql' => null, // Error converting data type - 'mysqlResult' => 0.0, - 'sqliteResult' => null, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => "SELECT SQRT('foo') FROM %s t", + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::hasDbal4() ? self::mixed() : null, // fails in UDF: sqrt(): Argument #1 ($num) must be of type float, string given + 'pdoPgsqlExpectedType' => null, // Invalid text representation + 'pgsqlExpectedType' => null, // Invalid text representation + 'mssqlExpectedType' => null, // Error converting data type + 'mysqlExpectedResult' => 0.0, + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'SQRT(t.col_string)' => [ 'data' => self::dataSqrt(), - 'select' => 'SELECT SQRT(t.col_string) FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::hasDbal4() ? self::mixed() : null, // fails in UDF: sqrt(): Argument #1 ($num) must be of type float, string given - 'pdo_pgsql' => null, // undefined function - 'pgsql' => null, // undefined function - 'mssql' => null, // Error converting data type - 'mysqlResult' => 0.0, - 'sqliteResult' => null, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT SQRT(t.col_string) FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::hasDbal4() ? self::mixed() : null, // fails in UDF: sqrt(): Argument #1 ($num) must be of type float, string given + 'pdoPgsqlExpectedType' => null, // undefined function + 'pgsqlExpectedType' => null, // undefined function + 'mssqlExpectedType' => null, // Error converting data type + 'mysqlExpectedResult' => 0.0, + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'SQRT(1.0)' => [ 'data' => self::dataSqrt(), - 'select' => 'SELECT SQRT(1.0) FROM %s t', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::numericString(true, true), - 'pgsql' => self::numericString(true, true), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => '1.000000000000000', - 'pgsqlResult' => '1.000000000000000', - 'mssqlResult' => 1.0, + 'dqlTemplate' => 'SELECT SQRT(1.0) FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::numericString(true, true), + 'pgsqlExpectedType' => self::numericString(true, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => '1.000000000000000', + 'pgsqlExpectedResult' => '1.000000000000000', + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'COUNT(t)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COUNT(t) FROM %s t', - 'mysql' => self::intNonNegative(), - 'sqlite' => self::intNonNegative(), - 'pdo_pgsql' => self::intNonNegative(), - 'pgsql' => self::intNonNegative(), - 'mssql' => self::intNonNegative(), - 'mysqlResult' => 1, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT COUNT(t) FROM %s t', + 'mysqlExpectedType' => self::intNonNegative(), + 'sqliteExpectedType' => self::intNonNegative(), + 'pdoPgsqlExpectedType' => self::intNonNegative(), + 'pgsqlExpectedType' => self::intNonNegative(), + 'mssqlExpectedType' => self::intNonNegative(), + 'mysqlExpectedResult' => 1, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_NONE, ]; yield 'SUBSELECT' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t1.col_int, (SELECT COUNT(t2.col_int) FROM ' . PlatformEntity::class . ' t2) FROM %s t1', - 'mysql' => self::int(), - 'sqlite' => self::int(), - 'pdo_pgsql' => self::int(), - 'pgsql' => self::int(), - 'mssql' => self::int(), - 'mysqlResult' => 9, - 'sqliteResult' => 9, - 'pdoPgsqlResult' => 9, - 'pgsqlResult' => 9, - 'mssqlResult' => 9, + 'dqlTemplate' => 'SELECT t1.col_int, (SELECT COUNT(t2.col_int) FROM ' . PlatformEntity::class . ' t2) FROM %s t1', + 'mysqlExpectedType' => self::int(), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => self::int(), + 'pgsqlExpectedType' => self::int(), + 'mssqlExpectedType' => self::int(), + 'mysqlExpectedResult' => 9, + 'sqliteExpectedResult' => 9, + 'pdoPgsqlExpectedResult' => 9, + 'pgsqlExpectedResult' => 9, + 'mssqlExpectedResult' => 9, 'stringify' => self::STRINGIFY_NONE, ]; yield 'COUNT(t.col_int)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COUNT(t.col_int) FROM %s t', - 'mysql' => self::intNonNegative(), - 'sqlite' => self::intNonNegative(), - 'pdo_pgsql' => self::intNonNegative(), - 'pgsql' => self::intNonNegative(), - 'mssql' => self::intNonNegative(), - 'mysqlResult' => 1, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT COUNT(t.col_int) FROM %s t', + 'mysqlExpectedType' => self::intNonNegative(), + 'sqliteExpectedType' => self::intNonNegative(), + 'pdoPgsqlExpectedType' => self::intNonNegative(), + 'pgsqlExpectedType' => self::intNonNegative(), + 'mssqlExpectedType' => self::intNonNegative(), + 'mysqlExpectedResult' => 1, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_NONE, ]; yield 'COUNT(t.col_mixed)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COUNT(t.col_mixed) FROM %s t', - 'mysql' => self::intNonNegative(), - 'sqlite' => self::intNonNegative(), - 'pdo_pgsql' => self::intNonNegative(), - 'pgsql' => self::intNonNegative(), - 'mssql' => self::intNonNegative(), - 'mysqlResult' => 1, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT COUNT(t.col_mixed) FROM %s t', + 'mysqlExpectedType' => self::intNonNegative(), + 'sqliteExpectedType' => self::intNonNegative(), + 'pdoPgsqlExpectedType' => self::intNonNegative(), + 'pgsqlExpectedType' => self::intNonNegative(), + 'mssqlExpectedType' => self::intNonNegative(), + 'mysqlExpectedResult' => 1, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_NONE, ]; yield 'COUNT(1)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COUNT(1) FROM %s t', - 'mysql' => self::intNonNegative(), - 'sqlite' => self::intNonNegative(), - 'pdo_pgsql' => self::intNonNegative(), - 'pgsql' => self::intNonNegative(), - 'mssql' => self::intNonNegative(), - 'mysqlResult' => 1, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT COUNT(1) FROM %s t', + 'mysqlExpectedType' => self::intNonNegative(), + 'sqliteExpectedType' => self::intNonNegative(), + 'pdoPgsqlExpectedType' => self::intNonNegative(), + 'pgsqlExpectedType' => self::intNonNegative(), + 'mssqlExpectedType' => self::intNonNegative(), + 'mysqlExpectedResult' => 1, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_NONE, ]; yield 't.col_mixed' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT t.col_mixed FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => self::mixed(), - 'pgsql' => self::mixed(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT t.col_mixed FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => self::mixed(), + 'pgsqlExpectedType' => self::mixed(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_NONE, ]; yield 'INT_PI()' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT INT_PI() FROM %s t', - 'mysql' => self::int(), - 'sqlite' => self::int(), - 'pdo_pgsql' => self::int(), - 'pgsql' => self::int(), - 'mssql' => self::int(), - 'mysqlResult' => 3, - 'sqliteResult' => 3, - 'pdoPgsqlResult' => 3, - 'pgsqlResult' => 3, - 'mssqlResult' => 3, + 'dqlTemplate' => 'SELECT INT_PI() FROM %s t', + 'mysqlExpectedType' => self::int(), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => self::int(), + 'pgsqlExpectedType' => self::int(), + 'mssqlExpectedType' => self::int(), + 'mysqlExpectedResult' => 3, + 'sqliteExpectedResult' => 3, + 'pdoPgsqlExpectedResult' => 3, + 'pgsqlExpectedResult' => 3, + 'mssqlExpectedResult' => 3, 'stringify' => self::STRINGIFY_NONE, ]; yield '-INT_PI()' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT -INT_PI() FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => self::mixed(), - 'pgsql' => self::mixed(), - 'mssql' => self::mixed(), - 'mysqlResult' => '-3.14159', - 'sqliteResult' => -3.14159, - 'pdoPgsqlResult' => '-3.14159', - 'pgsqlResult' => '-3.14159', - 'mssqlResult' => '-3.14159', + 'dqlTemplate' => 'SELECT -INT_PI() FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => self::mixed(), + 'pgsqlExpectedType' => self::mixed(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '-3.14159', + 'sqliteExpectedResult' => -3.14159, + 'pdoPgsqlExpectedResult' => '-3.14159', + 'pgsqlExpectedResult' => '-3.14159', + 'mssqlExpectedResult' => '-3.14159', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'BOOL_PI()' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT BOOL_PI() FROM %s t', - 'mysql' => self::bool(), - 'sqlite' => self::bool(), - 'pdo_pgsql' => self::bool(), - 'pgsql' => self::bool(), - 'mssql' => self::bool(), - 'mysqlResult' => true, - 'sqliteResult' => true, - 'pdoPgsqlResult' => true, - 'pgsqlResult' => true, - 'mssqlResult' => true, + 'dqlTemplate' => 'SELECT BOOL_PI() FROM %s t', + 'mysqlExpectedType' => self::bool(), + 'sqliteExpectedType' => self::bool(), + 'pdoPgsqlExpectedType' => self::bool(), + 'pgsqlExpectedType' => self::bool(), + 'mssqlExpectedType' => self::bool(), + 'mysqlExpectedResult' => true, + 'sqliteExpectedResult' => true, + 'pdoPgsqlExpectedResult' => true, + 'pgsqlExpectedResult' => true, + 'mssqlExpectedResult' => true, 'stringify' => self::STRINGIFY_NONE, ]; yield 'STRING_PI()' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT STRING_PI() FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => self::mixed(), - 'pgsql' => self::mixed(), - 'mssql' => self::mixed(), - 'mysqlResult' => '3.14159', - 'sqliteResult' => 3.14159, - 'pdoPgsqlResult' => '3.14159', - 'pgsqlResult' => '3.14159', - 'mssqlResult' => '3.14159', + 'dqlTemplate' => 'SELECT STRING_PI() FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => self::mixed(), + 'pgsqlExpectedType' => self::mixed(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '3.14159', + 'sqliteExpectedResult' => 3.14159, + 'pdoPgsqlExpectedResult' => '3.14159', + 'pgsqlExpectedResult' => '3.14159', + 'mssqlExpectedResult' => '3.14159', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'INT_WRAP(MIN(t.col_float)) + no data' => [ 'data' => self::dataNone(), - 'select' => 'SELECT INT_WRAP(MIN(t.col_float)) FROM %s t', - 'mysql' => self::intOrNull(), - 'sqlite' => self::intOrNull(), - 'pdo_pgsql' => self::intOrNull(), - 'pgsql' => self::intOrNull(), - 'mssql' => self::intOrNull(), - 'mysqlResult' => null, - 'sqliteResult' => null, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT INT_WRAP(MIN(t.col_float)) FROM %s t', + 'mysqlExpectedType' => self::intOrNull(), + 'sqliteExpectedType' => self::intOrNull(), + 'pdoPgsqlExpectedType' => self::intOrNull(), + 'pgsqlExpectedType' => self::intOrNull(), + 'mssqlExpectedType' => self::intOrNull(), + 'mysqlExpectedResult' => null, + 'sqliteExpectedResult' => null, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_NONE, ]; yield 'INT_WRAP(MIN(t.col_float))' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT INT_WRAP(MIN(t.col_float)) FROM %s t', - 'mysql' => self::intOrNull(), - 'sqlite' => self::intOrNull(), - 'pdo_pgsql' => self::intOrNull(), - 'pgsql' => self::intOrNull(), - 'mssql' => self::intOrNull(), - 'mysqlResult' => 0, - 'sqliteResult' => 0, - 'pdoPgsqlResult' => 0, - 'pgsqlResult' => 0, - 'mssqlResult' => 0, + 'dqlTemplate' => 'SELECT INT_WRAP(MIN(t.col_float)) FROM %s t', + 'mysqlExpectedType' => self::intOrNull(), + 'sqliteExpectedType' => self::intOrNull(), + 'pdoPgsqlExpectedType' => self::intOrNull(), + 'pgsqlExpectedType' => self::intOrNull(), + 'mssqlExpectedType' => self::intOrNull(), + 'mysqlExpectedResult' => 0, + 'sqliteExpectedResult' => 0, + 'pdoPgsqlExpectedResult' => 0, + 'pgsqlExpectedResult' => 0, + 'mssqlExpectedResult' => 0, 'stringify' => self::STRINGIFY_NONE, ]; yield 'COALESCE(t.col_datetime, t.col_datetime)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COALESCE(t.col_datetime, t.col_datetime) FROM %s t', - 'mysql' => self::string(), - 'sqlite' => self::string(), - 'pdo_pgsql' => self::string(), - 'pgsql' => self::string(), - 'mssql' => self::mixed(), - 'mysqlResult' => '2024-01-31 12:59:59', - 'sqliteResult' => '2024-01-31 12:59:59', - 'pdoPgsqlResult' => '2024-01-31 12:59:59', - 'pgsqlResult' => '2024-01-31 12:59:59', - 'mssqlResult' => '2024-01-31 12:59:59.000000', // doctrine/dbal changes default ReturnDatesAsStrings to true + 'dqlTemplate' => 'SELECT COALESCE(t.col_datetime, t.col_datetime) FROM %s t', + 'mysqlExpectedType' => self::string(), + 'sqliteExpectedType' => self::string(), + 'pdoPgsqlExpectedType' => self::string(), + 'pgsqlExpectedType' => self::string(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '2024-01-31 12:59:59', + 'sqliteExpectedResult' => '2024-01-31 12:59:59', + 'pdoPgsqlExpectedResult' => '2024-01-31 12:59:59', + 'pgsqlExpectedResult' => '2024-01-31 12:59:59', + 'mssqlExpectedResult' => '2024-01-31 12:59:59.000000', // doctrine/dbal changes default ReturnDatesAsStrings to true 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'COALESCE(SUM(t.col_int_nullable), 0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COALESCE(SUM(t.col_int_nullable), 0) FROM %s t', - 'mysql' => self::numericString(true, true), - 'sqlite' => self::int(), - 'pdo_pgsql' => TypeCombinator::union(self::numericString(true, true), self::int()), - 'pgsql' => TypeCombinator::union(self::numericString(true, true), self::int()), - 'mssql' => self::mixed(), - 'mysqlResult' => '0', - 'sqliteResult' => 0, - 'pdoPgsqlResult' => 0, - 'pgsqlResult' => 0, - 'mssqlResult' => 0, + 'dqlTemplate' => 'SELECT COALESCE(SUM(t.col_int_nullable), 0) FROM %s t', + 'mysqlExpectedType' => self::numericString(true, true), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => TypeCombinator::union(self::numericString(true, true), self::int()), + 'pgsqlExpectedType' => TypeCombinator::union(self::numericString(true, true), self::int()), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '0', + 'sqliteExpectedResult' => 0, + 'pdoPgsqlExpectedResult' => 0, + 'pgsqlExpectedResult' => 0, + 'mssqlExpectedResult' => 0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'COALESCE(SUM(ABS(t.col_int)), 0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COALESCE(SUM(ABS(t.col_int)), 0) FROM %s t', - 'mysql' => self::numericString(true, true), - 'sqlite' => self::int(), - 'pdo_pgsql' => TypeCombinator::union(self::int(), self::numericString(true, true)), - 'pgsql' => TypeCombinator::union(self::int(), self::numericString(true, true)), - 'mssql' => self::mixed(), - 'mysqlResult' => '9', - 'sqliteResult' => 9, - 'pdoPgsqlResult' => 9, - 'pgsqlResult' => 9, - 'mssqlResult' => 9, + 'dqlTemplate' => 'SELECT COALESCE(SUM(ABS(t.col_int)), 0) FROM %s t', + 'mysqlExpectedType' => self::numericString(true, true), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => TypeCombinator::union(self::int(), self::numericString(true, true)), + 'pgsqlExpectedType' => TypeCombinator::union(self::int(), self::numericString(true, true)), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '9', + 'sqliteExpectedResult' => 9, + 'pdoPgsqlExpectedResult' => 9, + 'pgsqlExpectedResult' => 9, + 'mssqlExpectedResult' => 9, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "COALESCE(t.col_int_nullable, 'foo')" => [ 'data' => self::dataDefault(), - 'select' => "SELECT COALESCE(t.col_int_nullable, 'foo') FROM %s t", - 'mysql' => self::string(), - 'sqlite' => TypeCombinator::union(self::int(), self::string()), - 'pdo_pgsql' => null, // COALESCE types cannot be matched - 'pgsql' => null, // COALESCE types cannot be matched - 'mssql' => null, // Conversion failed - 'mysqlResult' => 'foo', - 'sqliteResult' => 'foo', - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => "SELECT COALESCE(t.col_int_nullable, 'foo') FROM %s t", + 'mysqlExpectedType' => self::string(), + 'sqliteExpectedType' => TypeCombinator::union(self::int(), self::string()), + 'pdoPgsqlExpectedType' => null, // COALESCE types cannot be matched + 'pgsqlExpectedType' => null, // COALESCE types cannot be matched + 'mssqlExpectedType' => null, // Conversion failed + 'mysqlExpectedResult' => 'foo', + 'sqliteExpectedResult' => 'foo', + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "COALESCE(t.col_int, 'foo')" => [ 'data' => self::dataDefault(), - 'select' => "SELECT COALESCE(t.col_int, 'foo') FROM %s t", - 'mysql' => self::string(), - 'sqlite' => TypeCombinator::union(self::int(), self::string()), - 'pdo_pgsql' => null, // COALESCE types cannot be matched - 'pgsql' => null, // COALESCE types cannot be matched - 'mssql' => self::mixed(), - 'mysqlResult' => '9', - 'sqliteResult' => 9, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => 9, + 'dqlTemplate' => "SELECT COALESCE(t.col_int, 'foo') FROM %s t", + 'mysqlExpectedType' => self::string(), + 'sqliteExpectedType' => TypeCombinator::union(self::int(), self::string()), + 'pdoPgsqlExpectedType' => null, // COALESCE types cannot be matched + 'pgsqlExpectedType' => null, // COALESCE types cannot be matched + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '9', + 'sqliteExpectedResult' => 9, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => 9, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "COALESCE(t.col_bool, 'foo')" => [ 'data' => self::dataDefault(), - 'select' => "SELECT COALESCE(t.col_bool, 'foo') FROM %s t", - 'mysql' => self::string(), - 'sqlite' => TypeCombinator::union(self::int(), self::string()), - 'pdo_pgsql' => null, // COALESCE types cannot be matched - 'pgsql' => null, // COALESCE types cannot be matched - 'mssql' => self::mixed(), - 'mysqlResult' => '1', - 'sqliteResult' => 1, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => 1, + 'dqlTemplate' => "SELECT COALESCE(t.col_bool, 'foo') FROM %s t", + 'mysqlExpectedType' => self::string(), + 'sqliteExpectedType' => TypeCombinator::union(self::int(), self::string()), + 'pdoPgsqlExpectedType' => null, // COALESCE types cannot be matched + 'pgsqlExpectedType' => null, // COALESCE types cannot be matched + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1', + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "COALESCE(1, 'foo')" => [ 'data' => self::dataDefault(), - 'select' => "SELECT COALESCE(1, 'foo') FROM %s t", - 'mysql' => self::string(), - 'sqlite' => TypeCombinator::union(self::int(), self::string()), - 'pdo_pgsql' => null, // COALESCE types cannot be matched - 'pgsql' => null, // COALESCE types cannot be matched - 'mssql' => self::mixed(), - 'mysqlResult' => '1', - 'sqliteResult' => 1, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => 1, + 'dqlTemplate' => "SELECT COALESCE(1, 'foo') FROM %s t", + 'mysqlExpectedType' => self::string(), + 'sqliteExpectedType' => TypeCombinator::union(self::int(), self::string()), + 'pdoPgsqlExpectedType' => null, // COALESCE types cannot be matched + 'pgsqlExpectedType' => null, // COALESCE types cannot be matched + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1', + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "COALESCE(1, '1')" => [ 'data' => self::dataDefault(), - 'select' => "SELECT COALESCE(1, '1') FROM %s t", - 'mysql' => self::numericString(true, true), - 'sqlite' => TypeCombinator::union(self::int(), self::numericString(true, true)), - 'pdo_pgsql' => TypeCombinator::union(self::int(), self::numericString(true, true)), - 'pgsql' => TypeCombinator::union(self::int(), self::numericString(true, true)), - 'mssql' => self::mixed(), - 'mysqlResult' => '1', - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => "SELECT COALESCE(1, '1') FROM %s t", + 'mysqlExpectedType' => self::numericString(true, true), + 'sqliteExpectedType' => TypeCombinator::union(self::int(), self::numericString(true, true)), + 'pdoPgsqlExpectedType' => TypeCombinator::union(self::int(), self::numericString(true, true)), + 'pgsqlExpectedType' => TypeCombinator::union(self::int(), self::numericString(true, true)), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1', + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'COALESCE(1, 1.0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COALESCE(1, 1.0) FROM %s t', - 'mysql' => self::numericString(), - 'sqlite' => TypeCombinator::union(self::int(), self::float()), - 'pdo_pgsql' => TypeCombinator::union(self::int(), self::numericString(true, true)), - 'pgsql' => TypeCombinator::union(self::int(), self::numericString(true, true)), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.0', - 'sqliteResult' => 1, - 'pdoPgsqlResult' => '1', - 'pgsqlResult' => '1', - 'mssqlResult' => '1.0', + 'dqlTemplate' => 'SELECT COALESCE(1, 1.0) FROM %s t', + 'mysqlExpectedType' => self::numericString(), + 'sqliteExpectedType' => TypeCombinator::union(self::int(), self::float()), + 'pdoPgsqlExpectedType' => TypeCombinator::union(self::int(), self::numericString(true, true)), + 'pgsqlExpectedType' => TypeCombinator::union(self::int(), self::numericString(true, true)), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.0', + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => '1', + 'pgsqlExpectedResult' => '1', + 'mssqlExpectedResult' => '1.0', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'COALESCE(0, 0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COALESCE(0, 0) FROM %s t', - 'mysql' => self::int(), - 'sqlite' => self::int(), - 'pdo_pgsql' => self::int(), - 'pgsql' => self::int(), - 'mssql' => self::mixed(), - 'mysqlResult' => 0, - 'sqliteResult' => 0, - 'pdoPgsqlResult' => 0, - 'pgsqlResult' => 0, - 'mssqlResult' => 0, + 'dqlTemplate' => 'SELECT COALESCE(0, 0) FROM %s t', + 'mysqlExpectedType' => self::int(), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => self::int(), + 'pgsqlExpectedType' => self::int(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0, + 'sqliteExpectedResult' => 0, + 'pdoPgsqlExpectedResult' => 0, + 'pgsqlExpectedResult' => 0, + 'mssqlExpectedResult' => 0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'COALESCE(1.0, 1.0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COALESCE(1.0, 1.0) FROM %s t', - 'mysql' => self::numericString(true, true), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::numericString(true, true), - 'pgsql' => self::numericString(true, true), - 'mssql' => self::mixed(), - 'mysqlResult' => '1.0', - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => '1.0', - 'pgsqlResult' => '1.0', - 'mssqlResult' => '1.0', + 'dqlTemplate' => 'SELECT COALESCE(1.0, 1.0) FROM %s t', + 'mysqlExpectedType' => self::numericString(true, true), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::numericString(true, true), + 'pgsqlExpectedType' => self::numericString(true, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1.0', + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => '1.0', + 'pgsqlExpectedResult' => '1.0', + 'mssqlExpectedResult' => '1.0', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'COALESCE(1e0, 1.0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COALESCE(1e0, 1.0) FROM %s t', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => self::numericString(true, true), - 'pgsql' => self::numericString(true, true), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1.0, - 'pdoPgsqlResult' => '1', - 'pgsqlResult' => '1', - 'mssqlResult' => 1.0, + 'dqlTemplate' => 'SELECT COALESCE(1e0, 1.0) FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => self::numericString(true, true), + 'pgsqlExpectedType' => self::numericString(true, true), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1.0, + 'pdoPgsqlExpectedResult' => '1', + 'pgsqlExpectedResult' => '1', + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'COALESCE(1, 1.0, 1e0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COALESCE(1, 1.0, 1e0) FROM %s t', - 'mysql' => self::float(), - 'sqlite' => TypeCombinator::union(self::float(), self::int()), - 'pdo_pgsql' => TypeCombinator::union(self::int(), self::numericString(true, true)), - 'pgsql' => TypeCombinator::union(self::int(), self::numericString(true, true)), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => '1', - 'pgsqlResult' => '1', - 'mssqlResult' => 1.0, + 'dqlTemplate' => 'SELECT COALESCE(1, 1.0, 1e0) FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => TypeCombinator::union(self::float(), self::int()), + 'pdoPgsqlExpectedType' => TypeCombinator::union(self::int(), self::numericString(true, true)), + 'pgsqlExpectedType' => TypeCombinator::union(self::int(), self::numericString(true, true)), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => '1', + 'pgsqlExpectedResult' => '1', + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "COALESCE(1, 1.0, 1e0, '1')" => [ 'data' => self::dataDefault(), - 'select' => "SELECT COALESCE(1, 1.0, 1e0, '1') FROM %s t", - 'mysql' => self::numericString(), - 'sqlite' => TypeCombinator::union(self::float(), self::int(), self::numericString(true, true)), - 'pdo_pgsql' => TypeCombinator::union(self::int(), self::numericString(true, true)), - 'pgsql' => TypeCombinator::union(self::int(), self::numericString(true, true)), - 'mssql' => self::mixed(), - 'mysqlResult' => '1', - 'sqliteResult' => 1, - 'pdoPgsqlResult' => '1', - 'pgsqlResult' => '1', - 'mssqlResult' => 1.0, + 'dqlTemplate' => "SELECT COALESCE(1, 1.0, 1e0, '1') FROM %s t", + 'mysqlExpectedType' => self::numericString(), + 'sqliteExpectedType' => TypeCombinator::union(self::float(), self::int(), self::numericString(true, true)), + 'pdoPgsqlExpectedType' => TypeCombinator::union(self::int(), self::numericString(true, true)), + 'pgsqlExpectedType' => TypeCombinator::union(self::int(), self::numericString(true, true)), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '1', + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => '1', + 'pgsqlExpectedResult' => '1', + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'COALESCE(t.col_int_nullable, 0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COALESCE(t.col_int_nullable, 0) FROM %s t', - 'mysql' => self::int(), - 'sqlite' => self::int(), - 'pdo_pgsql' => self::int(), - 'pgsql' => self::int(), - 'mssql' => self::mixed(), - 'mysqlResult' => 0, - 'sqliteResult' => 0, - 'pdoPgsqlResult' => 0, - 'pgsqlResult' => 0, - 'mssqlResult' => 0, + 'dqlTemplate' => 'SELECT COALESCE(t.col_int_nullable, 0) FROM %s t', + 'mysqlExpectedType' => self::int(), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => self::int(), + 'pgsqlExpectedType' => self::int(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0, + 'sqliteExpectedResult' => 0, + 'pdoPgsqlExpectedResult' => 0, + 'pgsqlExpectedResult' => 0, + 'mssqlExpectedResult' => 0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'COALESCE(t.col_int_nullable, t.col_bool)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COALESCE(t.col_int_nullable, t.col_bool) FROM %s t', - 'mysql' => self::int(), - 'sqlite' => self::int(), - 'pdo_pgsql' => null, // COALESCE types cannot be matched - 'pgsql' => null, // COALESCE types cannot be matched - 'mssql' => self::mixed(), - 'mysqlResult' => 1, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT COALESCE(t.col_int_nullable, t.col_bool) FROM %s t', + 'mysqlExpectedType' => self::int(), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => null, // COALESCE types cannot be matched + 'pgsqlExpectedType' => null, // COALESCE types cannot be matched + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'COALESCE(t.col_float_nullable, 0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COALESCE(t.col_float_nullable, 0) FROM %s t', - 'mysql' => self::float(), - 'sqlite' => TypeCombinator::union(self::float(), self::int()), - 'pdo_pgsql' => PHP_VERSION_ID < 80400 + 'dqlTemplate' => 'SELECT COALESCE(t.col_float_nullable, 0) FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => TypeCombinator::union(self::float(), self::int()), + 'pdoPgsqlExpectedType' => PHP_VERSION_ID < 80400 ? TypeCombinator::union(self::numericString(), self::int()) : TypeCombinator::union(self::float(), self::int()), - 'pgsql' => TypeCombinator::union(self::float(), self::int()), - 'mssql' => self::mixed(), - 'mysqlResult' => 0.0, - 'sqliteResult' => 0, - 'pdoPgsqlResult' => PHP_VERSION_ID < 80400 ? '0' : 0.0, - 'pgsqlResult' => 0.0, - 'mssqlResult' => 0.0, + 'pgsqlExpectedType' => TypeCombinator::union(self::float(), self::int()), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0.0, + 'sqliteExpectedResult' => 0, + 'pdoPgsqlExpectedResult' => PHP_VERSION_ID < 80400 ? '0' : 0.0, + 'pgsqlExpectedResult' => 0.0, + 'mssqlExpectedResult' => 0.0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'COALESCE(t.col_float_nullable, 0.0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COALESCE(t.col_float_nullable, 0.0) FROM %s t', - 'mysql' => self::float(), - 'sqlite' => self::float(), - 'pdo_pgsql' => TypeCombinator::union(self::float(), self::numericString(false, true)), - 'pgsql' => TypeCombinator::union(self::float(), self::numericString(false, true)), - 'mssql' => self::mixed(), - 'mysqlResult' => 0.0, - 'sqliteResult' => 0.0, - 'pdoPgsqlResult' => 0.0, - 'pgsqlResult' => 0.0, - 'mssqlResult' => 0.0, + 'dqlTemplate' => 'SELECT COALESCE(t.col_float_nullable, 0.0) FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => self::float(), + 'pdoPgsqlExpectedType' => TypeCombinator::union(self::float(), self::numericString(false, true)), + 'pgsqlExpectedType' => TypeCombinator::union(self::float(), self::numericString(false, true)), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0.0, + 'sqliteExpectedResult' => 0.0, + 'pdoPgsqlExpectedResult' => 0.0, + 'pgsqlExpectedResult' => 0.0, + 'mssqlExpectedResult' => 0.0, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 'COALESCE(t.col_int_nullable, t.col_decimal_nullable, 0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COALESCE(t.col_int_nullable, t.col_decimal_nullable, 0) FROM %s t', - 'mysql' => self::numericString(), - 'sqlite' => TypeCombinator::union(self::float(), self::int()), - 'pdo_pgsql' => TypeCombinator::union(self::numericString(), self::int()), - 'pgsql' => TypeCombinator::union(self::numericString(), self::int()), - 'mssql' => self::mixed(), - 'mysqlResult' => '0.0', - 'sqliteResult' => 0, - 'pdoPgsqlResult' => '0', - 'pgsqlResult' => '0', - 'mssqlResult' => '.0', + 'dqlTemplate' => 'SELECT COALESCE(t.col_int_nullable, t.col_decimal_nullable, 0) FROM %s t', + 'mysqlExpectedType' => self::numericString(), + 'sqliteExpectedType' => TypeCombinator::union(self::float(), self::int()), + 'pdoPgsqlExpectedType' => TypeCombinator::union(self::numericString(), self::int()), + 'pgsqlExpectedType' => TypeCombinator::union(self::numericString(), self::int()), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '0.0', + 'sqliteExpectedResult' => 0, + 'pdoPgsqlExpectedResult' => '0', + 'pgsqlExpectedResult' => '0', + 'mssqlExpectedResult' => '.0', 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'COALESCE(t.col_int_nullable, t.col_decimal_nullable, t.col_float_nullable, 0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COALESCE(t.col_int_nullable, t.col_decimal_nullable, t.col_float_nullable, 0) FROM %s t', - 'mysql' => self::float(), - 'sqlite' => TypeCombinator::union(self::float(), self::int()), - 'pdo_pgsql' => PHP_VERSION_ID < 80400 + 'dqlTemplate' => 'SELECT COALESCE(t.col_int_nullable, t.col_decimal_nullable, t.col_float_nullable, 0) FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => TypeCombinator::union(self::float(), self::int()), + 'pdoPgsqlExpectedType' => PHP_VERSION_ID < 80400 ? TypeCombinator::union(self::numericString(), self::int()) : TypeCombinator::union(self::numericString(), self::int(), self::float()), - 'pgsql' => TypeCombinator::union(self::numericString(), self::int(), self::float()), - 'mssql' => self::mixed(), - 'mysqlResult' => 0.0, - 'sqliteResult' => 0, - 'pdoPgsqlResult' => PHP_VERSION_ID < 80400 ? '0' : 0.0, - 'pgsqlResult' => 0.0, - 'mssqlResult' => 0.0, + 'pgsqlExpectedType' => TypeCombinator::union(self::numericString(), self::int(), self::float()), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0.0, + 'sqliteExpectedResult' => 0, + 'pdoPgsqlExpectedResult' => PHP_VERSION_ID < 80400 ? '0' : 0.0, + 'pgsqlExpectedResult' => 0.0, + 'mssqlExpectedResult' => 0.0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'COALESCE(t.col_int_nullable, t.col_decimal_nullable, t.col_float_nullable, 0.0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COALESCE(t.col_int_nullable, t.col_decimal_nullable, t.col_float_nullable, 0.0) FROM %s t', - 'mysql' => self::float(), - 'sqlite' => TypeCombinator::union(self::float(), self::int()), - 'pdo_pgsql' => PHP_VERSION_ID < 80400 + 'dqlTemplate' => 'SELECT COALESCE(t.col_int_nullable, t.col_decimal_nullable, t.col_float_nullable, 0.0) FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => TypeCombinator::union(self::float(), self::int()), + 'pdoPgsqlExpectedType' => PHP_VERSION_ID < 80400 ? TypeCombinator::union(self::numericString(), self::int()) : TypeCombinator::union(self::numericString(), self::int(), self::float()), - 'pgsql' => TypeCombinator::union(self::numericString(), self::int(), self::float()), - 'mssql' => self::mixed(), - 'mysqlResult' => 0.0, - 'sqliteResult' => 0.0, - 'pdoPgsqlResult' => PHP_VERSION_ID < 80400 ? '0' : 0.0, - 'pgsqlResult' => 0.0, - 'mssqlResult' => 0.0, + 'pgsqlExpectedType' => TypeCombinator::union(self::numericString(), self::int(), self::float()), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0.0, + 'sqliteExpectedResult' => 0.0, + 'pdoPgsqlExpectedResult' => PHP_VERSION_ID < 80400 ? '0' : 0.0, + 'pgsqlExpectedResult' => 0.0, + 'mssqlExpectedResult' => 0.0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'COALESCE(t.col_int_nullable, t.col_decimal_nullable, t.col_float_nullable, 0e0)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COALESCE(t.col_int_nullable, t.col_decimal_nullable, t.col_float_nullable, 0e0) FROM %s t', - 'mysql' => self::float(), - 'sqlite' => TypeCombinator::union(self::float(), self::int()), - 'pdo_pgsql' => PHP_VERSION_ID < 80400 + 'dqlTemplate' => 'SELECT COALESCE(t.col_int_nullable, t.col_decimal_nullable, t.col_float_nullable, 0e0) FROM %s t', + 'mysqlExpectedType' => self::float(), + 'sqliteExpectedType' => TypeCombinator::union(self::float(), self::int()), + 'pdoPgsqlExpectedType' => PHP_VERSION_ID < 80400 ? TypeCombinator::union(self::numericString(), self::int()) : TypeCombinator::union(self::numericString(), self::int(), self::float()), - 'pgsql' => TypeCombinator::union(self::numericString(), self::int(), self::float()), - 'mssql' => self::mixed(), - 'mysqlResult' => 0.0, - 'sqliteResult' => 0.0, - 'pdoPgsqlResult' => PHP_VERSION_ID < 80400 ? '0' : 0.0, - 'pgsqlResult' => 0.0, - 'mssqlResult' => 0.0, + 'pgsqlExpectedType' => TypeCombinator::union(self::numericString(), self::int(), self::float()), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 0.0, + 'sqliteExpectedResult' => 0.0, + 'pdoPgsqlExpectedResult' => PHP_VERSION_ID < 80400 ? '0' : 0.0, + 'pgsqlExpectedResult' => 0.0, + 'mssqlExpectedResult' => 0.0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield "COALESCE(t.col_int_nullable, t.col_decimal_nullable, t.col_float_nullable, '0')" => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COALESCE(t.col_int_nullable, t.col_decimal_nullable, t.col_float_nullable, \'0\') FROM %s t', - 'mysql' => self::numericString(), - 'sqlite' => TypeCombinator::union(self::float(), self::int(), self::numericString()), - 'pdo_pgsql' => PHP_VERSION_ID < 80400 + 'dqlTemplate' => 'SELECT COALESCE(t.col_int_nullable, t.col_decimal_nullable, t.col_float_nullable, \'0\') FROM %s t', + 'mysqlExpectedType' => self::numericString(), + 'sqliteExpectedType' => TypeCombinator::union(self::float(), self::int(), self::numericString()), + 'pdoPgsqlExpectedType' => PHP_VERSION_ID < 80400 ? TypeCombinator::union(self::numericString(), self::int()) : TypeCombinator::union(self::numericString(), self::int(), self::float()), - 'pgsql' => TypeCombinator::union(self::numericString(), self::int(), self::float()), - 'mssql' => self::mixed(), - 'mysqlResult' => '0', - 'sqliteResult' => '0', - 'pdoPgsqlResult' => PHP_VERSION_ID < 80400 ? '0' : 0.0, - 'pgsqlResult' => 0.0, - 'mssqlResult' => 0.0, + 'pgsqlExpectedType' => TypeCombinator::union(self::numericString(), self::int(), self::float()), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '0', + 'sqliteExpectedResult' => '0', + 'pdoPgsqlExpectedResult' => PHP_VERSION_ID < 80400 ? '0' : 0.0, + 'pgsqlExpectedResult' => 0.0, + 'mssqlExpectedResult' => 0.0, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'COALESCE(t.col_int_nullable, t.col_decimal_nullable, t.col_float_nullable, t.col_string)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COALESCE(t.col_int_nullable, t.col_decimal_nullable, t.col_float_nullable, t.col_string) FROM %s t', - 'mysql' => self::string(), - 'sqlite' => TypeCombinator::union(self::float(), self::int(), self::string()), - 'pdo_pgsql' => null, // COALESCE types cannot be matched - 'pgsql' => null, // COALESCE types cannot be matched - 'mssql' => null, // Error converting data - 'mysqlResult' => 'foobar', - 'sqliteResult' => 'foobar', - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => null, + 'dqlTemplate' => 'SELECT COALESCE(t.col_int_nullable, t.col_decimal_nullable, t.col_float_nullable, t.col_string) FROM %s t', + 'mysqlExpectedType' => self::string(), + 'sqliteExpectedType' => TypeCombinator::union(self::float(), self::int(), self::string()), + 'pdoPgsqlExpectedType' => null, // COALESCE types cannot be matched + 'pgsqlExpectedType' => null, // COALESCE types cannot be matched + 'mssqlExpectedType' => null, // Error converting data + 'mysqlExpectedResult' => 'foobar', + 'sqliteExpectedResult' => 'foobar', + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => null, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'COALESCE(t.col_int_nullable, t.col_decimal_nullable, t.col_float_nullable, t.col_mixed)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COALESCE(t.col_int_nullable, t.col_decimal_nullable, t.col_float_nullable, t.col_mixed) FROM %s t', - 'mysql' => self::mixed(), - 'sqlite' => self::mixed(), - 'pdo_pgsql' => self::mixed(), - 'pgsql' => self::mixed(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1.0, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1.0, - 'pgsqlResult' => 1.0, - 'mssqlResult' => 1.0, + 'dqlTemplate' => 'SELECT COALESCE(t.col_int_nullable, t.col_decimal_nullable, t.col_float_nullable, t.col_mixed) FROM %s t', + 'mysqlExpectedType' => self::mixed(), + 'sqliteExpectedType' => self::mixed(), + 'pdoPgsqlExpectedType' => self::mixed(), + 'pgsqlExpectedType' => self::mixed(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1.0, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1.0, + 'pgsqlExpectedResult' => 1.0, + 'mssqlExpectedResult' => 1.0, 'stringify' => self::STRINGIFY_PG_FLOAT, ]; yield 'COALESCE(t.col_string_nullable, t.col_int)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT COALESCE(t.col_string_nullable, t.col_int) FROM %s t', - 'mysql' => self::string(), - 'sqlite' => TypeCombinator::union(self::int(), self::string()), - 'pdo_pgsql' => null, // COALESCE types cannot be matched - 'pgsql' => null, // COALESCE types cannot be matched - 'mssql' => self::mixed(), - 'mysqlResult' => '9', - 'sqliteResult' => 9, - 'pdoPgsqlResult' => null, - 'pgsqlResult' => null, - 'mssqlResult' => 9, + 'dqlTemplate' => 'SELECT COALESCE(t.col_string_nullable, t.col_int) FROM %s t', + 'mysqlExpectedType' => self::string(), + 'sqliteExpectedType' => TypeCombinator::union(self::int(), self::string()), + 'pdoPgsqlExpectedType' => null, // COALESCE types cannot be matched + 'pgsqlExpectedType' => null, // COALESCE types cannot be matched + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => '9', + 'sqliteExpectedResult' => 9, + 'pdoPgsqlExpectedResult' => null, + 'pgsqlExpectedResult' => null, + 'mssqlExpectedResult' => 9, 'stringify' => self::STRINGIFY_DEFAULT, ]; yield 'IDENTITY(t.related_entity)' => [ 'data' => self::dataDefault(), - 'select' => 'SELECT IDENTITY(t.related_entity) FROM %s t', - 'mysql' => self::int(), - 'sqlite' => self::int(), - 'pdo_pgsql' => self::int(), - 'pgsql' => self::int(), - 'mssql' => self::mixed(), - 'mysqlResult' => 1, - 'sqliteResult' => 1, - 'pdoPgsqlResult' => 1, - 'pgsqlResult' => 1, - 'mssqlResult' => 1, + 'dqlTemplate' => 'SELECT IDENTITY(t.related_entity) FROM %s t', + 'mysqlExpectedType' => self::int(), + 'sqliteExpectedType' => self::int(), + 'pdoPgsqlExpectedType' => self::int(), + 'pgsqlExpectedType' => self::int(), + 'mssqlExpectedType' => self::mixed(), + 'mysqlExpectedResult' => 1, + 'sqliteExpectedResult' => 1, + 'pdoPgsqlExpectedResult' => 1, + 'pgsqlExpectedResult' => 1, + 'mssqlExpectedResult' => 1, 'stringify' => self::STRINGIFY_DEFAULT, ]; } diff --git a/tests/Type/Doctrine/NewExprTest.php b/tests/Type/Doctrine/NewExprTest.php index ee3ff1d2..e1bb9dde 100644 --- a/tests/Type/Doctrine/NewExprTest.php +++ b/tests/Type/Doctrine/NewExprTest.php @@ -7,9 +7,6 @@ class NewExprTest extends TypeInferenceTestCase { - /** - * @return iterable - */ public function dataFileAsserts(): iterable { yield from $this->gatherAssertTypes(__DIR__ . '/data/bug-191.php'); diff --git a/tests/Type/Doctrine/QueryBuilderTypeSpecifyingExtensionTest.php b/tests/Type/Doctrine/QueryBuilderTypeSpecifyingExtensionTest.php index e0ebc471..9af21808 100644 --- a/tests/Type/Doctrine/QueryBuilderTypeSpecifyingExtensionTest.php +++ b/tests/Type/Doctrine/QueryBuilderTypeSpecifyingExtensionTest.php @@ -7,9 +7,6 @@ class QueryBuilderTypeSpecifyingExtensionTest extends TypeInferenceTestCase { - /** - * @return iterable - */ public function dataFileAsserts(): iterable { yield from $this->gatherAssertTypes(__DIR__ . '/data/bug-219.php');