From 155235e75489c19e64eec572e813b6d4a73f2a4a Mon Sep 17 00:00:00 2001 From: Kevin Pfeifer Date: Sat, 21 Feb 2026 20:26:56 +0100 Subject: [PATCH 1/2] fix modified column being nullable --- composer.json | 2 +- src/Db/Table.php | 4 ++-- tests/TestCase/Db/Adapter/MysqlAdapterTest.php | 4 ++-- tests/TestCase/Db/Adapter/SqliteAdapterTest.php | 2 +- tests/TestCase/Db/Table/TableTest.php | 12 ++++++------ 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/composer.json b/composer.json index 0d0597f1..1dac84d0 100644 --- a/composer.json +++ b/composer.json @@ -29,7 +29,7 @@ }, "require-dev": { "cakephp/bake": "^3.3", - "cakephp/cakephp": "^5.3.0", + "cakephp/cakephp": "^5.3.2", "cakephp/cakephp-codesniffer": "^5.0", "phpunit/phpunit": "^11.5.3 || ^12.1.3" }, diff --git a/src/Db/Table.php b/src/Db/Table.php index aeeb0906..711efff0 100644 --- a/src/Db/Table.php +++ b/src/Db/Table.php @@ -729,8 +729,8 @@ public function addTimestamps(string|false|null $createdAt = 'created', string|f } if ($updatedAt) { $this->addColumn($updatedAt, $timestampType, [ - 'null' => true, - 'default' => null, + 'null' => false, + 'default' => 'CURRENT_TIMESTAMP', 'update' => 'CURRENT_TIMESTAMP', 'timezone' => $withTimezone, ]); diff --git a/tests/TestCase/Db/Adapter/MysqlAdapterTest.php b/tests/TestCase/Db/Adapter/MysqlAdapterTest.php index 85aded71..91cf6833 100644 --- a/tests/TestCase/Db/Adapter/MysqlAdapterTest.php +++ b/tests/TestCase/Db/Adapter/MysqlAdapterTest.php @@ -576,8 +576,8 @@ public function testAddTimestampsFeatureFlag() $this->assertEquals('updated', $columns[2]->getName()); $this->assertEquals('datetime', $columns[2]->getType()); $this->assertContains($columns[2]->getUpdate(), ['CURRENT_TIMESTAMP', 'current_timestamp()']); - $this->assertTrue($columns[2]->isNull()); - $this->assertNull($columns[2]->getDefault()); + $this->assertFalse($columns[2]->isNull()); + $this->assertContains($columns[2]->getDefault(), ['CURRENT_TIMESTAMP', 'current_timestamp()']); } public function testCreateTableWithSchema() diff --git a/tests/TestCase/Db/Adapter/SqliteAdapterTest.php b/tests/TestCase/Db/Adapter/SqliteAdapterTest.php index 2fd54a9b..5b3c80fa 100644 --- a/tests/TestCase/Db/Adapter/SqliteAdapterTest.php +++ b/tests/TestCase/Db/Adapter/SqliteAdapterTest.php @@ -2092,7 +2092,7 @@ public function testAlterTableColumnAdd() ['name' => 'string_col_2', 'type' => 'string', 'default' => null, 'null' => true], ['name' => 'string_col_3', 'type' => 'string', 'default' => null, 'null' => false], ['name' => 'created', 'type' => 'timestamp', 'default' => 'CURRENT_TIMESTAMP', 'null' => false], - ['name' => 'updated', 'type' => 'timestamp', 'default' => null, 'null' => true], + ['name' => 'updated', 'type' => 'timestamp', 'default' => 'CURRENT_TIMESTAMP', 'null' => false], ]; $this->assertEquals(count($expected), count($columns)); diff --git a/tests/TestCase/Db/Table/TableTest.php b/tests/TestCase/Db/Table/TableTest.php index 21912fd5..7e400bea 100644 --- a/tests/TestCase/Db/Table/TableTest.php +++ b/tests/TestCase/Db/Table/TableTest.php @@ -195,8 +195,8 @@ public function testAddTimestamps( $this->assertEquals('timestamp', $columns[1]->getType()); $this->assertEquals($withTimezone, $columns[1]->getTimezone()); $this->assertEquals('CURRENT_TIMESTAMP', $columns[1]->getUpdate()); - $this->assertTrue($columns[1]->isNull()); - $this->assertNull($columns[1]->getDefault()); + $this->assertFalse($columns[1]->isNull()); + $this->assertEquals('CURRENT_TIMESTAMP', $columns[1]->getDefault()); } /** @@ -246,8 +246,8 @@ public function testAddTimestampsNoCreated(AdapterInterface $adapter) $this->assertSame('timestamp', $columns[0]->getType()); $this->assertFalse($columns[0]->getTimezone()); $this->assertSame('CURRENT_TIMESTAMP', $columns[0]->getUpdate()); - $this->assertTrue($columns[0]->isNull()); - $this->assertNull($columns[0]->getDefault()); + $this->assertFalse($columns[0]->isNull()); + $this->assertSame('CURRENT_TIMESTAMP', $columns[0]->getDefault()); } /** @@ -299,8 +299,8 @@ public function testAddTimestampsWithTimezone( $this->assertEquals('timestamp', $columns[1]->getType()); $this->assertTrue($columns[1]->getTimezone()); $this->assertEquals('CURRENT_TIMESTAMP', $columns[1]->getUpdate()); - $this->assertTrue($columns[1]->isNull()); - $this->assertNull($columns[1]->getDefault()); + $this->assertFalse($columns[1]->isNull()); + $this->assertEquals('CURRENT_TIMESTAMP', $columns[1]->getDefault()); } public function testInsert() From c270ae421d4314391b2574df405acce51aa32007 Mon Sep 17 00:00:00 2001 From: Kevin Pfeifer Date: Sun, 1 Mar 2026 10:32:19 +0100 Subject: [PATCH 2/2] update all schema dump lock files + add a script to automatically update those schema dump files --- .../schema-dump-test_comparisons_mysql.lock | Bin 1055 -> 1810 bytes .../schema-dump-test_comparisons_pgsql.lock | Bin 931 -> 1686 bytes .../schema-dump-test_comparisons_mysql.lock | Bin 1252 -> 1290 bytes .../schema-dump-test_comparisons_mysql.lock | Bin 8605 -> 8852 bytes .../schema-dump-test_comparisons_pgsql.lock | Bin 4244 -> 8082 bytes .../comparisons/Diff/refresh_schema_dumps.php | 235 ++++++++++++++++++ .../schema-dump-test_comparisons_mysql.lock | Bin 1903 -> 3620 bytes .../schema-dump-test_comparisons_pgsql.lock | Bin 1720 -> 3437 bytes .../schema-dump-test_comparisons_mysql.lock | Bin 625 -> 896 bytes .../schema-dump-test_comparisons_mysql.lock | Bin 625 -> 896 bytes .../schema-dump-test_comparisons_mysql.lock | Bin 625 -> 896 bytes 11 files changed, 235 insertions(+) create mode 100644 tests/comparisons/Diff/refresh_schema_dumps.php diff --git a/tests/comparisons/Diff/addRemove/schema-dump-test_comparisons_mysql.lock b/tests/comparisons/Diff/addRemove/schema-dump-test_comparisons_mysql.lock index bd5dcdabfe32a30f37c150603ab697caba4c96f6..567467f793e68b75a3132c281cc280e623a70aef 100644 GIT binary patch literal 1810 zcmeHIv2NQi5Y4x6>=fB`lTurqr9<1H>1M#7rL#hmq6Crx90dONz9S`>6`CQQGIW!U zy!Vdxj*m(f^2N)0DU=JkGUP@1L#|g+Y}IetJ*c1#%G2&=^+c`OJ*tDD^eyBaXMUFA z=EKb%+YE_vf#hXTr1h#ZLu&!9K>) z@R7#42J3ZWnSZQn+HcH^kxuU&cR3?sF&|^QIGD;g>Qg$)*~^U-I5A6kr8F0SNr6e7 zPg3~cv~8{zXSLZ}x{#|A)qQvB#J(@Ifrx0)5RUizG)HD%=}Sl6EEsgAQ$?=Fgk33F z4zU#NBj$llz@8TDo9}q&$wWdA@Z&GruwBJ#x`drmS3mk1)6pDa+WD$(6*)% z`?-RByzm0R;6D4Rv$%)~EO9YD0GNT^=~g+I9sD1z^iTia&Z#2#c(R$vmva>G&7(hA zKd5wc;?clSR05bhA_vI3)%5|+8p~br^MO{tv9*o1kDssBb`M{8O5x{tYv6;?iC?*G T+>CWdrZz|Gf`jYOC?kY@H+s z!oz#O1KGwNvc0#4Qt>WuHp?G&KC|X4{o>Ul71~hd)lc`r9j%^e6S%$`dnc6-)?8g* zt?^r6vwVk?ZPV1e>%-VZfRmj|85;PlL=O_(T2o#Jt-nJe7H&BS+GlG5$F{tfr3Y5U zA7l1yWR!2Ld_r{`Ly+(WArQ8_qcIe-{9a?%cO6H>+1^+qk7f?VW9grwOI&jm43iMS z&q_ziA#h0SeD-}5z+<)x(Dg<1Uh)UyT#}FN1^wA#0l1Hl4S|Xdqd}*!?C#esM@|&h z&I>FQUMl)0apk@9dl{U{01WRPrvZZ@Sm5y2B4j7L*O^VWAQSn25{?-DA4iE{zR~dB zQ97N8gU-8BH=TDgRbPdx+DQi=x4f5wAh_lr34n>&T_1r%=%PuzAixdDca&aFjAVjm zSD&(P`#aqO%Do!*?IzG@GVt1aD!d;Gtf-x5vNQaQ6Y)_UgWxH~{_%_W1lGmf!Axr1 Y%KySnq6^2MN6g*OCzT+lbUc3g4Vk7%dH?_b diff --git a/tests/comparisons/Diff/addRemove/schema-dump-test_comparisons_pgsql.lock b/tests/comparisons/Diff/addRemove/schema-dump-test_comparisons_pgsql.lock index c9926532b903a872dfabda81b39d91ddadef936b..0fda7cc04045fab6cc891a2ead81ddbe8bb20d10 100644 GIT binary patch literal 1686 zcmds1v2NQi5Y4x6>}1(>)1F3mZ96pG3 zBcJYRs^}%qXHwcn(^w9w{z02Hsh$4K`>#6cgATm^**tNt_YeADIsaC4FOy$L-F>)w zM4M$*Um*pms(juI_S8FoYud;d2uv$f>-&FD?b3vzD$$?|G*0)4WSS0;Am#WxrZWB+ z7rA3EN~V#MwW>bQ3YBV=+FL&AlZ~qWj#}1l*>&+r)doG%m{psWT{Q7o<|`?K7jzvv z_Bt~33&K<#JvSzp!TnV=uJPOhCRg#!0MN%M64P*I8r-k31>{uBI-8+?otz|{Trizm zsOLs&m*ITv;N^J>266Ery^|EPj-xqeq)VVJDO^=NywQ_afcfcXTRxEr(Hqy@?#g<* zecP7g);qQZZt}TdKjH(r(U=nA+M17WozK9Y58QvPOYwb`yYjwG!LrP$CSUkBJzl3; zddwn;%GJ1DhQ-}Lix~xjaV?)Elr^pBMGgRl2zhJTDuRRhAA&zKy zGsJhxsLElSBV!KN5(Ruq#LW2(DwE=LN@0k~0Q0_=0GHw}!x#~df}plz;C%hlT({rApmwpWnT^ z=d-4SjukzT(mt5Xa;4ID8jnal>n~ou=%81+;^jxS<6JKndS$s?E1F8>jMU(M@QG`d zReHr#QIfQHR@gdsAlEdOGBhx2+0A74Kq?%{SU&~e0&m$1+aoE z4#lg>Jm>6!N>`KsK;fDXYl>-7D+Eg@wP7}oFt#C-Kf;Vn^qkA-&v;uzBXRQt(7dd~>3w0Z_@5F+E_Zj;V z1JUq%yqL3$ocDk(hJ5P$uRTkNdjzzTJi@|yBQSEuoeUGiZ=&9GixHa!3 z)tZKM6aZwB*sO5i(dZJv_zgf;dXsB^=oDQ>vqMi0)P)-5Cg$uEY&7a+x9#0GUX%ej U>&rr}<45AWEPPZT!EKtmZ>B6Fh5!Hn diff --git a/tests/comparisons/Diff/decimalChange/schema-dump-test_comparisons_mysql.lock b/tests/comparisons/Diff/decimalChange/schema-dump-test_comparisons_mysql.lock index 9c497e7b29c23bb40bbb619249db999f94b0bd89..499dc7d327b4a95715bb914d6a750b8d84be8230 100644 GIT binary patch delta 66 zcmaFD*~K+sC!_hsUBQe(#a0$pN(@>IX_*zNDN5E!RtA%Kn2Z_CH#;zeW0T!HjoFV8 E0E9IXA^-pY delta 28 kcmeC;dcrwjC!^WMUBQf#6_|_|%{B)!g)?s6%k0Yt0FVL+00000 diff --git a/tests/comparisons/Diff/default/schema-dump-test_comparisons_mysql.lock b/tests/comparisons/Diff/default/schema-dump-test_comparisons_mysql.lock index 10092ee02d595b356d45800afedae1bd4fa91e8b..58fa3362eb583cf05c881ee5fefa997c15b91089 100644 GIT binary patch delta 415 zcmbR1JjHdwVn*}LWl|B0Ld8}VR!R(73~8AasVPd{V`< z%j9`Hur7 delta 206 zcmbQ@I@fu^Vn(yguS6plC-XBI0-26Xm5h_mG8+S#j4Z{BliOL1fXrR2F^rQn*@2>y z8CgU(7qQ1Na@7`FnOG_1CFZ71E|gOP%3R6)*@4PHcH=f{v!J9B6I9jY`7$Oz<`tP5#>vTYAm$7? MAQNPkokAEB0Id@|*Z=?k diff --git a/tests/comparisons/Diff/default/schema-dump-test_comparisons_pgsql.lock b/tests/comparisons/Diff/default/schema-dump-test_comparisons_pgsql.lock index 91799f2fb81bd2454ca316d35da5784d1565a5d2..399d95af1126491bfa0031bb2a9d5e51ff082e77 100644 GIT binary patch literal 8082 zcmeHMOK;pZ5YBJWF(M;XeDhu@mg3%t*CLa))kURTw)#^nPepbi|5BIlWGk9M>w9twx-jSS;v!QCHo@fVqS$kU@Yhy{OYyUlDZ?C^E4KVsHy$ zjNAkvJ+*@h{RNVHo2}mCjP$RRS+_UY zO5={dNLuSsnO3)Vo_^tvAs6D-$|x&a1^qpT{sV)dp&?p~coaVdJNZM><67Smrw1p_ zMTVz(3}<4pWe`mtVfjU5uC>~%=c96Zem)ILK zjvvfH;llij$I5dD1rCk)4-P#O6UHH0K1K`R`e8}zxdQ{+6*Ve=Pq#CX;Vj0`9HRxr z>)^@)t5MyaiAbU!!*Q%DDQ(XI#Z?_D@_bN;{s_v`^D$2MeV9cO%Dr*B8mKp~_a2}&`aK7Um zNeFwPHl@1tbD+eOc2DySwL5wE6mkaGP7a8_dE$OFBvZ$k&5ub#Hej7%Ck}@Taj(Oy z#>@fTh*fNnVBB7l@%$#miMYponr~`bra6lwVH~TvvLCbP(&rmx!vTr8y313wI{cB) zGcnlvyoB7p^*G2`z;5vU9KM8kOal7=a##RB@y60|V|6?khg!dwmX0$jMV$8Yh zeSSZ{?>wF}@ESvp&gj28mB(te1dx-eeG2z}S9ckr3T`{pY=_fc^-}!oCA)6_Nukl!|e1YXq2HCR4sp_aI8 zbzsZ1kfD1$XSQ-Zb&QypWC3Za4)NPz+kyY@GA(8InUEyQljVfki$Eynng^%ieN8THB`4N9DCGo5{o$x{_mJ8|?7^`(FuA zTYU*l9Wp|3vKia=jC;5lww zeMV8jDo|*^w?I3=zA-u9Tb)7)L>&Kg)d^+6*9aQ_c-EOa0#0#*kc9Eh4q|`-OiPUi Q>&3n?3NkdlyS_er0Wkg`yZ`_I literal 4244 zcmdT{O>f&U4DES8!^fSPW?fh1xLtNwcUX@F0>xocVYci^HkKmjf8V2I%d+EsEJe`d zmY5d#NIpKwQcT6xiZ3FOrc!A}Hktht(+iP&mA~oko2=wQTDtp{-cv5`Zsj5)|2q*^ zeDYc(XCKezcrBx3Ht=M{Wa8~zhP{0j zNk)2I-6u08Cg*rEnF4BE72kDgC?{PdvxS(zfP+g~$vVT68~le)U1u4a`5eq?k^2K| zM#h}jtqaQ!kVt7LRaO<+d%!ETwrZ^jNN;A3R$Kz7syNYI;DBl?qx5L<2k;`k zERz+SGn_r}0^Le&0$6yUO-iOjL7J*Zb>^S6fvH#ICh|dnqK>GQk(H~}ZXtpDSq8xV zBEB~@dX!|Y|E?)uC$sLzO3HMX`Dri{SZ!8gPfN}CA#0_VmGy@# z17jQMbrKT|TBmJpK07T#4naq}RCl`3PVvxLJSe?0fu@5Xff9q~a1_el4-#dl^pZBb zxg_?=7MUYOk8JKtY;bE1QQAF&bQ@cvwP8O^#8$bL5vi2dtacSiaW1xxcm{Nfhj}}9 zdxQw(7!ANF0w?d+w9x2?M88~`E)=4dM&;5xj3pRbpG>jg!f15QpjxXxHOsa(4237{@1Bi_;@rU5}XesljR$_n=i*E{A847kU* zixcH#VO$USq5=zNEZ2DTP4}?irNa>Q#*Imn@U94>hLJEJ>LDB3S>y?r!SdMDNbcD8HRd zohHBes{^uhA{=)gQl+%^Z(&Bi=T2fKW4a7yve%E^Tn=*Y*`nci?aVr1fb<@6W-%;0 dIew?dG}~vd_bP*gBgJiQNKqADEfJ3&{sDUMGz0(u diff --git a/tests/comparisons/Diff/refresh_schema_dumps.php b/tests/comparisons/Diff/refresh_schema_dumps.php new file mode 100644 index 00000000..075f709a --- /dev/null +++ b/tests/comparisons/Diff/refresh_schema_dumps.php @@ -0,0 +1,235 @@ +> + */ +$knownDefaults = [ + Cake\Database\Schema\Column::class => [ + 'fixed' => false, + ], +]; + +$options = getopt('', ['write', 'file:']); +$write = isset($options['write']); +$filesOption = $options['file'] ?? []; +$selectedFiles = is_array($filesOption) ? $filesOption : [$filesOption]; + +$files = getFixtureFiles(__DIR__, $selectedFiles); +if ($files === []) { + fwrite(STDERR, "No schema dump fixtures found.\n"); + exit(EXIT_ERROR); +} + +$updatedFiles = []; +$hasPendingUpdates = false; + +foreach ($files as $file) { + $serialized = file_get_contents($file); + if ($serialized === false) { + fwrite(STDERR, "Failed to read: {$file}\n"); + exit(EXIT_ERROR); + } + + $data = @unserialize($serialized); + if ($data === false && $serialized !== serialize(false)) { + fwrite(STDERR, "Failed to unserialize: {$file}\n"); + exit(EXIT_ERROR); + } + + $visited = new SplObjectStorage(); + fixUninitializedTypedProperties($data, $knownDefaults, $visited, $file); + + $normalized = serialize($data); + if ($normalized === $serialized) { + continue; + } + + $hasPendingUpdates = true; + if ($write) { + if (file_put_contents($file, $normalized) === false) { + fwrite(STDERR, "Failed to write: {$file}\n"); + exit(EXIT_ERROR); + } + $updatedFiles[] = $file; + echo "Updated {$file}\n"; + } else { + echo "Needs update {$file}\n"; + } +} + +if (!$hasPendingUpdates) { + echo "All schema dump fixtures are up to date.\n"; + exit(EXIT_OK); +} + +if (!$write) { + echo "Run with --write to regenerate fixtures.\n"; + exit(EXIT_UPDATES_AVAILABLE); +} + +echo sprintf("Updated %d fixture(s).\n", count($updatedFiles)); +exit(EXIT_OK); + +/** + * @param array $selectedFiles + * @return array + */ +function getFixtureFiles(string $baseDir, array $selectedFiles): array +{ + if ($selectedFiles !== []) { + $files = []; + foreach ($selectedFiles as $file) { + if ($file === '') { + continue; + } + $resolved = str_starts_with($file, '/') + ? $file + : realpath(getcwd() . DIRECTORY_SEPARATOR . $file); + if ($resolved === false || !is_file($resolved)) { + fwrite(STDERR, "Invalid --file path: {$file}\n"); + exit(EXIT_ERROR); + } + $files[] = $resolved; + } + + return $files; + } + + $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($baseDir)); + $files = []; + foreach ($iterator as $item) { + if (!$item->isFile()) { + continue; + } + $path = $item->getPathname(); + if (preg_match('/schema-dump-.*\.lock$/', $path) === 1) { + $files[] = $path; + } + } + sort($files); + + return $files; +} + +/** + * @param array> $knownDefaults + */ +function fixUninitializedTypedProperties( + mixed &$value, + array $knownDefaults, + SplObjectStorage $visited, + string $file +): void { + if (is_array($value)) { + foreach ($value as &$nested) { + fixUninitializedTypedProperties($nested, $knownDefaults, $visited, $file); + } + unset($nested); + + return; + } + + if (!is_object($value) || $visited->offsetExists($value)) { + return; + } + + $visited[$value] = true; + $class = new ReflectionClass($value); + $defaultsByClass = $knownDefaults[$class->getName()] ?? []; + + foreach (getAllProperties($class) as $property) { + if ($property->isStatic()) { + continue; + } + + if (!$property->isInitialized($value)) { + if (array_key_exists($property->getName(), $defaultsByClass)) { + $property->setValue($value, $defaultsByClass[$property->getName()]); + continue; + } + $inferred = inferDefaultValue($property); + if ($inferred['ok'] === false) { + $className = $class->getName(); + $propertyName = $property->getName(); + fwrite( + STDERR, + "Cannot infer default for uninitialized typed property " . + "{$className}::\${$propertyName} in {$file}\n" + ); + exit(EXIT_ERROR); + } + $property->setValue($value, $inferred['value']); + } + + $nested = $property->getValue($value); + fixUninitializedTypedProperties($nested, $knownDefaults, $visited, $file); + $property->setValue($value, $nested); + } +} + +/** + * @return array + */ +function getAllProperties(ReflectionClass $class): array +{ + $properties = []; + do { + foreach ($class->getProperties() as $property) { + $declaringClass = $property->getDeclaringClass()->getName(); + $name = $declaringClass . '::' . $property->getName(); + $properties[$name] = $property; + } + $class = $class->getParentClass(); + } while ($class !== false); + + return array_values($properties); +} + +/** + * @return array{ok: bool, value?: mixed} + */ +function inferDefaultValue(ReflectionProperty $property): array +{ + $type = $property->getType(); + if ($type === null) { + return ['ok' => true, 'value' => null]; + } + + if ($type->allowsNull()) { + return ['ok' => true, 'value' => null]; + } + + if ($type instanceof ReflectionNamedType) { + return match ($type->getName()) { + 'bool', 'false' => ['ok' => true, 'value' => false], + 'true' => ['ok' => true, 'value' => true], + 'int' => ['ok' => true, 'value' => 0], + 'float' => ['ok' => true, 'value' => 0.0], + 'string' => ['ok' => true, 'value' => ''], + 'array' => ['ok' => true, 'value' => []], + default => ['ok' => false], + }; + } + + return ['ok' => false]; +} diff --git a/tests/comparisons/Diff/simple/schema-dump-test_comparisons_mysql.lock b/tests/comparisons/Diff/simple/schema-dump-test_comparisons_mysql.lock index 7aef17bcc930774708894d505cdc0c6be7505bc1..88789db9ad01a8e93828da240126200a8c23cd09 100644 GIT binary patch literal 3620 zcmeHKJ#X7E5Y2Dl*eP=AB&DXt>5w7m&~zwZK%gbsCMr<^MWGH1|M$KlC7G7f08!H- zgE#xc`+RrDN5Lb$t@$-)!dR8&vS#sDelg)}CVtBKt*~MtYB~Rwu4N(Sk7AKa|C{kE z()`5P*@v?P$8yQyfu)*9k^i2Sc~fW@7yOdc;6P>MYI5}lS2L%jCu142trOAIAS9dAngfIu6};hmNcJ02_da5;b;to%lY=lT__1@@l|< zv)rW8ROqmgkcB3OpnXI?$PH|FAM~r{Dd@ZtTruVgLx9!chF~OGfrSo}Zo&ZMKihxr zbHWbxI_{Xi-hU`zTH+3&g*_6W(8Lg-(>T5D_Cq~ACm4xUuRjFpbXgG@dE3hh>#w7O zw6X3*HKcd+n_B$2)4II9p%KOl$KQf#j5Y4$iV~;(>A>?B@HAxRSBt0~jN=VjV24~gv+FGwABE*01o3#Ohi9&m+ za)M!)kN0-w4e3O$YJH;>`Cu~3wVM3UqYJI>={HXwDA0^*p8m{UxuEF_%`CUymA;n9 zTdmH%o~8JkWi>g-RO=*Z{aI<7!XY{7D+xmZGZ*VttV^xJTNUH4;c$U-_LA*NE6Xkq zuWDkDtIglI+T@NAKGX6OqFrOHnCCE&Va^L`Y*3Tu*3QbJU)?&c2kl>s$4GZdv({3GWF)B6 zgvCvovtv&-&5Wc4!Xcs$8;^Z2%ua(HA~P62Z`JSR|nWWF|>XC>xahVj#IE*w$uxyK!&v(X}vnkTB{0s2}L z_o}BoyDg7Xx7+Ie-n1*T+mp>~9wv(`+r9f<%$D1|BE4>noAXj+nIM{2(FD@jR!O5v z9HWEXMeCif6N|0*LhVgd$=)8dTeZgN8u6(!?-Nh-u e9fLT>Q_%K5kY~Y#;}VY|7ggya1UXIX^_M?HBUA(c diff --git a/tests/comparisons/Diff/simple/schema-dump-test_comparisons_pgsql.lock b/tests/comparisons/Diff/simple/schema-dump-test_comparisons_pgsql.lock index 435ce5852777a073ccc3478f90bd0043416fa649..29007cb78993b806006d4a32ab53f421a0d9734a 100644 GIT binary patch literal 3437 zcmeHKO^@0z5Z&M6V^0LiZflP8(nH%rw>KnY5)-UCPUILBg!u1$V<%pd(v^tR9?;%k z;(7D&JodBT89%lB182fIm226u#Wy~ia<&vdnKI<93s``M^gZ@Glo3# zx_a^KQreqVl_rMn7it}yL)opR_9hXC#b@6qGKM_1>JX65EuV9SQi;QnoV)<^t?y}h zaM{<%N^qudg1$6zhL+sv(LGSV!Hvk>CBbiAdhSa=G3ofslZx(bd+}k4=iT*=6 z-tLunY~M%Fqx3d%U1po=nK_h)cjOXDsnas7`_;*(y`W z18GzN1$heED;&jZ|H+R%T(64P&*a?6R-}Nv-0Mk_aF;NEj@qghu29O#>&T=uw+VNw*h?JR`uXH5$jpG|yQDC!plKtZZi8oeN!a|7SZ34x7mEL7^Wqd}P~$cS*XRys;R9{o8BMi^KYR&*pL7K literal 1720 zcmdT_O;6)65arCz@R1Xt6c*>WTsUm^0LMzzG#!eC<3x@lwW|8x_l=#l=@&?#m3D85 zCo}Wr`OORIOs^XKLo4#Z6qXy6|JH*Wt$xxwj~^+}lo}pC7jInB_=TpH)3eg|lKG(3 z#nr_GpIKJ%N)crMuml}~ks01{{XO0C7o2=A!rT5BaNc?cI(nGz(7iDj^t*j5fO zNbR{Wjj3F!fKOW2n7Lyh9p&pr4}sGJ8T1%9pf}wE0n0K|uvrx_pg!V}8I{#Im;1OJT3X!X0B7yru1t9(@zHeRhNs-0- zkCy^M*hNqQr&!(#nA z+{@WAxYwkI*0>oj#2^Xwg>A}UVyVj{h9odJSTjKHV%@1U~J&b=BF6+ui1mfoF_2nPZ!q!f%+3zT zTwa`9NCDQXN~06So19IhSivW5*Wh6X4!7^s5gXWUV5c$u7IMzar4*C9NlDK%isIKK zC-XdhuUg$VhK55FBmq^k)O7xj)G9E9%!3TQA{hfs5J_xD78v&DF2M9p8IK3F>?Bco ztwphu86kNVp4YgCUVBlz5*GbyGzWi-NV2SIG+y~LlXE7MC}|zgpaqX)p6LngELO^? z*4&`VR2CZ=6HyA82Eg94zd(-RwC1C$X=DPU$*OH4(@6q&pX94IP8|&E-z-G|>tRM* z-C2%!B*d58gsd2hcJ}HNce!2%iIM|-f$sOULZ(B)qxZ_xc;e~+nZ59bhp=l|wZ?f1 z#Q8Zrnd_`-z*4kSHOk=6s;vg9kTY&tx@W4ucnax#hc<4R3P(>}AyaX{s4Rnx@$PNs z>5jqflw}{KpmHb^8b*JfjcM0Ud=RQmOg-G4Oi-e|-!GcoeVHw@tOQk7N)(*OEau^{ M=~^3B=j&asUx8Z(B>(^b delta 248 zcmZXOK?;IE6o$#dpj{Ve@mdFpQTaSUn^s+5)Rzs6qs)v8ldvNM-mANGgT^cfT0Oq^ z^YeeV>2q>#TZSPv8rKM>E(s!yTLdl*Wu$uAAPAC~IYV@?xI?I<=9#1vq8L5BK5whKA*&$a9jGHF^mB@dE@_nPR_^iJ~El(H{n4rs?>W=@&zUQc=P+FJ$LB f^^#%mZ(J&#GgW{5yN9!w|Clqo+gv+$d>PGNYl2Of diff --git a/tests/comparisons/Diff/withAutoIdIncompatibleSignedPrimaryKeys/schema-dump-test_comparisons_mysql.lock b/tests/comparisons/Diff/withAutoIdIncompatibleSignedPrimaryKeys/schema-dump-test_comparisons_mysql.lock index 4744181c9dcf7397c3a0531381d1a3ab2c6b80ec..67884e41e939e7f9ed4f26c27b5f370d485d3f5a 100644 GIT binary patch literal 896 zcmZ`%L2kk@5acaB_LM+dz_}GJJ+wWP-jJdtS-`5}M7AS=5P$Ek?WUn>Z!q!f%+3zT zTwa`9NCDQXN~06So19IhSivW5*Wh6X4!7^s5gXWUV5c$u7IMzar4*C9NlDK%isIKK zC-XdhuUg$VhK55FBmq^k)O7xj)G9E9%!3TQA{hfs5J_xD78v&DF2M9p8IK3F>?Bco ztwphu86kNVp4YgCUVBlz5*GbyGzWi-NV2SIG+y~LlXE7MC}|zgpaqX)p6LngELO^? z*4&`VR2CZ=6HyA82Eg94zd(-RwC1C$X=DPU$*OH4(@6q&pX94IP8|&E-z-G|>tRM* z-C2%!B*d58gsd2hcJ}HNce!2%iIM|-f$sOULZ(B)qxZ_xc;e~+nZ59bhp=l|wZ?f1 z#Q8Zrnd_`-z*4kSHOk=6s;vg9kTY&tx@W4ucnax#hc<4R3P(>}AyaX{s4Rnx@$PNs z>5jqflw}{KpmHb^8b*JfjcM0Ud=RQmOg-G4Oi-e|-!GcoeVHw@tOQk7N)(*OEau^{ M=~^3B=j&asUx8Z(B>(^b delta 248 zcmZXOK?;IE6o$#dpj{Ve@mdFpQTaSUn^s+5)Rzs6qs)v8ldvNM-mANGgT^cfT0Oq^ z^YeeV>2q>#TZSPv8rKM>E(s!yTLdl*Wu$uAAPAC~IYV@?xI?I<=9#1vq8L5BK5whKA*&$a9jGHF^mB@dE@_nPR_^iJ~El(H{n4rs?>W=@&zUQc=P+FJ$LB f^^#%mZ(J&#GgW{5yN9!w|Clqo+gv+$d>PGNYl2Of diff --git a/tests/comparisons/Diff/withAutoIdIncompatibleUnsignedPrimaryKeys/schema-dump-test_comparisons_mysql.lock b/tests/comparisons/Diff/withAutoIdIncompatibleUnsignedPrimaryKeys/schema-dump-test_comparisons_mysql.lock index 522a9be3d4907962d50547a5a68712bc080737f9..9e291c6700f5276305d7f9e7dc60bd70d8c0c16c 100644 GIT binary patch literal 896 zcmZ`%!A{&T6y#fcyyqj$Hmc?kSoUw(o#IPIie=NYizdDaxfU`+p><-%o+87%&JfcO_kinN#+bvY3x6-t7&r*T)6zDA>tXgK$(MwlgDi2tdWwEi| zeViihnCxyu_PbUnhjFQ4_;c^vc=tmNg6g2wNIl&hCXnbHk2k~NTU*^$RZFJrjA|s0 RZO$X|FpWN~E|ol={{Vv>2POaj delta 248 zcmZXOK@Ng25Je*zOx$?^7vtIlqEQ)6;Kr2~C@^A^Qb=1CNDLmqgnM}xZ(y-5Ok7Rg zO#b|LpS~uKu45Qst8s&1nu;LSxI^I5P)=%~ErKAKn+wE8i+hAxYMx8VAWkr}D;t%y z5CaA-p3#}r!nlNemzG6A(z3