diff --git a/Cargo.lock b/Cargo.lock
index a2d4c7fd7..9472756f9 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -397,7 +397,7 @@ version = "3.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18"
 dependencies = [
- "event-listener 5.4.0",
+ "event-listener",
  "event-listener-strategy",
  "pin-project-lite",
 ]
@@ -863,7 +863,7 @@ version = "4.5.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed"
 dependencies = [
- "heck 0.5.0",
+ "heck",
  "proc-macro2",
  "quote",
  "syn 2.0.96",
@@ -1439,12 +1439,6 @@ dependencies = [
  "windows-sys 0.48.0",
 ]
 
-[[package]]
-name = "event-listener"
-version = "2.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
-
 [[package]]
 name = "event-listener"
 version = "5.4.0"
@@ -1462,7 +1456,7 @@ version = "0.5.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2"
 dependencies = [
- "event-listener 5.4.0",
+ "event-listener",
  "pin-project-lite",
 ]
 
@@ -1580,6 +1574,12 @@ version = "1.0.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
 
+[[package]]
+name = "foldhash"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f"
+
 [[package]]
 name = "fontconfig-parser"
 version = "0.5.7"
@@ -1885,7 +1885,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
 dependencies = [
  "ahash",
- "allocator-api2",
 ]
 
 [[package]]
@@ -1893,23 +1892,28 @@ name = "hashbrown"
 version = "0.15.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
+dependencies = [
+ "allocator-api2",
+ "equivalent",
+ "foldhash",
+]
 
 [[package]]
 name = "hashlink"
-version = "0.8.4"
+version = "0.9.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7"
+checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af"
 dependencies = [
  "hashbrown 0.14.5",
 ]
 
 [[package]]
-name = "heck"
-version = "0.4.1"
+name = "hashlink"
+version = "0.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1"
 dependencies = [
- "unicode-segmentation",
+ "hashbrown 0.15.2",
 ]
 
 [[package]]
@@ -2630,9 +2634,9 @@ dependencies = [
 
 [[package]]
 name = "libsqlite3-sys"
-version = "0.27.0"
+version = "0.30.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716"
+checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149"
 dependencies = [
  "cc",
  "pkg-config",
@@ -2925,7 +2929,7 @@ dependencies = [
  "crossbeam-channel",
  "crossbeam-epoch",
  "crossbeam-utils",
- "event-listener 5.4.0",
+ "event-listener",
  "futures-util",
  "loom",
  "parking_lot",
@@ -4061,14 +4065,14 @@ dependencies = [
 
 [[package]]
 name = "rusqlite"
-version = "0.30.0"
+version = "0.32.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a78046161564f5e7cd9008aff3b2990b3850dc8e0349119b98e8f251e099f24d"
+checksum = "7753b721174eb8ff87a9a0e799e2d7bc3749323e773db92e0984debb00019d6e"
 dependencies = [
  "bitflags 2.8.0",
  "fallible-iterator 0.3.0",
  "fallible-streaming-iterator",
- "hashlink",
+ "hashlink 0.9.1",
  "libsqlite3-sys",
  "smallvec",
 ]
@@ -4535,6 +4539,9 @@ name = "smallvec"
 version = "1.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
+dependencies = [
+ "serde",
+]
 
 [[package]]
 name = "socket2"
@@ -4582,16 +4589,6 @@ dependencies = [
  "thiserror 1.0.69",
 ]
 
-[[package]]
-name = "sqlformat"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790"
-dependencies = [
- "nom",
- "unicode_categories",
-]
-
 [[package]]
 name = "sqlite-compressions"
 version = "0.2.18"
@@ -4617,9 +4614,9 @@ dependencies = [
 
 [[package]]
 name = "sqlx"
-version = "0.7.4"
+version = "0.8.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa"
+checksum = "4410e73b3c0d8442c5f99b425d7a435b5ee0ae4167b3196771dd3f7a01be745f"
 dependencies = [
  "sqlx-core",
  "sqlx-macros",
@@ -4630,37 +4627,31 @@ dependencies = [
 
 [[package]]
 name = "sqlx-core"
-version = "0.7.4"
+version = "0.8.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6"
+checksum = "6a007b6936676aa9ab40207cde35daab0a04b823be8ae004368c0793b96a61e0"
 dependencies = [
- "ahash",
- "atoi",
- "byteorder",
  "bytes",
  "crc",
  "crossbeam-queue",
  "either",
- "event-listener 2.5.3",
- "futures-channel",
+ "event-listener",
  "futures-core",
  "futures-intrusive",
  "futures-io",
  "futures-util",
- "hashlink",
- "hex",
+ "hashbrown 0.15.2",
+ "hashlink 0.10.0",
  "indexmap 2.7.1",
  "log",
  "memchr",
  "once_cell",
- "paste",
  "percent-encoding",
  "serde",
  "serde_json",
  "sha2",
  "smallvec",
- "sqlformat",
- "thiserror 1.0.69",
+ "thiserror 2.0.11",
  "tokio",
  "tokio-stream",
  "tracing",
@@ -4669,26 +4660,26 @@ dependencies = [
 
 [[package]]
 name = "sqlx-macros"
-version = "0.7.4"
+version = "0.8.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127"
+checksum = "3112e2ad78643fef903618d78cf0aec1cb3134b019730edb039b69eaf531f310"
 dependencies = [
  "proc-macro2",
  "quote",
  "sqlx-core",
  "sqlx-macros-core",
- "syn 1.0.109",
+ "syn 2.0.96",
 ]
 
 [[package]]
 name = "sqlx-macros-core"
-version = "0.7.4"
+version = "0.8.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8"
+checksum = "4e9f90acc5ab146a99bf5061a7eb4976b573f560bc898ef3bf8435448dd5e7ad"
 dependencies = [
  "dotenvy",
  "either",
- "heck 0.4.1",
+ "heck",
  "hex",
  "once_cell",
  "proc-macro2",
@@ -4698,8 +4689,9 @@ dependencies = [
  "sha2",
  "sqlx-core",
  "sqlx-mysql",
+ "sqlx-postgres",
  "sqlx-sqlite",
- "syn 1.0.109",
+ "syn 2.0.96",
  "tempfile",
  "tokio",
  "url",
@@ -4707,12 +4699,12 @@ dependencies = [
 
 [[package]]
 name = "sqlx-mysql"
-version = "0.7.4"
+version = "0.8.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418"
+checksum = "4560278f0e00ce64938540546f59f590d60beee33fffbd3b9cd47851e5fff233"
 dependencies = [
  "atoi",
- "base64 0.21.7",
+ "base64 0.22.1",
  "bitflags 2.8.0",
  "byteorder",
  "bytes",
@@ -4742,19 +4734,19 @@ dependencies = [
  "smallvec",
  "sqlx-core",
  "stringprep",
- "thiserror 1.0.69",
+ "thiserror 2.0.11",
  "tracing",
  "whoami",
 ]
 
 [[package]]
 name = "sqlx-postgres"
-version = "0.7.4"
+version = "0.8.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e"
+checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613"
 dependencies = [
  "atoi",
- "base64 0.21.7",
+ "base64 0.22.1",
  "bitflags 2.8.0",
  "byteorder",
  "crc",
@@ -4762,7 +4754,6 @@ dependencies = [
  "etcetera",
  "futures-channel",
  "futures-core",
- "futures-io",
  "futures-util",
  "hex",
  "hkdf",
@@ -4780,16 +4771,16 @@ dependencies = [
  "smallvec",
  "sqlx-core",
  "stringprep",
- "thiserror 1.0.69",
+ "thiserror 2.0.11",
  "tracing",
  "whoami",
 ]
 
 [[package]]
 name = "sqlx-sqlite"
-version = "0.7.4"
+version = "0.8.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa"
+checksum = "f85ca71d3a5b24e64e1d08dd8fe36c6c95c339a896cc33068148906784620540"
 dependencies = [
  "atoi",
  "flume",
@@ -4802,10 +4793,10 @@ dependencies = [
  "log",
  "percent-encoding",
  "serde",
+ "serde_urlencoded",
  "sqlx-core",
  "tracing",
  "url",
- "urlencoding",
 ]
 
 [[package]]
@@ -5582,12 +5573,6 @@ version = "0.1.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
 
-[[package]]
-name = "unicode_categories"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e"
-
 [[package]]
 name = "unsafe-libyaml"
 version = "0.2.11"
@@ -5612,12 +5597,6 @@ dependencies = [
  "serde",
 ]
 
-[[package]]
-name = "urlencoding"
-version = "2.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da"
-
 [[package]]
 name = "usvg"
 version = "0.36.0"
diff --git a/Cargo.toml b/Cargo.toml
index 0acf6e357..ea0f127e9 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -83,7 +83,7 @@ size_format = "1.0.2"
 spreet = { version = "0.11", default-features = false }
 sqlite-compressions = { version = "0.2.16", default-features = false, features = ["bsdiffraw", "gzip"] }
 sqlite-hashes = { version = "0.7.9", default-features = false, features = ["md5", "aggregate", "hex"] }
-sqlx = { version = "0.7", features = ["sqlite", "runtime-tokio"] }
+sqlx = { version = "0.8", features = ["sqlite", "runtime-tokio"] }
 static-files = "0.2"
 subst = { version = "0.3", features = ["yaml"] }
 testcontainers-modules = { version = "0.11.6", features = ["postgres"] }
diff --git a/justfile b/justfile
index b072eb811..ff6e652ec 100644
--- a/justfile
+++ b/justfile
@@ -62,6 +62,11 @@ clean-martin-ui:
 clean-test:
     rm -rf tests/output
 
+# Update dependencies, including breaking changes
+update:
+    cargo +nightly -Z unstable-options update --breaking
+    cargo update
+
 # Start a test database
 start: (docker-up "db") docker-is-ready
 
diff --git a/mbtiles/.sqlx/query-176e99c6945b0789119d0d21a99de564de47dde1d588f17e68ec58115ac73a39.json b/mbtiles/.sqlx/query-176e99c6945b0789119d0d21a99de564de47dde1d588f17e68ec58115ac73a39.json
index 25354e993..8e6f5e748 100644
--- a/mbtiles/.sqlx/query-176e99c6945b0789119d0d21a99de564de47dde1d588f17e68ec58115ac73a39.json
+++ b/mbtiles/.sqlx/query-176e99c6945b0789119d0d21a99de564de47dde1d588f17e68ec58115ac73a39.json
@@ -6,7 +6,7 @@
       {
         "name": "has_rows",
         "ordinal": 0,
-        "type_info": "Int"
+        "type_info": "Integer"
       }
     ],
     "parameters": {
diff --git a/mbtiles/.sqlx/query-208681caa7185b4014e7eda4120962954cdd3d913e8a786599da8a3f9799ed4b.json b/mbtiles/.sqlx/query-208681caa7185b4014e7eda4120962954cdd3d913e8a786599da8a3f9799ed4b.json
index 3550f54e0..7995f68d1 100644
--- a/mbtiles/.sqlx/query-208681caa7185b4014e7eda4120962954cdd3d913e8a786599da8a3f9799ed4b.json
+++ b/mbtiles/.sqlx/query-208681caa7185b4014e7eda4120962954cdd3d913e8a786599da8a3f9799ed4b.json
@@ -6,7 +6,7 @@
       {
         "name": "page_size",
         "ordinal": 0,
-        "type_info": "Int"
+        "type_info": "Integer"
       }
     ],
     "parameters": {
diff --git a/mbtiles/.sqlx/query-41798c456136acb48ce59769a8abd1c6fb638f84d35457093b5dfbb3c8005433.json b/mbtiles/.sqlx/query-41798c456136acb48ce59769a8abd1c6fb638f84d35457093b5dfbb3c8005433.json
index b389139d1..52857b067 100644
--- a/mbtiles/.sqlx/query-41798c456136acb48ce59769a8abd1c6fb638f84d35457093b5dfbb3c8005433.json
+++ b/mbtiles/.sqlx/query-41798c456136acb48ce59769a8abd1c6fb638f84d35457093b5dfbb3c8005433.json
@@ -6,22 +6,22 @@
       {
         "name": "zoom",
         "ordinal": 0,
-        "type_info": "Int64"
+        "type_info": "Integer"
       },
       {
         "name": "count",
         "ordinal": 1,
-        "type_info": "Int"
+        "type_info": "Integer"
       },
       {
         "name": "smallest",
         "ordinal": 2,
-        "type_info": "Int"
+        "type_info": "Integer"
       },
       {
         "name": "largest",
         "ordinal": 3,
-        "type_info": "Int"
+        "type_info": "Integer"
       },
       {
         "name": "average",
@@ -31,22 +31,22 @@
       {
         "name": "min_tile_x",
         "ordinal": 5,
-        "type_info": "Int"
+        "type_info": "Integer"
       },
       {
         "name": "min_tile_y",
         "ordinal": 6,
-        "type_info": "Int"
+        "type_info": "Integer"
       },
       {
         "name": "max_tile_x",
         "ordinal": 7,
-        "type_info": "Int"
+        "type_info": "Integer"
       },
       {
         "name": "max_tile_y",
         "ordinal": 8,
-        "type_info": "Int"
+        "type_info": "Integer"
       }
     ],
     "parameters": {
diff --git a/mbtiles/.sqlx/query-5b298df51dccbf0d8a22433a99febc59c27dbf204d09a9c1fb0b3bf9aaad284b.json b/mbtiles/.sqlx/query-5b298df51dccbf0d8a22433a99febc59c27dbf204d09a9c1fb0b3bf9aaad284b.json
index b73b48bb2..60ca153c9 100644
--- a/mbtiles/.sqlx/query-5b298df51dccbf0d8a22433a99febc59c27dbf204d09a9c1fb0b3bf9aaad284b.json
+++ b/mbtiles/.sqlx/query-5b298df51dccbf0d8a22433a99febc59c27dbf204d09a9c1fb0b3bf9aaad284b.json
@@ -6,12 +6,12 @@
       {
         "name": "tile_column",
         "ordinal": 0,
-        "type_info": "Int64"
+        "type_info": "Integer"
       },
       {
         "name": "tile_row",
         "ordinal": 1,
-        "type_info": "Int64"
+        "type_info": "Integer"
       },
       {
         "name": "tile_data",
diff --git a/mbtiles/.sqlx/query-7341bfc10beb4719811556a57ae8098085994c8fba93e0293359afd43079c50c.json b/mbtiles/.sqlx/query-7341bfc10beb4719811556a57ae8098085994c8fba93e0293359afd43079c50c.json
index 2b9d7474d..df630d0b5 100644
--- a/mbtiles/.sqlx/query-7341bfc10beb4719811556a57ae8098085994c8fba93e0293359afd43079c50c.json
+++ b/mbtiles/.sqlx/query-7341bfc10beb4719811556a57ae8098085994c8fba93e0293359afd43079c50c.json
@@ -6,14 +6,14 @@
       {
         "name": "is_valid",
         "ordinal": 0,
-        "type_info": "Int"
+        "type_info": "Integer"
       }
     ],
     "parameters": {
       "Right": 0
     },
     "nullable": [
-      null
+      false
     ]
   },
   "hash": "7341bfc10beb4719811556a57ae8098085994c8fba93e0293359afd43079c50c"
diff --git a/mbtiles/.sqlx/query-73b5d12b379c0fb2d8560d99653729d96dd1288005f47872c6a79b5bbf1ca8de.json b/mbtiles/.sqlx/query-73b5d12b379c0fb2d8560d99653729d96dd1288005f47872c6a79b5bbf1ca8de.json
index e72960107..c73c455e9 100644
--- a/mbtiles/.sqlx/query-73b5d12b379c0fb2d8560d99653729d96dd1288005f47872c6a79b5bbf1ca8de.json
+++ b/mbtiles/.sqlx/query-73b5d12b379c0fb2d8560d99653729d96dd1288005f47872c6a79b5bbf1ca8de.json
@@ -6,7 +6,7 @@
       {
         "name": "page_count",
         "ordinal": 0,
-        "type_info": "Int"
+        "type_info": "Integer"
       }
     ],
     "parameters": {
diff --git a/mbtiles/.sqlx/query-748436831449877b242d6e167a2f8fe1b1e7b6fb87c4e04ad7406a2bbfd35bec.json b/mbtiles/.sqlx/query-748436831449877b242d6e167a2f8fe1b1e7b6fb87c4e04ad7406a2bbfd35bec.json
index ad0518d11..6f43f10c8 100644
--- a/mbtiles/.sqlx/query-748436831449877b242d6e167a2f8fe1b1e7b6fb87c4e04ad7406a2bbfd35bec.json
+++ b/mbtiles/.sqlx/query-748436831449877b242d6e167a2f8fe1b1e7b6fb87c4e04ad7406a2bbfd35bec.json
@@ -6,17 +6,17 @@
       {
         "name": "zoom_level",
         "ordinal": 0,
-        "type_info": "Int64"
+        "type_info": "Integer"
       },
       {
         "name": "tile_column",
         "ordinal": 1,
-        "type_info": "Int64"
+        "type_info": "Integer"
       },
       {
         "name": "tile_row",
         "ordinal": 2,
-        "type_info": "Int64"
+        "type_info": "Integer"
       },
       {
         "name": "tile_data",
diff --git a/mbtiles/.sqlx/query-77b2f46851c4e991230ec6a5d33aaca18373bbdd548a8378ae7fbeed351b4b87.json b/mbtiles/.sqlx/query-77b2f46851c4e991230ec6a5d33aaca18373bbdd548a8378ae7fbeed351b4b87.json
index acb0b2ecc..677e780d8 100644
--- a/mbtiles/.sqlx/query-77b2f46851c4e991230ec6a5d33aaca18373bbdd548a8378ae7fbeed351b4b87.json
+++ b/mbtiles/.sqlx/query-77b2f46851c4e991230ec6a5d33aaca18373bbdd548a8378ae7fbeed351b4b87.json
@@ -6,14 +6,14 @@
       {
         "name": "is_valid",
         "ordinal": 0,
-        "type_info": "Int"
+        "type_info": "Integer"
       }
     ],
     "parameters": {
       "Right": 0
     },
     "nullable": [
-      null
+      false
     ]
   },
   "hash": "77b2f46851c4e991230ec6a5d33aaca18373bbdd548a8378ae7fbeed351b4b87"
diff --git a/mbtiles/.sqlx/query-809e89c3b223e28c6716d405e13ba30fbf018805fe9ca2acd2b2e225183d1f13.json b/mbtiles/.sqlx/query-809e89c3b223e28c6716d405e13ba30fbf018805fe9ca2acd2b2e225183d1f13.json
index faf6b51f7..e8a351f93 100644
--- a/mbtiles/.sqlx/query-809e89c3b223e28c6716d405e13ba30fbf018805fe9ca2acd2b2e225183d1f13.json
+++ b/mbtiles/.sqlx/query-809e89c3b223e28c6716d405e13ba30fbf018805fe9ca2acd2b2e225183d1f13.json
@@ -6,14 +6,14 @@
       {
         "name": "is_valid",
         "ordinal": 0,
-        "type_info": "Int"
+        "type_info": "Integer"
       }
     ],
     "parameters": {
       "Right": 0
     },
     "nullable": [
-      null
+      false
     ]
   },
   "hash": "809e89c3b223e28c6716d405e13ba30fbf018805fe9ca2acd2b2e225183d1f13"
diff --git a/mbtiles/.sqlx/query-85b46712c445679053e768cc98b22ea61633c21afb45d3d2b9aeec068d72cce0.json b/mbtiles/.sqlx/query-85b46712c445679053e768cc98b22ea61633c21afb45d3d2b9aeec068d72cce0.json
index 45fdc4f2a..ab4bd17ba 100644
--- a/mbtiles/.sqlx/query-85b46712c445679053e768cc98b22ea61633c21afb45d3d2b9aeec068d72cce0.json
+++ b/mbtiles/.sqlx/query-85b46712c445679053e768cc98b22ea61633c21afb45d3d2b9aeec068d72cce0.json
@@ -6,14 +6,14 @@
       {
         "name": "is_valid",
         "ordinal": 0,
-        "type_info": "Int"
+        "type_info": "Integer"
       }
     ],
     "parameters": {
       "Right": 0
     },
     "nullable": [
-      null
+      false
     ]
   },
   "hash": "85b46712c445679053e768cc98b22ea61633c21afb45d3d2b9aeec068d72cce0"
diff --git a/mbtiles/.sqlx/query-96f3201d2151fbef63593c0e87648a2991e05060e71aa96141ece0867afa2d6c.json b/mbtiles/.sqlx/query-96f3201d2151fbef63593c0e87648a2991e05060e71aa96141ece0867afa2d6c.json
index 855a012f9..7d5f576d6 100644
--- a/mbtiles/.sqlx/query-96f3201d2151fbef63593c0e87648a2991e05060e71aa96141ece0867afa2d6c.json
+++ b/mbtiles/.sqlx/query-96f3201d2151fbef63593c0e87648a2991e05060e71aa96141ece0867afa2d6c.json
@@ -6,12 +6,12 @@
       {
         "name": "min_zoom",
         "ordinal": 0,
-        "type_info": "Int"
+        "type_info": "Integer"
       },
       {
         "name": "max_zoom",
         "ordinal": 1,
-        "type_info": "Int"
+        "type_info": "Integer"
       }
     ],
     "parameters": {
diff --git a/mbtiles/src/queries.rs b/mbtiles/src/queries.rs
index 427ccc1d3..e0095424d 100644
--- a/mbtiles/src/queries.rs
+++ b/mbtiles/src/queries.rs
@@ -61,12 +61,7 @@ where
          ) AS is_valid;"
     );
 
-    Ok(sql
-        .fetch_one(&mut *conn)
-        .await?
-        .is_valid
-        .unwrap_or_default()
-        == 1)
+    Ok(sql.fetch_one(&mut *conn).await?.is_valid == 1)
 }
 
 /// Check if `MBTiles` has a table or a view named `tiles_with_hash` with needed fields
@@ -90,12 +85,7 @@ where
        ) as is_valid;"
     );
 
-    Ok(sql
-        .fetch_one(&mut *conn)
-        .await?
-        .is_valid
-        .unwrap_or_default()
-        == 1)
+    Ok(sql.fetch_one(&mut *conn).await?.is_valid == 1)
 }
 
 pub async fn is_flat_with_hash_tables_type<T>(conn: &mut T) -> MbtResult<bool>
@@ -115,7 +105,7 @@ where
 
     let is_valid = sql.fetch_one(&mut *conn).await?.is_valid;
 
-    Ok(is_valid.unwrap_or_default() == 1 && has_tiles_with_hash(&mut *conn).await?)
+    Ok(is_valid == 1 && has_tiles_with_hash(&mut *conn).await?)
 }
 
 pub async fn is_flat_tables_type<T>(conn: &mut T) -> MbtResult<bool>
@@ -144,12 +134,7 @@ where
          ) as is_valid;"
     );
 
-    Ok(sql
-        .fetch_one(&mut *conn)
-        .await?
-        .is_valid
-        .unwrap_or_default()
-        == 1)
+    Ok(sql.fetch_one(&mut *conn).await?.is_valid == 1)
 }
 
 pub async fn create_metadata_table<T>(conn: &mut T) -> MbtResult<()>
@@ -382,7 +367,7 @@ where
     Ok(())
 }
 
-fn validate_zoom(zoom: Option<i32>, zoom_name: &'static str) -> MbtResult<Option<u8>> {
+fn validate_zoom(zoom: Option<i64>, zoom_name: &'static str) -> MbtResult<Option<u8>> {
     if let Some(zoom) = zoom {
         let z = u8::try_from(zoom).ok().filter(|v| *v <= MAX_ZOOM);
         if z.is_none() {
diff --git a/mbtiles/tests/copy.rs b/mbtiles/tests/copy.rs
index f64140a86..ced0add2f 100644
--- a/mbtiles/tests/copy.rs
+++ b/mbtiles/tests/copy.rs
@@ -180,7 +180,11 @@ macro_rules! assert_dump {
         let mut settings = insta::Settings::clone_current();
         settings.set_snapshot_suffix(format!($($arg)*));
         let actual_value = &$actual_value;
-        settings.bind(|| insta::assert_toml_snapshot!(actual_value));
+        settings.bind(||
+            allow_duplicates! {
+                insta::assert_toml_snapshot!(actual_value)
+            }
+        );
     }};
 }
 
@@ -326,7 +330,7 @@ fn databases() -> Databases {
                 let (v2z_mbt, mut v2z_cn) =
                     new_file!(+GZIP_TILES, databases, mbt_typ, METADATA_V2, TILES_V2, "{typ}__v2z");
                 let dmp = dump(&mut v2z_cn).await.unwrap();
-                assert_dump!(&dmp, "{typ}__v2");
+                assert_dump!(&dmp, "{typ}__v2z");
                 let hash = v2z_mbt.open_and_validate(Off, Verify).await.unwrap();
                 allow_duplicates! {
                     assert_snapshot!(hash, @"A18D0C39730FB52E5A547F096F5C60E8");
@@ -447,9 +451,7 @@ async fn convert(
         copy => CopyType::Metadata,
         dst_type_cli => Some(dst_type),
     };
-    allow_duplicates! {
-        assert_dump!(dmp, "v1__meta__{to}");
-    }
+    assert_dump!(dmp, "v1__meta__{to}");
 
     let dmp = copy_dump! {
         path(&frm_mbt),
@@ -457,9 +459,7 @@ async fn convert(
         copy => CopyType::Tiles,
         dst_type_cli => Some(dst_type),
     };
-    allow_duplicates! {
-        assert_dump!(dmp, "v1__tiles__{to}");
-    }
+    assert_dump!(dmp, "v1__tiles__{to}");
 
     let z6only = copy_dump! {
         path(&frm_mbt),
@@ -467,9 +467,7 @@ async fn convert(
         dst_type_cli => Some(dst_type),
         zoom_levels => vec![6],
     };
-    allow_duplicates! {
-        assert_dump!(z6only, "v1__z6__{to}");
-    }
+    assert_dump!(z6only, "v1__z6__{to}");
 
     // Filter (0, 0, 2, 2) in mbtiles coordinates, which is (0, 2^5-1-2, 2, 2^5-1-0) = (0, 29, 2, 31) in XYZ coordinates, and slightly decrease it
     let mut bbox = xyz_to_bbox(5, 0, invert_y_value(5, 2), 2, invert_y_value(5, 0));
@@ -484,9 +482,7 @@ async fn convert(
         dst_type_cli => Some(dst_type),
         bbox => vec![bbox.into()],
     };
-    allow_duplicates! {
-        assert_dump!(dmp, "v1__bbox__{to}");
-    }
+    assert_dump!(dmp, "v1__bbox__{to}");
 
     pretty_assert_eq!(
         &z6only,