diff --git a/datasette/templates/table.html b/datasette/templates/table.html index 35e0b9c1..187f0143 100644 --- a/datasette/templates/table.html +++ b/datasette/templates/table.html @@ -40,7 +40,10 @@ {% endif %} {% if count or human_description_en %} -
{{ view_definition }}
{% endif %}
+{% if allow_execute_sql and query.sql %}
+
+{% endif %}
+
{% endblock %}
diff --git a/datasette/url_builder.py b/datasette/url_builder.py
index 9c6bbde0..16b3d42b 100644
--- a/datasette/url_builder.py
+++ b/datasette/url_builder.py
@@ -31,6 +31,12 @@ class Urls:
db = self.ds.get_database(database)
return self.path(tilde_encode(db.route), format=format)
+ def database_query(self, database, sql, format=None):
+ path = f"{self.database(database)}/-/query?" + urllib.parse.urlencode(
+ {"sql": sql}
+ )
+ return self.path(path, format=format)
+
def table(self, database, table, format=None):
path = f"{self.database(database)}/{tilde_encode(table)}"
if format is not None:
diff --git a/datasette/views/table.py b/datasette/views/table.py
index d71efeb0..ea044b36 100644
--- a/datasette/views/table.py
+++ b/datasette/views/table.py
@@ -929,6 +929,7 @@ async def table_view_traced(datasette, request):
database=resolved.db.name,
table=resolved.table,
),
+ count_limit=resolved.db.count_limit,
),
request=request,
view_name="table",
@@ -1280,6 +1281,9 @@ async def table_view_data(
if extra_extras:
extras.update(extra_extras)
+ async def extra_count_sql():
+ return count_sql
+
async def extra_count():
"Total count of rows matching these filters"
# Calculate the total count for this query
@@ -1299,8 +1303,11 @@ async def table_view_data(
# Otherwise run a select count(*) ...
if count_sql and count is None and not nocount:
+ count_sql_limited = (
+ f"select count(*) from (select * {from_sql} limit 10001)"
+ )
try:
- count_rows = list(await db.execute(count_sql, from_sql_params))
+ count_rows = list(await db.execute(count_sql_limited, from_sql_params))
count = count_rows[0][0]
except QueryInterrupted:
pass
@@ -1615,6 +1622,7 @@ async def table_view_data(
"facet_results",
"facets_timed_out",
"count",
+ "count_sql",
"human_description_en",
"next_url",
"metadata",
@@ -1647,6 +1655,7 @@ async def table_view_data(
registry = Registry(
extra_count,
+ extra_count_sql,
extra_facet_results,
extra_facets_timed_out,
extra_suggested_facets,