From 3cb7fa34b00bf09e751ab0cef87c14afbfe07970 Mon Sep 17 00:00:00 2001 From: rkoh-rq <49420412+rkoh-rq@users.noreply.github.com> Date: Tue, 4 Nov 2025 11:00:33 +0800 Subject: [PATCH 1/3] fix: quote "event" reserved keyword in journey queries Fixes PostgreSQL syntax error by quoting the "event" column alias. This was causing the journey query to fail. "event" is a reserved keyword in PostgreSQL. Added double quotes to treat it as an identifier rather than a keyword. Changes: - Quote "event" in PostgreSQL - Quote "event" in ClickHouse for consistency --- src/queries/sql/reports/getJourney.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/queries/sql/reports/getJourney.ts b/src/queries/sql/reports/getJourney.ts index e831a96dd..9d927cfef 100644 --- a/src/queries/sql/reports/getJourney.ts +++ b/src/queries/sql/reports/getJourney.ts @@ -72,7 +72,7 @@ async function relationalQuery( for (let i = 1; i <= steps; i++) { const endQuery = i < steps ? ',' : ''; selectQuery += `s.e${i},`; - maxQuery += `\nmax(CASE WHEN event_number = ${i} THEN event ELSE NULL END) AS e${i}${endQuery}`; + maxQuery += `\nmax(CASE WHEN event_number = ${i} THEN "event" ELSE NULL END) AS e${i}${endQuery}`; groupByQuery += `s.e${i}${endQuery} `; } @@ -118,7 +118,7 @@ async function relationalQuery( select distinct visit_id, referrer_path, - coalesce(nullIf(event_name, ''), url_path) event, + coalesce(nullIf(event_name, ''), url_path) "event", row_number() OVER (PARTITION BY visit_id ORDER BY created_at) AS event_number from website_event where website_id = {{websiteId::uuid}} @@ -182,7 +182,7 @@ async function clickhouseQuery( for (let i = 1; i <= steps; i++) { const endQuery = i < steps ? ',' : ''; selectQuery += `s.e${i},`; - maxQuery += `\nmax(CASE WHEN event_number = ${i} THEN event ELSE NULL END) AS e${i}${endQuery}`; + maxQuery += `\nmax(CASE WHEN event_number = ${i} THEN "event" ELSE NULL END) AS e${i}${endQuery}`; groupByQuery += `s.e${i}${endQuery} `; } @@ -227,7 +227,7 @@ async function clickhouseQuery( WITH events AS ( select distinct visit_id, - coalesce(nullIf(event_name, ''), url_path) event, + coalesce(nullIf(event_name, ''), url_path) "event", row_number() OVER (PARTITION BY visit_id ORDER BY created_at) AS event_number from website_event where website_id = {websiteId:UUID} From a3f32b036d25fd1f9ac22d04d0efa140c53b1452 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Fri, 14 Nov 2025 08:10:13 -0800 Subject: [PATCH 2/3] revert getDateStringSQL for CH --- src/lib/clickhouse.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/clickhouse.ts b/src/lib/clickhouse.ts index 652b9d118..4880e122e 100644 --- a/src/lib/clickhouse.ts +++ b/src/lib/clickhouse.ts @@ -51,12 +51,12 @@ function getUTCString(date?: Date | string | number) { return formatInTimeZone(date || new Date(), 'UTC', 'yyyy-MM-dd HH:mm:ss'); } -function getDateStringSQL(field: string, unit: string, timezone?: string) { +function getDateStringSQL(data: any, unit: string = 'utc', timezone?: string) { if (timezone) { - return `formatDateTime(${field}, '${CLICKHOUSE_DATE_FORMATS[unit]}', '${timezone}')`; + return `formatDateTime(${data}, '${CLICKHOUSE_DATE_FORMATS[unit]}', '${timezone}')`; } - return `formatDateTime(${field}, '${CLICKHOUSE_DATE_FORMATS[unit]}')`; + return `formatDateTime(${data}, '${CLICKHOUSE_DATE_FORMATS[unit]}')`; } function getDateSQL(field: string, unit: string, timezone?: string) { From cc8254985b65565da94fd90eef598344f1d33eac Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Fri, 14 Nov 2025 09:11:26 -0800 Subject: [PATCH 3/3] Increase resetWebsite timeout. fix retention bug returning decimal day_number in CH. Closes #3698 --- src/queries/prisma/website.ts | 45 ++++++++++++++----------- src/queries/sql/reports/getRetention.ts | 2 +- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/src/queries/prisma/website.ts b/src/queries/prisma/website.ts index 5f5404d5d..cc5f2e6f4 100644 --- a/src/queries/prisma/website.ts +++ b/src/queries/prisma/website.ts @@ -135,26 +135,31 @@ export async function resetWebsite(websiteId: string) { const { client, transaction } = prisma; const cloudMode = !!process.env.CLOUD_MODE; - return transaction([ - client.eventData.deleteMany({ - where: { websiteId }, - }), - client.sessionData.deleteMany({ - where: { websiteId }, - }), - client.websiteEvent.deleteMany({ - where: { websiteId }, - }), - client.session.deleteMany({ - where: { websiteId }, - }), - client.website.update({ - where: { id: websiteId }, - data: { - resetAt: new Date(), - }, - }), - ]).then(async data => { + return transaction( + [ + client.eventData.deleteMany({ + where: { websiteId }, + }), + client.sessionData.deleteMany({ + where: { websiteId }, + }), + client.websiteEvent.deleteMany({ + where: { websiteId }, + }), + client.session.deleteMany({ + where: { websiteId }, + }), + client.website.update({ + where: { id: websiteId }, + data: { + resetAt: new Date(), + }, + }), + ], + { + timeout: 30000, + }, + ).then(async data => { if (cloudMode) { await redis.client.set( `website:${websiteId}`, diff --git a/src/queries/sql/reports/getRetention.ts b/src/queries/sql/reports/getRetention.ts index 15984cd36..d99098c00 100644 --- a/src/queries/sql/reports/getRetention.ts +++ b/src/queries/sql/reports/getRetention.ts @@ -133,7 +133,7 @@ async function clickhouseQuery( user_activities AS ( select distinct website_event.session_id, - (${getDateSQL('created_at', unit, timezone)} - cohort_items.cohort_date) / 86400 as day_number + toInt32((${getDateSQL('created_at', unit, timezone)} - cohort_items.cohort_date) / 86400) as day_number from website_event join cohort_items on website_event.session_id = cohort_items.session_id