Re: How to definitively determine whether a statement is a SELECT statement? - Mailing list pgsql-admin

From bertrand HARTWIG
Subject Re: How to definitively determine whether a statement is a SELECT statement?
Date
Msg-id CD2A2F2D-30A2-450E-BA84-58A79860CEFF@gmail.com
Whole thread
List 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@gmail.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!

pgsql-admin by date:

Previous
From: Vani Majumdar
Date:
Subject: Subscription to community
Next
From: 李明
Date:
Subject: Is there a way to avoid “refresh materialized view” generating WAL?