Re: How to definitively determine whether a statement is a SELECT statement?

From: bertrand HARTWIG <hartwig(dot)bertrand(at)gmail(dot)com>
To: Ron Johnson <ronljohnsonjr(at)gmail(dot)com>
Cc: Pgsql-admin <pgsql-admin(at)lists(dot)postgresql(dot)org>
Subject: Re: How to definitively determine whether a statement is a SELECT statement?
Date: 2026-09-01 05:07:17
Message-ID: CD2A2F2D-30A2-450E-BA84-58A79860CEFF@gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-admin

Hello,

You can use this python lib : pglast

from pglast import parse_sql
from pglast.ast import SelectStmt

def is_select_query(sql: str) -> bool:
try:
statements = parse_sql(sql)
except Exception:
return False # SQL invalide

if len(statements) != 1:
return False # Refuse plusieurs instructions SQL

return isinstance(statements[0].stmt, SelectStmt)

print(is_select_query("SELECT * FROM users")) # True
print(is_select_query("WITH x AS (SELECT 1) SELECT * FROM x")) # True
print(is_select_query("INSERT INTO users(name) VALUES ('Alice')")) # False
print(is_select_query("SELECT 1; DELETE FROM users")) # False

Bertrand

> Le 31 août 2026 à 18:06, Ron Johnson <ronljohnsonjr(at)gmail(dot)com> a écrit :
>
> Sometimes, the developers add comments to the top of statements, and so we see that in pg_stat_activity.query as seen in this example:
>
> select query
> from pg_stat_activity
> where pid = 1054079;
> query
> ----------------------------------------
> -- Some comment written by the developer
> SELECT blah blah FROM .blah
>
> I could case-insensitively search pg_stat_activity.query for "SELECT " but that will fail if there is a SELECT in the CTE or subquery of a DELETE or UPDATE statement, and writing a parser to strip out all comments is a bit too much effort for a simple query.
>
> --
> Death to <Redacted>, and butter sauce.
> Don't boil me, I'm still alive.
> <Redacted> lobster!

In response to

Browse pgsql-admin by date

  From Date Subject
Next Message Ron Johnson 2026-09-01 16:14:19 Feature Request: pg_stat_activity.client_hostname and Unix sockets
Previous Message Ron Johnson 2026-08-31 16:06:39 How to definitively determine whether a statement is a SELECT statement?