Skip to main content

sql_fun_server_api/
analyze_query.rs

1use std::path::PathBuf;
2
3use url::Url;
4
5use crate::{
6    AnalysisProbrem, Collection, ContextHandle, Nullability, ObjectKind, ObjectSummary, TextSpan,
7    TypeReference,
8};
9
10/// SQL file input source
11#[derive(serde::Serialize, serde::Deserialize)]
12pub enum AnalyzeQueryInput {
13    /// actual text
14    Text(String),
15    /// local file
16    File(PathBuf),
17    /// remote file
18    Url(Url),
19}
20
21/// [`SqlFunServerApi::analyze_query`] request arguments
22#[derive(serde::Serialize, serde::Deserialize)]
23pub struct AnalyzeQueryArgs {
24    /// specify semantic analysis context
25    context_handle: ContextHandle,
26    /// Query input source
27    query: AnalyzeQueryInput,
28}
29
30/// response for [`SqlFunServerApi::analyze_query`]
31#[derive(serde::Serialize, serde::Deserialize, derive_getters::Getters)]
32pub struct AnalyzeQueryResponse {
33    queries: Collection<AnalyzeQueryItem>,
34}
35
36/// kind of semantic analyzed query
37#[derive(serde::Serialize, serde::Deserialize)]
38pub enum QueryKind {
39    /// select statement
40    Select,
41    /// insert statement
42    Insert,
43    /// update statement
44    Update,
45    /// delete statement
46    Delete,
47    /// truncate statement
48    Truncate,
49}
50
51/// analyzed single query
52#[derive(serde::Serialize, serde::Deserialize, derive_getters::Getters)]
53pub struct AnalyzeQueryItem {
54    /// query span in input
55    query_span: TextSpan,
56
57    /// query statement kind
58    query_kind: QueryKind,
59
60    /// semantic probrems
61    probrems: Collection<AnalysisProbrem>,
62
63    /// query accessing relations
64    accessing_relations: Collection<ObjectSummary>,
65
66    /// column access collection
67    column_access: Collection<ColumnAccess>,
68
69    /// query parameters
70    parameters: Collection<ParameterDescribe>,
71
72    /// query result sets
73    result_columns: Collection<ResultSetColumn>,
74}
75
76/// parameter spec
77#[derive(serde::Serialize, serde::Deserialize, derive_getters::Getters)]
78pub struct ParameterDescribe {
79    /// name for parameter
80    name: String,
81    /// parameter usage in SQL text
82    spans: Vec<TextSpan>,
83    /// type candiates for this parameter
84    type_candiate: Vec<TypeReference>,
85    /// parameter nullability
86    nullability: Nullability,
87}
88
89/// column access kind
90#[derive(serde::Serialize, serde::Deserialize)]
91pub enum ColumnAccessKind {
92    /// Column accessed in select statement column list.
93    SelectResTarget,
94
95    /// Column accessed in select statement from clause
96    SelectFrom,
97
98    /// Column accessed in select statement where clause.
99    SelectWhere,
100
101    /// column accessed in select statement order by clause
102    SelectOrderBy,
103
104    /// column accessed in select statement group by clause
105    SelectGroupBy,
106
107    /// column accessed in select statement having clause
108    SelectHaving,
109
110    /// column accessed in update statement set left value
111    UpdateSet,
112
113    /// column accessed in update statement set right value
114    UpdateSetValue,
115
116    /// column accessed in update statement from clause
117    UpdateFrom,
118
119    /// column accessed in update statement where clause
120    UpdateWhere,
121
122    /// column accessed in insert statement
123    InsertInto,
124
125    /// column accessed in delete statement
126    Delete,
127}
128
129/// column access
130#[derive(serde::Serialize, serde::Deserialize, derive_getters::Getters)]
131pub struct ColumnAccess {
132    /// accessing span
133    accessing_span: TextSpan,
134
135    /// relation schema name
136    relation_schema: String,
137
138    /// relation local name
139    relation_local_name: String,
140
141    /// relation kind
142    relation_kind: ObjectKind,
143
144    /// column name
145    column_name: String,
146
147    /// column ordinal in relation
148    column_ordinal: usize,
149
150    /// kind of column access
151    access_kind: ColumnAccessKind,
152}
153
154/// result set column description item
155#[derive(serde::Serialize, serde::Deserialize, derive_getters::Getters)]
156pub struct ResultSetColumn {
157    /// column ordinal
158    ordinal: u32,
159    /// column name
160    name: String,
161    /// column type
162    column_type: Option<TypeReference>,
163    /// nullability
164    nullability: Nullability,
165}