Compare commits

...

5 commits

Author SHA1 Message Date
Mike Cao
d382ad2975
Merge pull request #3682 from rkoh-rq/patch-1
Some checks are pending
Node.js CI / build (postgresql, 18.18, 10) (push) Waiting to run
fix: quote "event" reserved keyword in journey queries
2025-11-14 11:44:31 -08:00
Mike Cao
b1dc690e2f
Merge branch 'dev' into patch-1 2025-11-14 11:44:20 -08:00
Francis Cao
cc8254985b Increase resetWebsite timeout. fix retention bug returning decimal day_number in CH.
Some checks failed
Create docker images (cloud) / Build, push, and deploy (push) Has been cancelled
Node.js CI / build (postgresql, 18.18, 10) (push) Has been cancelled
Closes #3698
2025-11-14 09:11:26 -08:00
Francis Cao
a3f32b036d revert getDateStringSQL for CH 2025-11-14 08:10:13 -08:00
rkoh-rq
3cb7fa34b0
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
2025-11-04 11:00:33 +08:00
4 changed files with 32 additions and 27 deletions

View file

@ -51,12 +51,12 @@ function getUTCString(date?: Date | string | number) {
return formatInTimeZone(date || new Date(), 'UTC', 'yyyy-MM-dd HH:mm:ss'); 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) { 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) { function getDateSQL(field: string, unit: string, timezone?: string) {

View file

@ -135,26 +135,31 @@ export async function resetWebsite(websiteId: string) {
const { client, transaction } = prisma; const { client, transaction } = prisma;
const cloudMode = !!process.env.CLOUD_MODE; const cloudMode = !!process.env.CLOUD_MODE;
return transaction([ return transaction(
client.eventData.deleteMany({ [
where: { websiteId }, client.eventData.deleteMany({
}), where: { websiteId },
client.sessionData.deleteMany({ }),
where: { websiteId }, client.sessionData.deleteMany({
}), where: { websiteId },
client.websiteEvent.deleteMany({ }),
where: { websiteId }, client.websiteEvent.deleteMany({
}), where: { websiteId },
client.session.deleteMany({ }),
where: { websiteId }, client.session.deleteMany({
}), where: { websiteId },
client.website.update({ }),
where: { id: websiteId }, client.website.update({
data: { where: { id: websiteId },
resetAt: new Date(), data: {
}, resetAt: new Date(),
}), },
]).then(async data => { }),
],
{
timeout: 30000,
},
).then(async data => {
if (cloudMode) { if (cloudMode) {
await redis.client.set( await redis.client.set(
`website:${websiteId}`, `website:${websiteId}`,

View file

@ -73,7 +73,7 @@ async function relationalQuery(
for (let i = 1; i <= steps; i++) { for (let i = 1; i <= steps; i++) {
const endQuery = i < steps ? ',' : ''; const endQuery = i < steps ? ',' : '';
selectQuery += `s.e${i},`; 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} `; groupByQuery += `s.e${i}${endQuery} `;
} }
@ -185,7 +185,7 @@ async function clickhouseQuery(
for (let i = 1; i <= steps; i++) { for (let i = 1; i <= steps; i++) {
const endQuery = i < steps ? ',' : ''; const endQuery = i < steps ? ',' : '';
selectQuery += `s.e${i},`; 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} `; groupByQuery += `s.e${i}${endQuery} `;
} }
@ -230,7 +230,7 @@ async function clickhouseQuery(
WITH events AS ( WITH events AS (
select distinct select distinct
visit_id, 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 row_number() OVER (PARTITION BY visit_id ORDER BY created_at) AS event_number
from website_event from website_event
${cohortQuery} ${cohortQuery}

View file

@ -133,7 +133,7 @@ async function clickhouseQuery(
user_activities AS ( user_activities AS (
select distinct select distinct
website_event.session_id, 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 from website_event
join cohort_items join cohort_items
on website_event.session_id = cohort_items.session_id on website_event.session_id = cohort_items.session_id