From 22d6ff60ffffb2d0f3462b76b556b6f6e5dc9c24 Mon Sep 17 00:00:00 2001 From: taozhi8833998 Date: Mon, 16 Jun 2025 08:40:54 +0800 Subject: [PATCH] feat: add boolean type in athena --- pegjs/athena.pegjs | 6 +++++- test/athena.spec.js | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/pegjs/athena.pegjs b/pegjs/athena.pegjs index bcf583f4..c8de72e6 100644 --- a/pegjs/athena.pegjs +++ b/pegjs/athena.pegjs @@ -1895,7 +1895,7 @@ jsonb_expr column_ref = schema:ident tbl:(__ DOT __ ident) col:(__ DOT __ column) ce:(__ collate_expr)? { - columnList.add(`select::${schema}.${tbl[3]}::${col[3].value}`); + columnList.add(`select::${schema}.${tbl[3]}::${col[3].value || col[3]}`); return { type: 'column_ref', schema: schema, @@ -2876,6 +2876,7 @@ data_type_item / datetime_type / json_type / text_type + / boolean_type data_type_list = head:data_type_item tail:(__ COMMA __ data_type_item)* { @@ -2929,3 +2930,6 @@ json_type text_type = t:(KW_TINYTEXT / KW_TEXT / KW_MEDIUMTEXT / KW_LONGTEXT) { return { dataType: t }} + +boolean_type + = 'boolean'i { return { dataType: 'BOOLEAN' }; } diff --git a/test/athena.spec.js b/test/athena.spec.js index 18d17542..83a1447f 100644 --- a/test/athena.spec.js +++ b/test/athena.spec.js @@ -470,4 +470,8 @@ describe('athena', () => { WHERE (((NOT (leads.company LIKE '%test%')) AND (NOT (leads.company LIKE '%Test%'))) AND ((NOT (leads.name LIKE '%test%')) AND (NOT (leads.name LIKE '%Test%'))))` expect(getParsedSql(sql)).to.be.equal(`SELECT "leads".*, from_unixtime(CAST(substrinfg("leads"."demo_meeting_date_c", 1, 10) AS DOUBLE)) AS "demo_meeting_date_correct", CAST("first_conversion_date_c" AS DATE) AS "first_conversion_date_correct", "aes"."ae_owner", "created"."created_by" FROM (((("salesforce_leads" AS "leads" LEFT JOIN "salesforce_opportunitys" AS "opps" ON ("leads"."converted_opportunity_id" = "opps"."id")) LEFT JOIN (SELECT "id" AS "user_id", "name" AS "lead_owner" FROM "salesforce_users") AS "owners" ON ("leads"."owner_id" = "owners"."user_id")) LEFT JOIN (SELECT "id" AS "user_id", "name" AS "ae_owner" FROM "salesforce_users") AS "aes" ON ("leads"."a_e_owner_c" = "aes"."user_id")) LEFT JOIN (SELECT "id" AS "user_id", "name" AS "created_by" FROM "salesforce_users") AS "created" ON ("leads"."created_by_id" = "created"."user_id")) WHERE (((NOT("leads"."company" LIKE '%test%')) AND (NOT("leads"."company" LIKE '%Test%'))) AND ((NOT("leads"."name" LIKE '%test%')) AND (NOT("leads"."name" LIKE '%Test%'))))`) }) + it('should support boolean type', () => { + const sql = 'SELECT * from table_name WHERE CAST ( foo.bar.baz as boolean) = false' + expect(getParsedSql(sql)).to.be.equal('SELECT * FROM "table_name" WHERE CAST("foo"."bar"."baz" AS BOOLEAN) = FALSE') + }) }) \ No newline at end of file