diff --git a/hasql.cabal b/hasql.cabal
--- a/hasql.cabal
+++ b/hasql.cabal
@@ -1,6 +1,6 @@
 cabal-version: 3.0
 name: hasql
-version: 1.10.2.2
+version: 1.10.2.3
 category: Hasql, Database, PostgreSQL
 synopsis: Fast PostgreSQL driver with a flexible mapping API
 description:
diff --git a/src/library-tests/Sharing/ByUnit/Session/ScriptSpec.hs b/src/library-tests/Sharing/ByUnit/Session/ScriptSpec.hs
--- a/src/library-tests/Sharing/ByUnit/Session/ScriptSpec.hs
+++ b/src/library-tests/Sharing/ByUnit/Session/ScriptSpec.hs
@@ -16,3 +16,44 @@
       case result of
         Left (Errors.ScriptSessionError _ _) -> pure ()
         _ -> expectationFailure $ "Expected ScriptSessionError with ExecutionScriptError, got: " <> show result
+
+  it "handles multi-statement DDL scripts with comments" \config -> do
+    Scripts.onPreparableConnection config \connection -> do
+      tableName <- Scripts.generateSymname
+      let sql =
+            (mconcat . map (<> "\n"))
+              [ "create table \"" <> tableName <> "_genre\" (",
+                "  \"id\" int4 not null generated always as identity primary key,",
+                "  \"name\" text not null unique",
+                ");",
+                "",
+                "create table \"" <> tableName <> "_artist\" (",
+                "  \"id\" int4 not null generated always as identity primary key,",
+                "  \"name\" text not null",
+                ");",
+                "",
+                "create table \"" <> tableName <> "_album\" (",
+                "  \"id\" int4 not null generated always as identity primary key,",
+                "  -- Album name.",
+                "  \"name\" text not null,",
+                "  -- The date the album was first released.",
+                "  \"released\" date null",
+                ");",
+                "",
+                "create table \"" <> tableName <> "_album_genre\" (",
+                "  \"album\" int4 not null references \"" <> tableName <> "_album\",",
+                "  \"genre\" int4 not null references \"" <> tableName <> "_genre\"",
+                ");",
+                "",
+                "create table \"" <> tableName <> "_album_artist\" (",
+                "  \"album\" int4 not null references \"" <> tableName <> "_album\",",
+                "  \"artist\" int4 not null references \"" <> tableName <> "_artist\",",
+                "  -- Whether it is the primary artist",
+                "  \"primary\" bool not null,",
+                "  primary key (\"album\", \"artist\")",
+                ");"
+              ]
+      result <- Connection.use connection (Session.script sql)
+      case result of
+        Right () -> pure ()
+        Left err -> expectationFailure $ "Expected success, got: " <> show err
diff --git a/src/library/Hasql/Comms/Recv.hs b/src/library/Hasql/Comms/Recv.hs
--- a/src/library/Hasql/Comms/Recv.hs
+++ b/src/library/Hasql/Comms/Recv.hs
@@ -1,6 +1,7 @@
 module Hasql.Comms.Recv
   ( Recv,
     singleResult,
+    allResults,
     toHandler,
     Error (..),
   )
@@ -50,6 +51,29 @@
     result <- ResultDecoder.toHandler handler result
     pure (first (ResultError context 0) result)
   pure result
+
+-- | Consume all results from a multi-statement query (e.g., scripts).
+-- Each result is decoded using the provided handler.
+-- This is useful for scripts that may contain multiple statements,
+-- where each statement produces a result that needs to be validated.
+-- All results are consumed even if an error occurs, to leave the connection
+-- in a clean state.
+allResults :: context -> ResultDecoder.ResultDecoder a -> Recv context ()
+allResults context handler = Recv \connection -> do
+  let loop resultIndex maybeError = do
+        result <- Pq.getResult connection
+        case result of
+          Nothing -> pure maybeError
+          Just result -> do
+            decodedResult <- ResultDecoder.toHandler handler result
+            case decodedResult of
+              Left err ->
+                -- Continue consuming results even after error to clean up connection
+                loop (resultIndex + 1) (Just (ResultError context resultIndex err))
+              Right _ ->
+                loop (resultIndex + 1) maybeError
+  errorOrUnit <- loop 0 Nothing
+  pure (maybe (Right ()) Left errorOrUnit)
 
 -- * Errors
 
diff --git a/src/library/Hasql/Comms/Roundtrip.hs b/src/library/Hasql/Comms/Roundtrip.hs
--- a/src/library/Hasql/Comms/Roundtrip.hs
+++ b/src/library/Hasql/Comms/Roundtrip.hs
@@ -8,6 +8,7 @@
     queryPrepared,
     queryParams,
     query,
+    script,
 
     -- * Errors
     Error (..),
@@ -112,6 +113,15 @@
   Roundtrip
     (Send.query context sql)
     (Recv.singleResult context ResultDecoder.ok)
+
+-- | Execute a script (multi-statement SQL).
+-- Unlike 'query', this consumes all results from the execution,
+-- which is necessary for scripts containing multiple statements.
+script :: context -> ByteString -> Roundtrip context ()
+script context sql =
+  Roundtrip
+    (Send.query context sql)
+    (Recv.allResults context ResultDecoder.ok)
 
 data Error context
   = ClientError context (Maybe ByteString)
diff --git a/src/library/Hasql/Engine/Contexts/Session.hs b/src/library/Hasql/Engine/Contexts/Session.hs
--- a/src/library/Hasql/Engine/Contexts/Session.hs
+++ b/src/library/Hasql/Engine/Contexts/Session.hs
@@ -42,7 +42,7 @@
 script sql =
   Session \connectionState -> do
     let connection = ConnectionState.connection connectionState
-    result <- Comms.Roundtrip.toSerialIO (Comms.Roundtrip.query (Just sql) sql) connection
+    result <- Comms.Roundtrip.toSerialIO (Comms.Roundtrip.script (Just sql) sql) connection
     case result of
       Left err -> case err of
         Comms.Roundtrip.ClientError _ details -> do
