If funnelVizType is set to time_to_convert and there is a breakdown filter, a funnels query fails:
{"task_id": "a2359333-163e-4e2a-9f38-a2a21af377ce", "request_id": "f7705379-2396-490f-9035-9b732d6c2bde", "ip": "188.26.221.133", "event": "Error processing query for team 19261 query 68b379e3-d736-4f56-b9a4-05a5729ff57c", "task_name": "posthog.tasks.tasks.process_query_task", "timestamp": "2024-07-05T10:02:33.684409Z", "logger": "posthog.clickhouse.client.execute_async", "level": "error", "pid": 274, "tid": 281473447689536, "exception": "Traceback (most recent call last):\n File \"/code/posthog/clickhouse/client/execute_async.py\", line 168, in execute_process_query\n results = process_query_dict(\n ^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/api/services/query.py\", line 46, in process_query_dict\n return process_query_model(\n ^^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/api/services/query.py\", line 114, in process_query_model\n result = query_runner.run(execution_mode=execution_mode, user=user, query_id=query_id)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql_queries/query_runner.py\", line 490, in run\n **self.calculate().model_dump(),\n ^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql_queries/insights/funnels/funnels_query_runner.py\", line 86, in calculate\n response = execute_hogql_query(\n ^^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/query.py\", line 157, in execute_hogql_query\n clickhouse_sql = print_ast(\n ^^^^^^^^^^\n File \"/code/posthog/hogql/printer.py\", line 80, in print_ast\n prepared_ast = prepare_ast_for_printing(node=node, context=context, dialect=dialect, stack=stack, settings=settings)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/printer.py\", line 109, in prepare_ast_for_printing\n node = resolve_types(node, context, dialect=dialect, scopes=[node.type for node in stack] if stack else None)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 84, in resolve_types\n return Resolver(scopes=scopes, context=context, dialect=dialect).visit(node)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 122, in visit\n return super().visit(node)\n ^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 27, in visit\n return node.accept(self)\n ^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/base.py\", line 32, in accept\n return visit(self)\n ^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 165, in visit_select_query\n new_node.select_from = self.visit(node.select_from)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 122, in visit\n return super().visit(node)\n ^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 27, in visit\n return node.accept(self)\n ^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/base.py\", line 32, in accept\n return visit(self)\n ^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 379, in visit_join_expr\n node.table = super().visit(node.table)\n ^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 27, in visit\n return node.accept(self)\n ^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/base.py\", line 32, in accept\n return visit(self)\n ^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 183, in visit_select_query\n new_expr = self.visit(expr)\n ^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 122, in visit\n return super().visit(node)\n ^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 27, in visit\n return node.accept(self)\n ^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/base.py\", line 32, in accept\n return visit(self)\n ^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 426, in visit_alias\n node = super().visit_alias(node)\n ^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 352, in visit_alias\n expr=self.visit(node.expr),\n ^^^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 122, in visit\n return super().visit(node)\n ^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 27, in visit\n return node.accept(self)\n ^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/base.py\", line 32, in accept\n return visit(self)\n ^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 433, in visit_arithmetic_operation\n node = super().visit_arithmetic_operation(node)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 360, in visit_arithmetic_operation\n left=self.visit(node.left),\n ^^^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 122, in visit\n return super().visit(node)\n ^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 27, in visit\n return node.accept(self)\n ^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/base.py\", line 32, in accept\n return visit(self)\n ^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 588, in visit_field\n response = self.visit(clone_expr(cte.expr))\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 122, in visit\n return super().visit(node)\n ^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 27, in visit\n return node.accept(self)\n ^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/base.py\", line 32, in accept\n return visit(self)\n ^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 165, in visit_select_query\n new_node.select_from = self.visit(node.select_from)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 122, in visit\n return super().visit(node)\n ^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 27, in visit\n return node.accept(self)\n ^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/base.py\", line 32, in accept\n return visit(self)\n ^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 294, in visit_join_expr\n response = self.visit(node)\n ^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 122, in visit\n return super().visit(node)\n ^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 27, in visit\n return node.accept(self)\n ^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/base.py\", line 32, in accept\n return visit(self)\n ^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 379, in visit_join_expr\n node.table = super().visit(node.table)\n ^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 27, in visit\n return node.accept(self)\n ^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/base.py\", line 32, in accept\n return visit(self)\n ^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 183, in visit_select_query\n new_expr = self.visit(expr)\n ^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 122, in visit\n return super().visit(node)\n ^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 27, in visit\n return node.accept(self)\n ^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/base.py\", line 32, in accept\n return visit(self)\n ^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 426, in visit_alias\n node = super().visit_alias(node)\n ^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 352, in visit_alias\n expr=self.visit(node.expr),\n ^^^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 122, in visit\n return super().visit(node)\n ^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 27, in visit\n return node.accept(self)\n ^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/base.py\", line 32, in accept\n return visit(self)\n ^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 469, in visit_call\n node = super().visit_call(node)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 489, in visit_call\n args=[self.visit(arg) for arg in node.args],\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 489, in <listcomp>\n args=[self.visit(arg) for arg in node.args],\n ^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 122, in visit\n return super().visit(node)\n ^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 27, in visit\n return node.accept(self)\n ^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/base.py\", line 32, in accept\n return visit(self)\n ^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 469, in visit_call\n node = super().visit_call(node)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 489, in visit_call\n args=[self.visit(arg) for arg in node.args],\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 489, in <listcomp>\n args=[self.visit(arg) for arg in node.args],\n ^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 122, in visit\n return super().visit(node)\n ^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 27, in visit\n return node.accept(self)\n ^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/base.py\", line 32, in accept\n return visit(self)\n ^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 469, in visit_call\n node = super().visit_call(node)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 489, in visit_call\n args=[self.visit(arg) for arg in node.args],\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 489, in <listcomp>\n args=[self.visit(arg) for arg in node.args],\n ^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 122, in visit\n return super().visit(node)\n ^^^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/visitor.py\", line 27, in visit\n return node.accept(self)\n ^^^^^^^^^^^^^^^^^\n File \"/code/posthog/hogql/base.py\", line 32, in accept\n return visit(self)\n ^^^^^^^^^^^\n File \"/code/posthog/hogql/resolver.py\", line 617, in visit_field\n raise QueryError(f\"Unable to resolve field: {name}\")\nposthog.hogql.errors.QueryError: Unable to resolve field: step_1_average_conversion_time_inner"}
Bug Description
Bug description
If
funnelVizType
is set totime_to_convert
and there is a breakdown filter, a funnels query fails:How to reproduce
Funnel query schema:
Query:
Additional context
Support Ticket
Debug info
No response