Skip to content

Commit 71ba62a

Browse files
staabmclxmstaab
andauthored
Added support for aggregate functions (#135)
Co-authored-by: Markus Staab <m.staab@complex-it.de>
1 parent 71f573d commit 71ba62a

File tree

4 files changed

+258
-0
lines changed

4 files changed

+258
-0
lines changed

.phpstan-dba.cache

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -679,6 +679,131 @@
679679
1 => NULL,
680680
),
681681
),
682+
'SELECT MAX(adaid), MIN(adaid), COUNT(adaid), AVG(adaid) FROM ada WHERE adaid = 1' =>
683+
array (
684+
'error' => NULL,
685+
'result' =>
686+
array (
687+
1 =>
688+
PHPStan\Type\Constant\ConstantArrayType::__set_state(array(
689+
'keyType' =>
690+
PHPStan\Type\UnionType::__set_state(array(
691+
'types' =>
692+
array (
693+
0 =>
694+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
695+
'value' => 'AVG(adaid)',
696+
'isClassString' => false,
697+
)),
698+
1 =>
699+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
700+
'value' => 'COUNT(adaid)',
701+
'isClassString' => false,
702+
)),
703+
2 =>
704+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
705+
'value' => 'MAX(adaid)',
706+
'isClassString' => false,
707+
)),
708+
3 =>
709+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
710+
'value' => 'MIN(adaid)',
711+
'isClassString' => false,
712+
)),
713+
),
714+
)),
715+
'itemType' =>
716+
PHPStan\Type\UnionType::__set_state(array(
717+
'types' =>
718+
array (
719+
0 =>
720+
PHPStan\Type\FloatType::__set_state(array(
721+
)),
722+
1 =>
723+
PHPStan\Type\IntegerType::__set_state(array(
724+
)),
725+
2 =>
726+
PHPStan\Type\NullType::__set_state(array(
727+
)),
728+
),
729+
)),
730+
'allArrays' => NULL,
731+
'keyTypes' =>
732+
array (
733+
0 =>
734+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
735+
'value' => 'MAX(adaid)',
736+
'isClassString' => false,
737+
)),
738+
1 =>
739+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
740+
'value' => 'MIN(adaid)',
741+
'isClassString' => false,
742+
)),
743+
2 =>
744+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
745+
'value' => 'COUNT(adaid)',
746+
'isClassString' => false,
747+
)),
748+
3 =>
749+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
750+
'value' => 'AVG(adaid)',
751+
'isClassString' => false,
752+
)),
753+
),
754+
'valueTypes' =>
755+
array (
756+
0 =>
757+
PHPStan\Type\UnionType::__set_state(array(
758+
'types' =>
759+
array (
760+
0 =>
761+
PHPStan\Type\IntegerRangeType::__set_state(array(
762+
'min' => -2147483648,
763+
'max' => 2147483647,
764+
)),
765+
1 =>
766+
PHPStan\Type\NullType::__set_state(array(
767+
)),
768+
),
769+
)),
770+
1 =>
771+
PHPStan\Type\UnionType::__set_state(array(
772+
'types' =>
773+
array (
774+
0 =>
775+
PHPStan\Type\IntegerRangeType::__set_state(array(
776+
'min' => -2147483648,
777+
'max' => 2147483647,
778+
)),
779+
1 =>
780+
PHPStan\Type\NullType::__set_state(array(
781+
)),
782+
),
783+
)),
784+
2 =>
785+
PHPStan\Type\IntegerType::__set_state(array(
786+
)),
787+
3 =>
788+
PHPStan\Type\UnionType::__set_state(array(
789+
'types' =>
790+
array (
791+
0 =>
792+
PHPStan\Type\FloatType::__set_state(array(
793+
)),
794+
1 =>
795+
PHPStan\Type\NullType::__set_state(array(
796+
)),
797+
),
798+
)),
799+
),
800+
'nextAutoIndex' => 0,
801+
'optionalKeys' =>
802+
array (
803+
),
804+
)),
805+
),
806+
),
682807
'SELECT a.email, b.adaid, b.gesperrt FROM ada a LEFT JOIN ada b ON a.adaid=b.adaid' =>
683808
array (
684809
'error' => NULL,

.phpunit-phpstan-dba.cache

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,131 @@
779779
'code' => 1146,
780780
)),
781781
),
782+
'SELECT MAX(adaid), MIN(adaid), COUNT(adaid), AVG(adaid) FROM ada WHERE adaid = 1' =>
783+
array (
784+
'error' => NULL,
785+
'result' =>
786+
array (
787+
1 =>
788+
PHPStan\Type\Constant\ConstantArrayType::__set_state(array(
789+
'keyType' =>
790+
PHPStan\Type\UnionType::__set_state(array(
791+
'types' =>
792+
array (
793+
0 =>
794+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
795+
'value' => 'AVG(adaid)',
796+
'isClassString' => false,
797+
)),
798+
1 =>
799+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
800+
'value' => 'COUNT(adaid)',
801+
'isClassString' => false,
802+
)),
803+
2 =>
804+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
805+
'value' => 'MAX(adaid)',
806+
'isClassString' => false,
807+
)),
808+
3 =>
809+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
810+
'value' => 'MIN(adaid)',
811+
'isClassString' => false,
812+
)),
813+
),
814+
)),
815+
'itemType' =>
816+
PHPStan\Type\UnionType::__set_state(array(
817+
'types' =>
818+
array (
819+
0 =>
820+
PHPStan\Type\FloatType::__set_state(array(
821+
)),
822+
1 =>
823+
PHPStan\Type\IntegerType::__set_state(array(
824+
)),
825+
2 =>
826+
PHPStan\Type\NullType::__set_state(array(
827+
)),
828+
),
829+
)),
830+
'allArrays' => NULL,
831+
'keyTypes' =>
832+
array (
833+
0 =>
834+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
835+
'value' => 'MAX(adaid)',
836+
'isClassString' => false,
837+
)),
838+
1 =>
839+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
840+
'value' => 'MIN(adaid)',
841+
'isClassString' => false,
842+
)),
843+
2 =>
844+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
845+
'value' => 'COUNT(adaid)',
846+
'isClassString' => false,
847+
)),
848+
3 =>
849+
PHPStan\Type\Constant\ConstantStringType::__set_state(array(
850+
'value' => 'AVG(adaid)',
851+
'isClassString' => false,
852+
)),
853+
),
854+
'valueTypes' =>
855+
array (
856+
0 =>
857+
PHPStan\Type\UnionType::__set_state(array(
858+
'types' =>
859+
array (
860+
0 =>
861+
PHPStan\Type\IntegerRangeType::__set_state(array(
862+
'min' => -2147483648,
863+
'max' => 2147483647,
864+
)),
865+
1 =>
866+
PHPStan\Type\NullType::__set_state(array(
867+
)),
868+
),
869+
)),
870+
1 =>
871+
PHPStan\Type\UnionType::__set_state(array(
872+
'types' =>
873+
array (
874+
0 =>
875+
PHPStan\Type\IntegerRangeType::__set_state(array(
876+
'min' => -2147483648,
877+
'max' => 2147483647,
878+
)),
879+
1 =>
880+
PHPStan\Type\NullType::__set_state(array(
881+
)),
882+
),
883+
)),
884+
2 =>
885+
PHPStan\Type\IntegerType::__set_state(array(
886+
)),
887+
3 =>
888+
PHPStan\Type\UnionType::__set_state(array(
889+
'types' =>
890+
array (
891+
0 =>
892+
PHPStan\Type\FloatType::__set_state(array(
893+
)),
894+
1 =>
895+
PHPStan\Type\NullType::__set_state(array(
896+
)),
897+
),
898+
)),
899+
),
900+
'nextAutoIndex' => 0,
901+
'optionalKeys' =>
902+
array (
903+
),
904+
)),
905+
),
906+
),
782907
'SELECT a.email, b.adaid, b.gesperrt FROM ada a LEFT JOIN ada b ON a.adaid=b.adaid' =>
783908
array (
784909
'error' => NULL,

src/QueryReflection/MysqliQueryReflector.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ private function mapMysqlToPHPStanType(int $mysqlType, int $mysqlFlags, int $len
267267
if (null === $phpstanType) {
268268
switch ($this->type2txt($mysqlType)) {
269269
case 'DOUBLE':
270+
case 'NEWDECIMAL':
270271
$phpstanType = new FloatType();
271272
break;
272273
case 'LONGLONG':

tests/data/pdo.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,4 +137,11 @@ public function mysqlTypes(PDO $pdo)
137137
$stmt = $pdo->query('SELECT * FROM typemix', PDO::FETCH_ASSOC);
138138
assertType('PDOStatement<array{pid: int<0, 4294967295>, c_char5: string, c_varchar255: string, c_varchar25: string|null, c_varbinary255: string, c_varbinary25: string|null, c_date: string|null, c_time: string|null, c_datetime: string|null, c_timestamp: string|null, c_year: int<0, 255>|null, c_tiny_text: string|null, c_medium_text: string|null, c_text: string|null, c_long_text: string|null, c_enum: string, c_set: string, c_bit: int|null, c_int: int<-2147483648, 2147483647>, c_tinyint: int<-128, 127>, c_smallint: int<-32768, 32767>, c_mediumint: int<-8388608, 8388607>, c_bigint: int, c_double: int, c_real: int, c_boolean: int<-128, 127>, c_blob: string, c_tinyblob: string, c_mediumblog: string, c_longblob: string, c_unsigned_tinyint: int<0, 255>, c_unsigned_int: int<0, 4294967295>, c_unsigned_smallint: int<0, 65535>, c_unsigned_mediumint: int<0, 16777215>, c_unsigned_bigint: int<0, max>}>', $stmt);
139139
}
140+
141+
public function aggregateFunctions(PDO $pdo)
142+
{
143+
$query = 'SELECT MAX(adaid), MIN(adaid), COUNT(adaid), AVG(adaid) FROM ada WHERE adaid = 1';
144+
$stmt = $pdo->query($query, PDO::FETCH_ASSOC);
145+
assertType('PDOStatement<array{MAX(adaid): int<-2147483648, 2147483647>|null, MIN(adaid): int<-2147483648, 2147483647>|null, COUNT(adaid): int, AVG(adaid): float|null}>', $stmt);
146+
}
140147
}

0 commit comments

Comments
 (0)