14
14
15
15
use std:: sync:: Arc ;
16
16
17
+ use databend_common_catalog:: session_type:: SessionType ;
18
+ use databend_common_catalog:: table:: DistributionLevel ;
17
19
use databend_common_catalog:: table:: Table ;
18
20
use databend_common_catalog:: table_context:: TableContext ;
19
21
use databend_common_exception:: Result ;
20
22
use databend_common_expression:: types:: BooleanType ;
23
+ use databend_common_expression:: types:: DataType ;
21
24
use databend_common_expression:: types:: NumberDataType ;
22
25
use databend_common_expression:: types:: StringType ;
26
+ use databend_common_expression:: types:: TimestampType ;
23
27
use databend_common_expression:: types:: UInt64Type ;
24
28
use databend_common_expression:: DataBlock ;
25
29
use databend_common_expression:: FromData ;
30
+ use databend_common_expression:: Scalar ;
26
31
use databend_common_expression:: TableDataType ;
27
32
use databend_common_expression:: TableField ;
28
33
use databend_common_expression:: TableSchemaRefExt ;
@@ -33,6 +38,7 @@ use databend_common_storages_system::SyncOneBlockSystemTable;
33
38
use databend_common_storages_system:: SyncSystemTable ;
34
39
35
40
use crate :: servers:: http:: v1:: ClientSessionManager ;
41
+ use crate :: sessions:: SessionManager ;
36
42
37
43
pub struct TemporaryTablesTable {
38
44
table_info : TableInfo ,
@@ -41,26 +47,62 @@ pub struct TemporaryTablesTable {
41
47
impl SyncSystemTable for TemporaryTablesTable {
42
48
const NAME : & ' static str = "system.temporary_tables" ;
43
49
50
+ const DISTRIBUTION_LEVEL : DistributionLevel = DistributionLevel :: Cluster ;
51
+
44
52
fn get_table_info ( & self ) -> & TableInfo {
45
53
& self . table_info
46
54
}
47
55
48
56
fn get_full_data ( & self , ctx : Arc < dyn TableContext > ) -> Result < DataBlock > {
57
+ let node_id = ctx. get_cluster ( ) . local_id . clone ( ) ;
58
+
49
59
let mut dbs = Vec :: new ( ) ;
50
60
let mut names = Vec :: new ( ) ;
51
61
let mut table_ids = Vec :: new ( ) ;
52
62
let mut engines = Vec :: new ( ) ;
53
63
let mut users = Vec :: new ( ) ;
54
64
let mut session_ids = Vec :: new ( ) ;
65
+ let mut session_types = Vec :: new ( ) ;
55
66
let mut is_current_sessions = Vec :: new ( ) ;
67
+ let mut created_ons = Vec :: new ( ) ;
68
+ let mut updated_ons = Vec :: new ( ) ;
69
+ let mut compressed_data_bytes_col = Vec :: new ( ) ;
70
+ let mut index_bytes_col = Vec :: new ( ) ;
71
+ let mut number_of_rows_col = Vec :: new ( ) ;
72
+ let mut number_of_blocks_col = Vec :: new ( ) ;
73
+ let mut number_of_segments_col = Vec :: new ( ) ;
74
+
75
+ let mysql_temp_tables = {
76
+ let session_manager = SessionManager :: instance ( ) ;
77
+ session_manager
78
+ . get_all_temp_tables ( ) ?
79
+ . into_iter ( )
80
+ . filter ( |( _, typ, _) | typ == & SessionType :: MySQL )
81
+ . collect :: < Vec < _ > > ( )
82
+ } ;
83
+
84
+ let http_client_temp_tables = {
85
+ let client_session_manager = ClientSessionManager :: instance ( ) ;
86
+ client_session_manager
87
+ . get_all_temp_tables ( ) ?
88
+ . into_iter ( )
89
+ . map ( |( session_key, table) | ( session_key, SessionType :: HTTPQuery , table) )
90
+ . collect :: < Vec < _ > > ( )
91
+ } ;
92
+
93
+ let all_temp_tables = mysql_temp_tables
94
+ . into_iter ( )
95
+ . chain ( http_client_temp_tables)
96
+ . collect :: < Vec < _ > > ( ) ;
56
97
57
- let client_session_manager = ClientSessionManager :: instance ( ) ;
58
- let all_temp_tables = client_session_manager. get_all_temp_tables ( ) ?;
98
+ let current_session_type = ctx. get_session_type ( ) ;
59
99
60
- let current_session_id = ctx. get_current_client_session_id ( ) ;
61
- log:: info!( "current_session_id: {:?}" , current_session_id) ;
100
+ // currently http clients have their own client side session ids, besides server side session ids
101
+ let current_client_session_id = ctx. get_current_client_session_id ( ) ;
102
+ let current_session_id = ctx. get_current_session_id ( ) ;
103
+ log:: info!( "current_client_session_id: {:?}" , current_client_session_id) ;
62
104
63
- for ( session_key, table) in all_temp_tables {
105
+ for ( session_key, typ , table) in all_temp_tables {
64
106
log:: info!( "session_key: {:?}" , session_key) ;
65
107
let desc = table. desc ;
66
108
let db_name = desc
@@ -77,28 +119,55 @@ impl SyncSystemTable for TemporaryTablesTable {
77
119
78
120
let user = session_key. split ( '/' ) . next ( ) . unwrap ( ) . to_string ( ) ;
79
121
let session_id = session_key. split ( '/' ) . nth ( 1 ) . unwrap ( ) . to_string ( ) ;
80
- let is_current_session = current_session_id
81
- . as_ref ( )
82
- . map ( |id| id == & session_id)
83
- . unwrap_or ( false ) ;
122
+ let is_current_session = {
123
+ if current_session_type == SessionType :: HTTPQuery {
124
+ current_client_session_id
125
+ . as_ref ( )
126
+ . map ( |id| id == & session_id)
127
+ . unwrap_or ( false )
128
+ } else {
129
+ current_session_id == session_id
130
+ }
131
+ } ;
132
+
133
+ let meta = table. meta ;
84
134
dbs. push ( db_name. to_string ( ) ) ;
85
135
names. push ( table. name ) ;
86
136
table_ids. push ( table. ident . table_id ) ;
87
- engines. push ( table . meta . engine ) ;
137
+ engines. push ( meta. engine ) ;
88
138
users. push ( user) ;
89
139
session_ids. push ( session_id) ;
140
+ session_types. push ( typ. to_string ( ) ) ;
90
141
is_current_sessions. push ( is_current_session) ;
142
+ created_ons. push ( meta. created_on . timestamp_micros ( ) ) ;
143
+ updated_ons. push ( meta. updated_on . timestamp_micros ( ) ) ;
144
+ compressed_data_bytes_col. push ( meta. statistics . compressed_data_bytes ) ;
145
+ index_bytes_col. push ( meta. statistics . index_data_bytes ) ;
146
+ number_of_rows_col. push ( meta. statistics . number_of_rows ) ;
147
+ number_of_segments_col. push ( meta. statistics . number_of_segments ) ;
148
+ number_of_blocks_col. push ( meta. statistics . number_of_blocks ) ;
91
149
}
92
150
93
- Ok ( DataBlock :: new_from_columns ( vec ! [
151
+ let mut block = DataBlock :: new_from_columns ( vec ! [
94
152
StringType :: from_data( dbs) ,
95
153
StringType :: from_data( names) ,
96
154
UInt64Type :: from_data( table_ids) ,
97
155
StringType :: from_data( engines) ,
98
156
StringType :: from_data( users) ,
99
157
StringType :: from_data( session_ids) ,
158
+ StringType :: from_data( session_types) ,
100
159
BooleanType :: from_data( is_current_sessions) ,
101
- ] ) )
160
+ TimestampType :: from_data( created_ons) ,
161
+ TimestampType :: from_data( updated_ons) ,
162
+ UInt64Type :: from_data( compressed_data_bytes_col) ,
163
+ UInt64Type :: from_data( index_bytes_col) ,
164
+ UInt64Type :: from_data( number_of_rows_col) ,
165
+ UInt64Type :: from_opt_data( number_of_segments_col) ,
166
+ UInt64Type :: from_opt_data( number_of_blocks_col) ,
167
+ ] ) ;
168
+
169
+ block. add_const_column ( Scalar :: String ( node_id) , DataType :: String ) ;
170
+ Ok ( block)
102
171
}
103
172
}
104
173
@@ -111,7 +180,28 @@ impl TemporaryTablesTable {
111
180
TableField :: new( "engine" , TableDataType :: String ) ,
112
181
TableField :: new( "user" , TableDataType :: String ) ,
113
182
TableField :: new( "session_id" , TableDataType :: String ) ,
183
+ TableField :: new( "session_type" , TableDataType :: String ) ,
114
184
TableField :: new( "is_current_session" , TableDataType :: Boolean ) ,
185
+ TableField :: new( "created_on" , TableDataType :: Timestamp ) ,
186
+ TableField :: new( "updated_on" , TableDataType :: Timestamp ) ,
187
+ TableField :: new(
188
+ "compressed_data_bytes" ,
189
+ TableDataType :: Number ( NumberDataType :: UInt64 ) ,
190
+ ) ,
191
+ TableField :: new(
192
+ "index_data_bytes" ,
193
+ TableDataType :: Number ( NumberDataType :: UInt64 ) ,
194
+ ) ,
195
+ TableField :: new( "num_rows" , TableDataType :: Number ( NumberDataType :: UInt64 ) ) ,
196
+ TableField :: new(
197
+ "num_segments" ,
198
+ TableDataType :: Nullable ( Box :: new( TableDataType :: Number ( NumberDataType :: UInt64 ) ) ) ,
199
+ ) ,
200
+ TableField :: new(
201
+ "num_blocks" ,
202
+ TableDataType :: Nullable ( Box :: new( TableDataType :: Number ( NumberDataType :: UInt64 ) ) ) ,
203
+ ) ,
204
+ TableField :: new( "node" , TableDataType :: String ) ,
115
205
] ) ;
116
206
let table_info = TableInfo {
117
207
ident : TableIdent :: new ( table_id, 0 ) ,
0 commit comments