Skip to content

Commit

Permalink
fix(cubesql): Alias binding problem with escapes (<expr> as '')
Browse files Browse the repository at this point in the history
  • Loading branch information
ovr committed Jan 10, 2022
1 parent a1832de commit 8b2c002
Show file tree
Hide file tree
Showing 2 changed files with 146 additions and 134 deletions.
10 changes: 5 additions & 5 deletions rust/cubesql/cubesql/src/compile/context.rs
Expand Up @@ -35,29 +35,29 @@ impl QueryContext {

pub fn find_selection_for_identifier(
&self,
column_name: &String,
identifier: &String,
check_alias: bool,
) -> Option<Selection> {
for dimension in self.meta.dimensions.iter() {
if dimension.get_real_name().eq(column_name) {
if dimension.get_real_name().eq(identifier) {
return Some(Selection::Dimension(dimension.clone()));
}
}

for measure in self.meta.measures.iter() {
if measure.get_real_name().eq(column_name) {
if measure.get_real_name().eq(identifier) {
return Some(Selection::Measure(measure.clone()));
}
}

for segment in self.meta.segments.iter() {
if segment.get_real_name().eq(column_name) {
if segment.get_real_name().eq(identifier) {
return Some(Selection::Segment(segment.clone()));
}
}

if check_alias {
if let Some(r) = self.aliases.get(column_name) {
if let Some(r) = self.aliases.get(identifier) {
// @todo Resolve without match!
match r {
Selection::Dimension(d) => Some(Selection::Dimension(d.clone())),
Expand Down
270 changes: 141 additions & 129 deletions rust/cubesql/cubesql/src/compile/mod.rs
Expand Up @@ -1287,7 +1287,7 @@ fn compile_select(expr: &ast::Select, ctx: &mut QueryContext) -> CompilationResu
compile_select_expr(expr, ctx, &mut builder, None)?
}
ast::SelectItem::ExprWithAlias { expr, alias } => {
compile_select_expr(expr, ctx, &mut builder, Some(alias.to_string()))?
compile_select_expr(expr, ctx, &mut builder, Some(alias.value.to_string()))?
}
_ => {
return Err(CompilationError::Unsupported(format!(
Expand Down Expand Up @@ -2007,136 +2007,148 @@ mod tests {
}

#[test]
fn test_order_alias_for_dimension_default() {
let query = convert_simple_select(
"SELECT taxful_total_price as total_price FROM KibanaSampleDataEcommerce ORDER BY total_price"
.to_string(),
);

assert_eq!(
query.request,
V1LoadRequestQuery {
measures: Some(vec![]),
segments: Some(vec![]),
dimensions: Some(vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
]),
time_dimensions: None,
order: Some(vec![vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
"asc".to_string(),
]]),
limit: None,
offset: None,
filters: None
}
)
}

#[test]
fn test_order_indentifier_default() {
let query = convert_simple_select(
"SELECT taxful_total_price FROM KibanaSampleDataEcommerce ORDER BY taxful_total_price"
.to_string(),
);

assert_eq!(
query.request,
V1LoadRequestQuery {
measures: Some(vec![]),
segments: Some(vec![]),
dimensions: Some(vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
]),
time_dimensions: None,
order: Some(vec![vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
"asc".to_string(),
]]),
limit: None,
offset: None,
filters: None
}
)
}

#[test]
fn test_order_compound_identifier_default() {
let query = convert_simple_select(
"SELECT taxful_total_price FROM `KibanaSampleDataEcommerce` ORDER BY `KibanaSampleDataEcommerce`.`taxful_total_price`"
.to_string(),
);

assert_eq!(
query.request,
V1LoadRequestQuery {
measures: Some(vec![]),
segments: Some(vec![]),
dimensions: Some(vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
]),
time_dimensions: None,
order: Some(vec![vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
"asc".to_string(),
]]),
limit: None,
offset: None,
filters: None
}
)
}

#[test]
fn test_order_indentifier_asc() {
let query = convert_simple_select(
"SELECT taxful_total_price FROM KibanaSampleDataEcommerce ORDER BY taxful_total_price ASC".to_string(),
);

assert_eq!(
query.request,
V1LoadRequestQuery {
measures: Some(vec![]),
segments: Some(vec![]),
dimensions: Some(vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
]),
time_dimensions: None,
order: Some(vec![vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
"asc".to_string(),
]]),
limit: None,
offset: None,
filters: None
}
)
}
fn test_order_by() {
let supported_orders = vec![
// test_order_alias_for_dimension_default
(
"SELECT taxful_total_price as total_price FROM KibanaSampleDataEcommerce ORDER BY total_price".to_string(),
V1LoadRequestQuery {
measures: Some(vec![]),
segments: Some(vec![]),
dimensions: Some(vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
]),
time_dimensions: None,
order: Some(vec![vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
"asc".to_string(),
]]),
limit: None,
offset: None,
filters: None
}
),
// test_order_indentifier_default
(
"SELECT taxful_total_price FROM KibanaSampleDataEcommerce ORDER BY taxful_total_price".to_string(),
V1LoadRequestQuery {
measures: Some(vec![]),
segments: Some(vec![]),
dimensions: Some(vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
]),
time_dimensions: None,
order: Some(vec![vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
"asc".to_string(),
]]),
limit: None,
offset: None,
filters: None
}
),
// test_order_compound_identifier_default
(
"SELECT taxful_total_price FROM `KibanaSampleDataEcommerce` ORDER BY `KibanaSampleDataEcommerce`.`taxful_total_price`".to_string(),
V1LoadRequestQuery {
measures: Some(vec![]),
segments: Some(vec![]),
dimensions: Some(vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
]),
time_dimensions: None,
order: Some(vec![vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
"asc".to_string(),
]]),
limit: None,
offset: None,
filters: None
}
),
// test_order_indentifier_asc
(
"SELECT taxful_total_price FROM KibanaSampleDataEcommerce ORDER BY taxful_total_price ASC".to_string(),
V1LoadRequestQuery {
measures: Some(vec![]),
segments: Some(vec![]),
dimensions: Some(vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
]),
time_dimensions: None,
order: Some(vec![vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
"asc".to_string(),
]]),
limit: None,
offset: None,
filters: None
}
),
// test_order_indentifier_desc
(
"SELECT taxful_total_price FROM KibanaSampleDataEcommerce ORDER BY taxful_total_price DESC".to_string(),
V1LoadRequestQuery {
measures: Some(vec![]),
segments: Some(vec![]),
dimensions: Some(vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
]),
time_dimensions: None,
order: Some(vec![vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
"desc".to_string(),
]]),
limit: None,
offset: None,
filters: None
}
),
// test_order_identifer_alias_ident_no_escape
(
"SELECT taxful_total_price as alias1 FROM KibanaSampleDataEcommerce ORDER BY alias1 DESC".to_string(),
V1LoadRequestQuery {
measures: Some(vec![]),
segments: Some(vec![]),
dimensions: Some(vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
]),
time_dimensions: None,
order: Some(vec![vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
"desc".to_string(),
]]),
limit: None,
offset: None,
filters: None
}
),
// test_order_identifer_alias_ident_escape
(
"SELECT taxful_total_price as `alias1` FROM KibanaSampleDataEcommerce ORDER BY `alias1` DESC".to_string(),
V1LoadRequestQuery {
measures: Some(vec![]),
segments: Some(vec![]),
dimensions: Some(vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
]),
time_dimensions: None,
order: Some(vec![vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
"desc".to_string(),
]]),
limit: None,
offset: None,
filters: None
}
),
];

#[test]
fn test_order_indentifier_desc() {
let query = convert_simple_select(
"SELECT taxful_total_price FROM KibanaSampleDataEcommerce ORDER BY taxful_total_price DESC".to_string(),
);
for (sql, expected_request) in supported_orders.iter() {
let query = convert_simple_select(sql.to_string());

assert_eq!(
query.request,
V1LoadRequestQuery {
measures: Some(vec![]),
segments: Some(vec![]),
dimensions: Some(vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
]),
time_dimensions: None,
order: Some(vec![vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string(),
"desc".to_string(),
]]),
limit: None,
offset: None,
filters: None
}
)
assert_eq!(&query.request, expected_request)
}
}

#[test]
Expand Down

0 comments on commit 8b2c002

Please sign in to comment.