Skip to content

Commit a64fe45

Browse files
authored
feat(dsabstraction): add initial support for SQL abstractions (#1756)
1 parent 915ec5a commit a64fe45

File tree

8 files changed

+923
-267
lines changed

8 files changed

+923
-267
lines changed

cspell.config.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
"PREWHERE",
6868
"proxying",
6969
"regexes",
70+
"schemads",
7071
"sdkproxy",
7172
"shopspring",
7273
"singlequote",

go.mod

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ require (
77
github.com/docker/docker v28.5.2+incompatible
88
github.com/docker/go-units v0.5.0
99
github.com/grafana/grafana-plugin-sdk-go v0.290.1
10-
github.com/grafana/sqlds/v5 v5.1.0
10+
github.com/grafana/sqlds/v5 v5.1.1
1111
github.com/paulmach/orb v0.12.0
1212
github.com/pkg/errors v0.9.1
1313
github.com/shopspring/decimal v1.4.0
@@ -28,18 +28,29 @@ require (
2828
github.com/containerd/platforms v0.2.1 // indirect
2929
github.com/distribution/reference v0.6.0 // indirect
3030
github.com/ebitengine/purego v0.10.0 // indirect
31+
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
3132
github.com/felixge/httpsnoop v1.0.4 // indirect
3233
github.com/fsnotify/fsnotify v1.6.0 // indirect
34+
github.com/go-openapi/jsonpointer v0.22.4 // indirect
35+
github.com/go-openapi/jsonreference v0.21.4 // indirect
36+
github.com/go-openapi/swag v0.23.0 // indirect
37+
github.com/go-openapi/swag/jsonname v0.25.4 // indirect
3338
github.com/goccy/go-json v0.10.5 // indirect
3439
github.com/gogo/googleapis v1.4.1 // indirect
40+
github.com/google/gnostic-models v0.7.0 // indirect
3541
github.com/grafana/dataplane/sdata v0.0.9 // indirect
3642
github.com/grafana/otel-profiling-go v0.5.1 // indirect
3743
github.com/grafana/pyroscope-go/godeltaprof v0.1.9 // indirect
3844
github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0 // indirect
3945
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 // indirect
46+
github.com/huandu/go-clone v1.7.3 // indirect
47+
github.com/huandu/go-sqlbuilder v1.39.1 // indirect
48+
github.com/huandu/xstrings v1.4.0 // indirect
4049
github.com/jaegertracing/jaeger-idl v0.6.0 // indirect
50+
github.com/josharian/intern v1.0.0 // indirect
4151
github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6 // indirect
4252
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
53+
github.com/mailru/easyjson v0.7.7 // indirect
4354
github.com/moby/docker-image-spec v1.3.1 // indirect
4455
github.com/moby/go-archive v0.2.0 // indirect
4556
github.com/moby/sys/user v0.4.0 // indirect
@@ -59,6 +70,8 @@ require (
5970
golang.org/x/sync v0.20.0 // indirect
6071
golang.org/x/telemetry v0.0.0-20260209163413-e7419c687ee4 // indirect
6172
golang.org/x/time v0.9.0 // indirect
73+
k8s.io/kube-openapi v0.0.0-20260127142750-a19766b6e2d4 // indirect
74+
sigs.k8s.io/randfill v1.0.0 // indirect
6275
)
6376

6477
require (
@@ -88,6 +101,7 @@ require (
88101
github.com/google/flatbuffers v25.12.19+incompatible // indirect
89102
github.com/google/go-cmp v0.7.0 // indirect
90103
github.com/google/uuid v1.6.0 // indirect
104+
github.com/grafana/schemads v0.0.6
91105
github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect
92106
github.com/hashicorp/go-hclog v1.6.3 // indirect
93107
github.com/hashicorp/go-plugin v1.7.0 // indirect

go.sum

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ github.com/ebitengine/purego v0.10.0 h1:QIw4xfpWT6GWTzaW5XEKy3HXoqrJGx1ijYHzTF0/
7272
github.com/ebitengine/purego v0.10.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
7373
github.com/elazarl/goproxy v1.8.3 h1:XhiZpzW0NvsGOqSv/F3v4+1F29842yYaJNN+In5Fnuc=
7474
github.com/elazarl/goproxy v1.8.3/go.mod h1:b5xm6W48AUHNpRTCvlnd0YVh+JafCCtsLsJZvvNTz+E=
75+
github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
76+
github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
7577
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
7678
github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
7779
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
@@ -92,6 +94,16 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
9294
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
9395
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
9496
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
97+
github.com/go-openapi/jsonpointer v0.22.4 h1:dZtK82WlNpVLDW2jlA1YCiVJFVqkED1MegOUy9kR5T4=
98+
github.com/go-openapi/jsonpointer v0.22.4/go.mod h1:elX9+UgznpFhgBuaMQ7iu4lvvX1nvNsesQ3oxmYTw80=
99+
github.com/go-openapi/jsonreference v0.21.4 h1:24qaE2y9bx/q3uRK/qN+TDwbok1NhbSmGjjySRCHtC8=
100+
github.com/go-openapi/jsonreference v0.21.4/go.mod h1:rIENPTjDbLpzQmQWCj5kKj3ZlmEh+EFVbz3RTUh30/4=
101+
github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
102+
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
103+
github.com/go-openapi/swag/jsonname v0.25.4 h1:bZH0+MsS03MbnwBXYhuTttMOqk+5KcQ9869Vye1bNHI=
104+
github.com/go-openapi/swag/jsonname v0.25.4/go.mod h1:GPVEk9CWVhNvWhZgrnvRA6utbAltopbKwDu8mXNUMag=
105+
github.com/go-openapi/testify/v2 v2.0.2 h1:X999g3jeLcoY8qctY/c/Z8iBHTbwLz7R2WXd6Ub6wls=
106+
github.com/go-openapi/testify/v2 v2.0.2/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54=
95107
github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=
96108
github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
97109
github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
@@ -108,6 +120,8 @@ github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs=
108120
github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
109121
github.com/google/flatbuffers v25.12.19+incompatible h1:haMV2JRRJCe1998HeW/p0X9UaMTK6SDo0ffLn2+DbLs=
110122
github.com/google/flatbuffers v25.12.19+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
123+
github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo=
124+
github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ=
111125
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
112126
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
113127
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
@@ -128,8 +142,10 @@ github.com/grafana/otel-profiling-go v0.5.1 h1:stVPKAFZSa7eGiqbYuG25VcqYksR6iWvF
128142
github.com/grafana/otel-profiling-go v0.5.1/go.mod h1:ftN/t5A/4gQI19/8MoWurBEtC6gFw8Dns1sJZ9W4Tls=
129143
github.com/grafana/pyroscope-go/godeltaprof v0.1.9 h1:c1Us8i6eSmkW+Ez05d3co8kasnuOY813tbMN8i/a3Og=
130144
github.com/grafana/pyroscope-go/godeltaprof v0.1.9/go.mod h1:2+l7K7twW49Ct4wFluZD3tZ6e0SjanjcUUBPVD/UuGU=
131-
github.com/grafana/sqlds/v5 v5.1.0 h1:vXUtUqYn7vxP2lHk+m1DbDUtHFNGSgSLq8wDhxcOGrA=
132-
github.com/grafana/sqlds/v5 v5.1.0/go.mod h1:Pe2mNigQjaC+hF8xF4gZdBAsxeg7u1ya/t/V9vMrawE=
145+
github.com/grafana/schemads v0.0.6 h1:Pz0fClDO0wfzb0THzgM8pyxVycbEa7b0ARS7YxfZ4RU=
146+
github.com/grafana/schemads v0.0.6/go.mod h1:4BnVcbwJT6xqyge9nB0GFbfzc6Aw3RzXD5TaZIOnPqY=
147+
github.com/grafana/sqlds/v5 v5.1.1 h1:QEZayyzZZZjDnfMX/f5k7oLehOBH7X1MMnpgn+yDkkI=
148+
github.com/grafana/sqlds/v5 v5.1.1/go.mod h1:fUt31TRrHrBZ6lyaHZyDqSfeouuSXV6PeBgrNFuZVmo=
133149
github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0 h1:QGLs/O40yoNK9vmy4rhUGBVyMf1lISBGtXRpsu/Qu/o=
134150
github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0/go.mod h1:hM2alZsMUni80N33RBe6J0e423LB+odMj7d3EMP9l20=
135151
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 h1:B+8ClL/kCQkRiU82d9xajRPKYMrB7E0MbtzWVi1K4ns=
@@ -142,10 +158,21 @@ github.com/hashicorp/go-plugin v1.7.0 h1:YghfQH/0QmPNc/AZMTFE3ac8fipZyZECHdDPshf
142158
github.com/hashicorp/go-plugin v1.7.0/go.mod h1:BExt6KEaIYx804z8k4gRzRLEvxKVb+kn0NMcihqOqb8=
143159
github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8=
144160
github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns=
161+
github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U=
162+
github.com/huandu/go-assert v1.1.6 h1:oaAfYxq9KNDi9qswn/6aE0EydfxSa+tWZC1KabNitYs=
163+
github.com/huandu/go-assert v1.1.6/go.mod h1:JuIfbmYG9ykwvuxoJ3V8TB5QP+3+ajIA54Y44TmkMxs=
164+
github.com/huandu/go-clone v1.7.3 h1:rtQODA+ABThEn6J5LBTppJfKmZy/FwfpMUWa8d01TTQ=
165+
github.com/huandu/go-clone v1.7.3/go.mod h1:ReGivhG6op3GYr+UY3lS6mxjKp7MIGTknuU5TbTVaXE=
166+
github.com/huandu/go-sqlbuilder v1.39.1 h1:uUaj41yLNTQBe7ojNF6Im1RPbHCN4zCjMRySTEC2ooI=
167+
github.com/huandu/go-sqlbuilder v1.39.1/go.mod h1:zdONH67liL+/TvoUMwnZP/sUYGSSvHh9psLe/HpXn8E=
168+
github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU=
169+
github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
145170
github.com/jaegertracing/jaeger-idl v0.6.0 h1:LOVQfVby9ywdMPI9n3hMwKbyLVV3BL1XH2QqsP5KTMk=
146171
github.com/jaegertracing/jaeger-idl v0.6.0/go.mod h1:mpW0lZfG907/+o5w5OlnNnig7nHJGT3SfKmRqC42HGQ=
147172
github.com/jhump/protoreflect v1.17.0 h1:qOEr613fac2lOuTgWN4tPAtLL7fUSbuJL5X5XumQh94=
148173
github.com/jhump/protoreflect v1.17.0/go.mod h1:h9+vUUL38jiBzck8ck+6G/aeMX8Z4QUY/NiJPwPNi+8=
174+
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
175+
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
149176
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
150177
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
151178
github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6 h1:SwcnSwBR7X/5EHJQlXBockkJVIMRVt5yKaesBPMtyZQ=
@@ -177,6 +204,8 @@ github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg=
177204
github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A=
178205
github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE=
179206
github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
207+
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
208+
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
180209
github.com/mattetti/filebuffer v1.0.1 h1:gG7pyfnSIZCxdoKq+cPa8T0hhYtD9NxCdI4D7PTjRLM=
181210
github.com/mattetti/filebuffer v1.0.1/go.mod h1:YdMURNDOttIiruleeVr6f56OrMc+MydEnTcXwtkxNVs=
182211
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
@@ -295,6 +324,7 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE
295324
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
296325
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
297326
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
327+
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
298328
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
299329
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
300330
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
@@ -474,3 +504,11 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
474504
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
475505
gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q=
476506
gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA=
507+
k8s.io/kube-openapi v0.0.0-20260127142750-a19766b6e2d4 h1:HhDfevmPS+OalTjQRKbTHppRIz01AWi8s45TMXStgYY=
508+
k8s.io/kube-openapi v0.0.0-20260127142750-a19766b6e2d4/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ=
509+
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A=
510+
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
511+
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
512+
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
513+
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
514+
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"author": "Grafana Labs",
2727
"license": "Apache-2.0",
2828
"devDependencies": {
29+
"@axe-core/playwright": "^4.11.1",
2930
"@babel/core": "^7.29.0",
3031
"@grafana/eslint-config": "^8.2.0",
3132
"@grafana/plugin-e2e": "^3.3.0",

pkg/plugin/datasource.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55

66
"github.com/grafana/grafana-plugin-sdk-go/backend"
77
"github.com/grafana/grafana-plugin-sdk-go/backend/instancemgmt"
8+
schemas "github.com/grafana/schemads"
89
"github.com/grafana/sqlds/v5"
910
)
1011

@@ -15,5 +16,18 @@ func NewDatasource(ctx context.Context, settings backend.DataSourceInstanceSetti
1516
if pluginSettings.ForwardHeaders {
1617
ds.EnableMultipleConnections = true
1718
}
19+
20+
schemaProvider := NewSchemaProvider(&clickhousePlugin, settings)
21+
ds.ResourceMiddleware = func(next backend.CallResourceHandler) backend.CallResourceHandler {
22+
return schemas.NewSchemaDatasource(
23+
schemaProvider,
24+
schemaProvider,
25+
schemaProvider,
26+
nil, // no table parameter values handler
27+
schemaProvider,
28+
next,
29+
)
30+
}
31+
1832
return ds.NewDatasource(ctx, settings)
1933
}

pkg/plugin/driver.go

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/grafana/grafana-plugin-sdk-go/build/buildinfo"
2424
"github.com/grafana/grafana-plugin-sdk-go/data"
2525
"github.com/grafana/grafana-plugin-sdk-go/data/sqlutil"
26+
schemas "github.com/grafana/schemads"
2627
"github.com/grafana/sqlds/v5"
2728
"github.com/pkg/errors"
2829
"go.opentelemetry.io/otel/attribute"
@@ -31,7 +32,9 @@ import (
3132
)
3233

3334
// Clickhouse defines how to connect to a Clickhouse datasource
34-
type Clickhouse struct{}
35+
type Clickhouse struct {
36+
SchemaDatasource *schemas.SchemaDatasource
37+
}
3538

3639
// getTLSConfig returns tlsConfig from settings
3740
// logic reused from https://github.com/grafana/grafana/blob/615c153b3a2e4d80cff263e67424af6edb992211/pkg/models/datasource_cache.go#L211
@@ -351,6 +354,60 @@ func (h *Clickhouse) Settings(ctx context.Context, config backend.DataSourceInst
351354
}
352355
}
353356

357+
func (h *Clickhouse) MutateQueryData(ctx context.Context, req *backend.QueryDataRequest) (context.Context, *backend.QueryDataRequest) {
358+
req = preprocessGrafanaSQL(req)
359+
return ctx, req
360+
}
361+
362+
func preprocessGrafanaSQL(req *backend.QueryDataRequest) *backend.QueryDataRequest {
363+
if req == nil || len(req.Queries) == 0 {
364+
return req
365+
}
366+
367+
queries := make([]backend.DataQuery, 0, len(req.Queries))
368+
for _, q := range req.Queries {
369+
var sq schemas.Query
370+
371+
if err := json.Unmarshal(q.JSON, &sq); err != nil {
372+
// Cannot unmarshal query JSON, ignoring
373+
queries = append(queries, q)
374+
continue
375+
}
376+
377+
if !sq.GrafanaSql {
378+
// Not a Grafana SQL query, ignoring
379+
queries = append(queries, q)
380+
continue
381+
}
382+
383+
sqlQuery, err := sq.ToSQL(schemas.DialectClickHouse)
384+
if err != nil {
385+
backend.Logger.Error("Failed to build SQL query", "error", err.Error())
386+
continue
387+
}
388+
389+
// Build JSON with `sqlutil.Query` shape that will be used to execute the query by sqlds
390+
queryJSON, err := json.Marshal(sqlutil.Query{
391+
RawSQL: sqlQuery,
392+
Format: sqlutil.FormatOptionTable, // TODO: Is this correct?
393+
ConnectionArgs: json.RawMessage("{}"),
394+
})
395+
if err != nil {
396+
backend.Logger.Error("Failed to marshal SQL query", "error", err.Error())
397+
continue
398+
}
399+
400+
q.JSON = queryJSON
401+
queries = append(queries, q)
402+
}
403+
404+
return &backend.QueryDataRequest{
405+
PluginContext: req.PluginContext,
406+
Headers: req.Headers,
407+
Queries: queries,
408+
}
409+
}
410+
354411
func (h *Clickhouse) MutateQuery(ctx context.Context, req backend.DataQuery) (context.Context, backend.DataQuery) {
355412
ctx, span := tracing.DefaultTracer().Start(ctx, "clickhouse mutate_query", trace.WithAttributes(
356413
attribute.String("db.system", "clickhouse"),

0 commit comments

Comments
 (0)