mapledan commented on code in PR #42785:
URL: https://github.com/apache/superset/pull/42785#discussion_r4051827836
##########
superset/jinja_context.py:
##########
@@ -951,14 +974,19 @@ def __init__(
database: "Database",
query: "Query" | None = None,
table: "SqlaTable" | None = None,
+ schema: str | None = None,
Review Comment:
Good catch, and this one reaches existing data — `models/helpers` does
`template_kwargs.update(self.template_params_dict)`, so a dataset's own
params
arrive as constructor keywords. `{"schema": "sales"}` with
`SELECT * FROM {{ schema }}.orders` stopped rendering and left the reference
in
place. Confirmed against master, which renders it.
Rather than rename the internal one, I dropped it. Estimation builds an
unpersisted `Query` and passes that, which is where the processor has always
read the location from — so no keyword is claimed and the constructor goes
back
to its master shape. That also carries the catalog you raise below, and lets
the
rendered SQL ride along as `executed_sql`.
What I'm less comfortable leaving alone is the general shape: every keyword
this
constructor names is a name a user can no longer use in `template_params`,
and
nothing anywhere says so. `extra_cache_keys`, `removed_filters` and
`applied_filters` sit in the same position today. Is that worth a guard, or
at
least something on the signature? It feels wider than this PR, so I'd rather
raise it separately than grow this one — but say the word if you'd prefer it
here.
##########
superset/commands/sql_lab/estimate.py:
##########
@@ -161,27 +162,51 @@ def run(
) -> list[dict[str, Any]]:
self.validate()
- sql = self._sql
- if self._template_params:
- # Access is already checked in validate() before any rendering.
- template_processor = get_template_processor(self._database)
- try:
- sql = template_processor.process_template(sql,
**self._template_params)
- except TemplateError as ex:
- raise SupersetErrorException(
- SupersetError(
- message=str(ex),
- error_type=SupersetErrorType.GENERIC_COMMAND_ERROR,
- level=ErrorLevel.ERROR,
- ),
- status=400,
- ) from ex
+ # Access is already checked in validate() before any rendering.
+ #
+ # Rendered whether or not `template_params` was supplied, the way
+ # `validate()` above already jinja-processes for authorization and the
+ # execution path does in `SqlQueryRenderImpl.render`. A query needs no
+ # declared parameter to need rendering -- `get_time_filter()`,
+ # `current_username()`, `url_param()` take none -- and SQL Lab posts an
+ # empty `template_params` for an estimate, so those never rendered.
+ template_processor = get_template_processor(self._database)
+ try:
+ sql = template_processor.process_template(
Review Comment:
Pinned as `executed_sql` and dropped the `sql=` form, so this matches
`_validate_rendered_access`.
One thing I'd rather flag than paper over: I can't construct a case where the
two forms actually differ. With no `template_params` passed, `sql=` builds an
ephemeral query whose `sql` is already the rendered text, and pinning puts
the
same string in `executed_sql` — both land in
`process_jinja_sql(rendered, database, None)`. I wrote the `| random` case
as a
test and it passes against either version, so as it stands I'd be adding a
test
that doesn't exercise the change.
The macro-neutralisation you describe (a reference becoming a comment before
the
tables are extracted) happens inside `process_jinja_sql`, which both forms
reach,
so I don't think that separates them either.
So I've kept the change as parity of mechanism and said exactly that in the
test,
rather than have it claim a hole is closed. Is there a case you had in mind
where
the authorization render and the estimate render land on different tables
without
params in play? If so I'd rather cover it properly than leave this as a shape
change.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]