From ff5959f8f9c1d40dfe8b36a18cbd28d78ac77dca Mon Sep 17 00:00:00 2001
From: Rafia Sabih <rafia.sabih@gmail.com>
Date: Tue, 28 Mar 2023 12:17:06 +0200
Subject: [PATCH] Handle when FROM clause is missing in continuous aggregate
 definition

It now errors out for such a case.

Fixes #5500
---
 CHANGELOG.md                      | 1 +
 tsl/src/continuous_aggs/create.c  | 6 +++++-
 tsl/test/expected/cagg_errors.out | 3 +++
 tsl/test/sql/cagg_errors.sql      | 2 ++
 4 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 51921b802..f423bfdf8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -28,6 +28,7 @@ accidentally triggering the load of a previous DB version.**
 * #5459 Fix issue creating dimensional constraints
 * #5499 Do not segfault on large histogram() parameters
 * #5497 Allow named time_bucket arguments in Cagg definition
+* #5500 Fix when no FROM clause in continuous aggregate definition
 
 **Thanks**
 * @nikolaps for reporting an issue with the COPY fetcher
diff --git a/tsl/src/continuous_aggs/create.c b/tsl/src/continuous_aggs/create.c
index b9d23a030..b917732f0 100644
--- a/tsl/src/continuous_aggs/create.c
+++ b/tsl/src/continuous_aggs/create.c
@@ -1050,7 +1050,11 @@ cagg_query_supported(const Query *query, StringInfo hint, StringInfo detail, con
 	}
 #endif
 #endif
-
+	if (!query->jointree->fromlist)
+	{
+		appendStringInfoString(hint, "FROM clause missing in the query");
+		return false;
+	}
 	if (query->commandType != CMD_SELECT)
 	{
 		appendStringInfoString(hint, "Use a SELECT query in the continuous aggregate view.");
diff --git a/tsl/test/expected/cagg_errors.out b/tsl/test/expected/cagg_errors.out
index 5fd68b716..60c9cba22 100644
--- a/tsl/test/expected/cagg_errors.out
+++ b/tsl/test/expected/cagg_errors.out
@@ -631,3 +631,6 @@ ERROR:  invalid continuous aggregate query
 CREATE MATERIALIZED VIEW matv1 AS SELECT now() AS time;
 CREATE MATERIALIZED VIEW cagg1 WITH (timescaledb.continuous) AS SELECT time_bucket('1h',time) FROM matv1 GROUP BY 1;
 ERROR:  invalid continuous aggregate view
+-- No FROM clause in CAGG definition
+CREATE MATERIALIZED VIEW cagg1 with (timescaledb.continuous) AS SELECT 1 GROUP BY 1 WITH NO DATA;
+ERROR:  invalid continuous aggregate query
diff --git a/tsl/test/sql/cagg_errors.sql b/tsl/test/sql/cagg_errors.sql
index ca5114d14..120fc933d 100644
--- a/tsl/test/sql/cagg_errors.sql
+++ b/tsl/test/sql/cagg_errors.sql
@@ -523,3 +523,5 @@ CREATE MATERIALIZED VIEW cagg1 WITH (timescaledb.continuous) AS SELECT time_buck
 CREATE MATERIALIZED VIEW matv1 AS SELECT now() AS time;
 CREATE MATERIALIZED VIEW cagg1 WITH (timescaledb.continuous) AS SELECT time_bucket('1h',time) FROM matv1 GROUP BY 1;
 
+-- No FROM clause in CAGG definition
+CREATE MATERIALIZED VIEW cagg1 with (timescaledb.continuous) AS SELECT 1 GROUP BY 1 WITH NO DATA;