From 44e17fa3dbbd105d10c9291a5bdba5ee6ccb18f8 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Sun, 31 May 2026 11:37:48 -0700 Subject: [PATCH] Fix stored write returning rowcount message Refs #2762 --- datasette/views/database.py | 10 ++++++---- tests/test_queries.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/datasette/views/database.py b/datasette/views/database.py index d6c88962..a1647ca9 100644 --- a/datasette/views/database.py +++ b/datasette/views/database.py @@ -528,12 +528,14 @@ class QueryView(View): message = "Error running on_success_message_sql: {}".format(ex) message_type = datasette.ERROR if not message: - message = ( - stored_query.on_success_message - or "Query executed, {} row{} affected".format( + if stored_query.on_success_message: + message = stored_query.on_success_message + elif cursor.rowcount == -1: + message = "Query executed" + else: + message = "Query executed, {} row{} affected".format( cursor.rowcount, "" if cursor.rowcount == 1 else "s" ) - ) redirect_url = stored_query.on_success_redirect ok = True diff --git a/tests/test_queries.py b/tests/test_queries.py index c75c2459..6105b860 100644 --- a/tests/test_queries.py +++ b/tests/test_queries.py @@ -3031,3 +3031,34 @@ async def test_stored_write_query_with_returning(): assert (await db.execute("select id, name from dogs")).dicts() == [ {"id": 1, "name": "Cleo"} ] + + +@pytest.mark.asyncio +async def test_stored_write_query_with_truncated_returning_message(): + ds = Datasette(memory=True, default_deny=True) + ds.root_enabled = True + db = ds.add_memory_database("query_write_truncated_returning", name="data") + await db.execute_write("create table dogs (id integer primary key, name text)") + await db.execute_write_many( + "insert into dogs (name) values (?)", + [("Cleo",) for _ in range(20)], + ) + await ds.invoke_startup() + await ds.add_query( + "data", + "update_dogs", + "update dogs set name = name returning id", + is_write=True, + source="user", + owner_id="root", + ) + + response = await ds.client.post( + "/data/update_dogs?_json=1", + actor={"id": "root"}, + data={}, + ) + + assert response.status_code == 200 + assert response.json()["ok"] is True + assert response.json()["message"] == "Query executed"