Skip to content

Commit

Permalink
fix(backend): properly unespace characters before executing sql query
Browse files Browse the repository at this point in the history
  • Loading branch information
oktal committed Sep 9, 2024
1 parent ea5406c commit 4e52725
Showing 1 changed file with 34 additions and 2 deletions.
36 changes: 34 additions & 2 deletions src-tauri/src/lens.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@ use std::sync::{Arc, Mutex};

use anyhow::Context;
use datafusion::{
common::{DataFusionError, sql_datafusion_err},
logical_expr::{DdlStatement, LogicalPlan},
prelude::*,
sql::{parser::Statement, TableReference},
sql::{parser::Statement, sqlparser::parser::ParserError, TableReference},
};
use object_store::{aws::AmazonS3Builder, ObjectStore};
use tokio::sync::mpsc;
Expand Down Expand Up @@ -43,6 +44,35 @@ impl serde::Serialize for LensError {
}
}

fn unescape(input: &str) -> datafusion::error::Result<String> {
let mut chars = input.chars();

let mut result = String::with_capacity(input.len());
while let Some(char) = chars.next() {
if char == '\\' {
if let Some(next_char) = chars.next() {
// https://static.rust-lang.org/doc/master/reference.html#literals
result.push(match next_char {
'0' => '\0',
'n' => '\n',
'r' => '\r',
't' => '\t',
'\\' => '\\',
_ => {
return Err(sql_datafusion_err!(ParserError::TokenizerError(
format!("unsupported escape char: '\\{}'", next_char)
)))
}
});
}
} else {
result.push(char);
}
}

Ok(result)
}

impl Lens {
pub fn new() -> (Self, QueryStreamer) {
// Setup session
Expand Down Expand Up @@ -74,9 +104,11 @@ impl Lens {
}

pub async fn sql(&self, query: &str) -> LensResult<DataFrame> {
let query = unescape(query)?;

Ok(self
.ctx
.execute_logical_plan(self.create_logical_plan(query).await?)
.execute_logical_plan(self.create_logical_plan(&query).await?)
.await?)
}

Expand Down

0 comments on commit 4e52725

Please sign in to comment.