diff --git a/store/postgres/src/sql/parser.rs b/store/postgres/src/sql/parser.rs index c387df094ac..ad3e5698978 100644 --- a/store/postgres/src/sql/parser.rs +++ b/store/postgres/src/sql/parser.rs @@ -17,7 +17,7 @@ pub fn generate_table_prelude_from_layout(layout: &Layout) -> String { let (block_column, filter) = if !table.immutable { ( "block_range", - Some(format!(" WHERE block_range @> {}", BLOCK_NUMBER_MAX)), + Some(format!(" WHERE \"block_range\" @> {}", BLOCK_NUMBER_MAX)), ) } else { ("block$", None) @@ -29,19 +29,19 @@ pub fn generate_table_prelude_from_layout(layout: &Layout) -> String { .map(|col| { if !col.is_list() && col.column_type == ColumnType::Bytes { format!( - "concat('0x', encode({}, 'hex')) AS {}", + r#"concat('0x', encode("{}", 'hex')) AS "{}""#, col.name.as_str(), col.name.as_str() ) } else { - col.name.to_string() + format!(r#""{}""#, col.name.as_str()) } }) - .chain(std::iter::once(block_column.to_string())) + .chain(std::iter::once(format!(r#""{}""#, block_column))) .collect::>() .join(", "); format!( - "{table_name} AS (SELECT {columns} FROM {schema}.{table_name}{})", + "\"{table_name}\" AS (SELECT {columns} FROM \"{schema}\".\"{table_name}\"{})", filter.unwrap_or_default() ) }) @@ -183,7 +183,8 @@ mod test { assert_eq!( query, - "WITH swap_multi AS (SELECT concat('0x', encode(id, 'hex')) AS id, concat('0x', encode(sender, 'hex')) AS sender, amounts_in, tokens_in, amounts_out, tokens_out, referral_code, block_number, block_timestamp, concat('0x', encode(transaction_hash, 'hex')) AS transaction_hash, block$ FROM sgd0815.swap_multi),\ntoken AS (SELECT id, concat('0x', encode(address, 'hex')) AS address, symbol, name, decimals, block_range FROM sgd0815.token WHERE block_range @> 2147483647) SELECT to_jsonb(sub.*) AS data FROM ( WITH tokens AS (SELECT * FROM (VALUES ('0x0000000000000000000000000000000000000000', 'ETH', 'Ethereum', 18), ('0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', 'USDC', 'USD Coin', 6)) AS t (address, symbol, name, decimals)) SELECT date, t.symbol, SUM(amount) / pow(10, t.decimals) AS amount FROM (SELECT date(to_timestamp(block_timestamp) AT TIME ZONE 'utc') AS date, token, amount FROM swap_multi AS sm, UNNEST(sm.amounts_in, sm.tokens_in) AS smi (amount, token) UNION ALL SELECT date(to_timestamp(block_timestamp) AT TIME ZONE 'utc') AS date, token, amount FROM swap_multi AS sm, UNNEST(sm.amounts_out, sm.tokens_out) AS smo (amount, token)) AS tp JOIN tokens AS t ON t.address = '0x' || encode(tp.token, 'hex') GROUP BY tp.date, t.symbol, t.decimals ORDER BY tp.date DESC, amount DESC ) AS sub" + r#"WITH "swap_multi" AS (SELECT concat('0x', encode("id", 'hex')) AS "id", concat('0x', encode("sender", 'hex')) AS "sender", "amounts_in", "tokens_in", "amounts_out", "tokens_out", "referral_code", "block_number", "block_timestamp", concat('0x', encode("transaction_hash", 'hex')) AS "transaction_hash", "block$" FROM "sgd0815"."swap_multi"), +"token" AS (SELECT "id", concat('0x', encode("address", 'hex')) AS "address", "symbol", "name", "decimals", "block_range" FROM "sgd0815"."token" WHERE "block_range" @> 2147483647) SELECT to_jsonb(sub.*) AS data FROM ( WITH tokens AS (SELECT * FROM (VALUES ('0x0000000000000000000000000000000000000000', 'ETH', 'Ethereum', 18), ('0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', 'USDC', 'USD Coin', 6)) AS t (address, symbol, name, decimals)) SELECT date, t.symbol, SUM(amount) / pow(10, t.decimals) AS amount FROM (SELECT date(to_timestamp(block_timestamp) AT TIME ZONE 'utc') AS date, token, amount FROM swap_multi AS sm, UNNEST(sm.amounts_in, sm.tokens_in) AS smi (amount, token) UNION ALL SELECT date(to_timestamp(block_timestamp) AT TIME ZONE 'utc') AS date, token, amount FROM swap_multi AS sm, UNNEST(sm.amounts_out, sm.tokens_out) AS smo (amount, token)) AS tp JOIN tokens AS t ON t.address = '0x' || encode(tp.token, 'hex') GROUP BY tp.date, t.symbol, t.decimals ORDER BY tp.date DESC, amount DESC ) AS sub"# ); } }