diff --git a/redash/models/parameterized_query.py b/redash/models/parameterized_query.py index 102294e39b..07d609226b 100644 --- a/redash/models/parameterized_query.py +++ b/redash/models/parameterized_query.py @@ -213,7 +213,12 @@ def _valid(self, name, value, user, query_stack=None): "enum": lambda value: _is_value_within_options(value, enum_options, allow_multiple_values), "query": lambda value: _is_value_within_options( value, - [v["value"] for v in dropdown_values(query_id, self.org, user, query_stack=query_stack)], + [ + v["value"] + for v in dropdown_values( + query_id, self.org, user, run_if_not_cached=True, query_stack=query_stack + ) + ], allow_multiple_values, ), "date": _is_date, diff --git a/tests/models/test_parameterized_query.py b/tests/models/test_parameterized_query.py index 2896899f18..2291f3f256 100644 --- a/tests/models/test_parameterized_query.py +++ b/tests/models/test_parameterized_query.py @@ -227,6 +227,23 @@ def test_validates_query_parameters(self, _): self.assertEqual("foo baz", query.text) + @patch( + "redash.models.parameterized_query.dropdown_values", + return_value=[{"value": "baz"}], + ) + def test_query_validation_populates_dropdown_cache_on_demand(self, dropdown_values_mock): + # Validating a query-backed parameter must run the dropdown query + # on-demand when it isn't cached for the requesting user's db_role, + # rather than failing (ENG-7919). Otherwise a limited-visibility user + # whose db_role has no cached dropdown result gets a spurious + # InvalidParameterError. + schema = [{"name": "bar", "type": "query", "queryId": 1}] + query = ParameterizedQuery("foo {{bar}}", schema) + + query.apply({"bar": "baz"}, None) + + self.assertTrue(dropdown_values_mock.call_args.kwargs["run_if_not_cached"]) + def test_raises_on_invalid_date_range_parameters(self): schema = [{"name": "bar", "type": "date-range"}] query = ParameterizedQuery("foo", schema)