Allow any valid SQL query to be used as a table in a s-string

Đang mở
#5,282 0 bình luận 1 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 3 ngày

Chưa có ai nhận issue này.

Đánh giá

Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức phù hợp với người mới
38/100
Loại issue
Tính năng
Độ rõ ràng
Khá rõ ràng
Mức độ hoạt động
Đình trệ
Công nghệ
rust, sql
Lĩnh vực
backend, databases

Hướng nghiên cứu

The issue points to the s-string handling in prqlc/prqlc/src/sql/gen_query.rs, around line 508. Read that code and its related tests to see how table s-strings are validated and emitted, especially the current requirement that they start with SELECT . Done means a valid SQL query, including one beginning with a CTE, can be used as a table in an s-string while existing cases remain covered.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

I was wondering if there would be an easy way to allow any valid SQL query to be used as table.

Our use case it the following: We receive a source SQL query, and its content is out of our control. We then generate a PRQL pipeline applying to this query, compile it to SQL, and execute it on a target database. We have no control over the source query, and some of them can be pretty complex, and can include CTEs. An example would be

WITH Base AS (SELECT c.company_id, cc.name AS company_name, [...] a.value::JSONB AS json_data FROM sometable AS c LEFT JOIN other_table AS cc ON cc.foo = c.baz LEFT JOIN fizz AS s ON s.wee = c.woo LEFT JOIN  CROSS JOIN LATERAL (SELECT EXTRACT(YEAR FROM d.d)::INTEGER AS blah FROM generate_series(date_trunc('year', a.start_date), date_trunc('year', a.end_date), INTERVAL '1 year'), other_cte AS ([...]) SELECT * FROM other_cte

Right now, this results in an error with s-strings representing a table must start with SELECT `, which seems to originate in https://github.com/PRQL/prql/blob/main/prqlc/prqlc/src/sql/gen_query.rs#L508 .

Would there be an easy way to allow such a query to be used in an s-string in a from statement ?

from (s""" <complex_sql_query_here> """) | select {this.a, this.b, this.c}

For now, I see an escape hatch, but it seems quite hacky:

  1. Instead of the real SQL query, use a magic value accepted by prql, so you get a prql query like from (s""" SELECT __MY_MAGIC_VALUE__ """) | select {this.a, this.b, this.c}
  2. Compile to SQL
  3. Replace SELECT __MY_MAGIC_VALUE__ with the actual sql query in the compiled SQL
  4. Validate and format the final string with sqlparser

Thank you for your help and your work on prql!

Ngôn ngữ chính
Rust
Star
10.9k
Fork
261
Merge trung bình
3 ngày 20 giờ
Pull request đã merge (30 ngày)
85

Chuẩn bị môi trường

Mở trong Codespaces

Khởi chạy dev container của dự án ngay trên trình duyệt, bằng tài khoản GitHub của bạn.

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của PRQL/prql

Tất cả issue của PRQL/prql

Issue tương tự

Thêm issue về Rust

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.