From 457a6c0a624850c5a5bb398805b0676a69a9f72b Mon Sep 17 00:00:00 2001 From: rick Date: Wed, 19 Mar 2025 02:22:23 +0000 Subject: [PATCH 1/4] feat: support to get sql explain data info --- go.mod | 2 +- go.sum | 2 ++ pkg/data_query.go | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index a323021..e6502b0 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.22.4 toolchain go1.22.6 require ( - github.com/linuxsuren/api-testing v0.0.19-0.20250312132236-e3e7357d6687 + github.com/linuxsuren/api-testing v0.0.20-0.20250319020913-f5f9383e2948 github.com/spf13/cobra v1.8.1 github.com/stretchr/testify v1.9.0 github.com/taosdata/driver-go/v3 v3.6.0 diff --git a/go.sum b/go.sum index ab4b994..051cde2 100644 --- a/go.sum +++ b/go.sum @@ -138,6 +138,8 @@ github.com/linuxsuren/api-testing v0.0.19-0.20250310093028-dd08c128ca0e h1:3dVXB github.com/linuxsuren/api-testing v0.0.19-0.20250310093028-dd08c128ca0e/go.mod h1:igcyUJb5Q463tMpdEJxgURLLPR2pTcV7HoRyuvyP/2Y= github.com/linuxsuren/api-testing v0.0.19-0.20250312132236-e3e7357d6687 h1:AFF1vWQbxOCqEENxK5F2va3d4Xmu5wK9tl2zZfUgHdY= github.com/linuxsuren/api-testing v0.0.19-0.20250312132236-e3e7357d6687/go.mod h1:igcyUJb5Q463tMpdEJxgURLLPR2pTcV7HoRyuvyP/2Y= +github.com/linuxsuren/api-testing v0.0.20-0.20250319020913-f5f9383e2948 h1:YOyqT+9GQsAhRJ0nfqkFMtFJufAS3X/nKmxs25iPUss= +github.com/linuxsuren/api-testing v0.0.20-0.20250319020913-f5f9383e2948/go.mod h1:igcyUJb5Q463tMpdEJxgURLLPR2pTcV7HoRyuvyP/2Y= github.com/linuxsuren/go-fake-runtime v0.0.4 h1:y+tvBuw6MKTCav8Bo5HWwaXhBx1Z//VAvqI3gpOWqvw= github.com/linuxsuren/go-fake-runtime v0.0.4/go.mod h1:zmh6J78hSnWZo68faMA2eKOdaEp8eFbERHi3ZB9xHCQ= github.com/linuxsuren/go-service v0.0.0-20231225060426-efabcd3a5161 h1:dSL/ah6zaRGqH3FW0ogtMjP6xCFXX5NsgWJTaNIofI4= diff --git a/pkg/data_query.go b/pkg/data_query.go index 01cedb4..787c473 100644 --- a/pkg/data_query.go +++ b/pkg/data_query.go @@ -64,6 +64,8 @@ func (s *dbserver) Query(ctx context.Context, query *server.DataQuery) (result * return } + result.Meta.Labels = dbQuery.GetLabels(ctx, query.Sql) + var dataResult *server.DataQueryResult now := time.Now() if dataResult, err = sqlQuery(ctx, query.Sql, db); err == nil { @@ -166,6 +168,7 @@ type DataQuery interface { GetDatabases(context.Context) (databases []string, err error) GetTables(ctx context.Context, currentDatabase string) (tables []string, err error) GetCurrentDatabase() (string, error) + GetLabels(context.Context, string) map[string]string GetClient() *gorm.DB } @@ -236,6 +239,7 @@ func (q *commonDataQuery) GetTables(ctx context.Context, currentDatabase string) } return } + func (q *commonDataQuery) GetCurrentDatabase() (current string, err error) { var row *sql.Row if row = q.db.Raw(q.currentDatabase).Row(); row != nil { @@ -244,6 +248,21 @@ func (q *commonDataQuery) GetCurrentDatabase() (current string, err error) { return } +func (q *commonDataQuery) GetLabels(ctx context.Context, sql string) (metadata map[string]string) { + if databaseResult, err := sqlQuery(ctx, fmt.Sprintf("explain %s", sql), q.db); err == nil { + if len(databaseResult.Items) != 1 { + metadata = make(map[string]string) + for _, data := range databaseResult.Items[0].Data { + switch data.Key { + case "type": + metadata["sql_type"] = data.Value + } + } + } + } + return +} + func (q *commonDataQuery) GetClient() *gorm.DB { return q.db } From 6b399a525e3dbf61f02f56598b17a968ab7cf5dd Mon Sep 17 00:00:00 2001 From: Rick Date: Sun, 23 Mar 2025 14:16:55 +0800 Subject: [PATCH 2/4] add inner sql support to remove dialect --- pkg/data_query.go | 25 +++++++++------- pkg/inner_sql.go | 75 +++++++++++++++++++++++++++++++++++++++++++++++ pkg/server.go | 8 +---- 3 files changed, 91 insertions(+), 17 deletions(-) create mode 100644 pkg/inner_sql.go diff --git a/pkg/data_query.go b/pkg/data_query.go index 787c473..98e3784 100644 --- a/pkg/data_query.go +++ b/pkg/data_query.go @@ -64,6 +64,7 @@ func (s *dbserver) Query(ctx context.Context, query *server.DataQuery) (result * return } + query.Sql = dbQuery.GetInnerSQL().ToNativeSQL(query.Sql) result.Meta.Labels = dbQuery.GetLabels(ctx, query.Sql) var dataResult *server.DataQueryResult @@ -170,27 +171,27 @@ type DataQuery interface { GetCurrentDatabase() (string, error) GetLabels(context.Context, string) map[string]string GetClient() *gorm.DB + GetInnerSQL() InnerSQL } type commonDataQuery struct { - showDatabases, showTables, currentDatabase string - db *gorm.DB + showTables string + db *gorm.DB + innerSQL InnerSQL } var _ DataQuery = &commonDataQuery{} -func NewCommonDataQuery(showDatabases, showTables, currentDatabase string, db *gorm.DB) DataQuery { +func NewCommonDataQuery(innerSQL InnerSQL, db *gorm.DB) DataQuery { return &commonDataQuery{ - showDatabases: showDatabases, - showTables: showTables, - currentDatabase: currentDatabase, - db: db, + innerSQL: innerSQL, + db: db, } } func (q *commonDataQuery) GetDatabases(ctx context.Context) (databases []string, err error) { var databaseResult *server.DataQueryResult - if databaseResult, err = sqlQuery(ctx, q.showDatabases, q.db); err == nil { + if databaseResult, err = sqlQuery(ctx, q.GetInnerSQL().ToNativeSQL(innerShowDatabases), q.db); err == nil { for _, table := range databaseResult.Items { for _, item := range table.GetData() { if item.Key == "Database" || item.Key == "name" { @@ -212,7 +213,7 @@ func (q *commonDataQuery) GetDatabases(ctx context.Context) (databases []string, } func (q *commonDataQuery) GetTables(ctx context.Context, currentDatabase string) (tables []string, err error) { - showTables := q.showTables + showTables := q.GetInnerSQL().ToNativeSQL(innerShowTables) if strings.Contains(showTables, "%s") { showTables = fmt.Sprintf(showTables, currentDatabase) } @@ -242,7 +243,7 @@ func (q *commonDataQuery) GetTables(ctx context.Context, currentDatabase string) func (q *commonDataQuery) GetCurrentDatabase() (current string, err error) { var row *sql.Row - if row = q.db.Raw(q.currentDatabase).Row(); row != nil { + if row = q.db.Raw(q.GetInnerSQL().ToNativeSQL(innerCurrentDB)).Row(); row != nil { err = row.Scan(¤t) } return @@ -266,3 +267,7 @@ func (q *commonDataQuery) GetLabels(ctx context.Context, sql string) (metadata m func (q *commonDataQuery) GetClient() *gorm.DB { return q.db } + +func (q *commonDataQuery) GetInnerSQL() InnerSQL { + return q.innerSQL +} diff --git a/pkg/inner_sql.go b/pkg/inner_sql.go new file mode 100644 index 0000000..0876775 --- /dev/null +++ b/pkg/inner_sql.go @@ -0,0 +1,75 @@ +/* +Copyright 2025 API Testing Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package pkg + +import "strings" + +type InnerSQL interface { + ToNativeSQL(query string) string +} + +const ( + innerSelectTable_ = "@selectTable_" + innerShowDatabases = "@showDatabases" + innerShowTables = "@showTables" + innerCurrentDB = "@currentDB" +) + +func GetInnerSQL(dialect string) InnerSQL { + switch dialect { + case "postgres": + return &postgresDialect{} + default: + return &mysqlDialect{} + } +} + +type mysqlDialect struct { +} + +func (m *mysqlDialect) ToNativeSQL(query string) (sql string) { + if strings.HasPrefix(query, innerSelectTable_) { + sql = "SELECT * FROM " + strings.ReplaceAll(query, innerSelectTable_, "") + } else if query == innerShowDatabases { + sql = "SHOW DATABASES" + } else if query == innerShowTables { + sql = "SHOW TABLES" + } else if query == innerCurrentDB { + sql = "SELECT DATABASE() as name" + } else { + sql = query + } + return +} + +type postgresDialect struct { +} + +func (p *postgresDialect) ToNativeSQL(query string) (sql string) { + if strings.HasPrefix(query, innerSelectTable_) { + sql = `SELECT * FROM "` + strings.ReplaceAll(query, innerSelectTable_, "") + `"` + } else if query == innerShowDatabases { + sql = "SELECT table_catalog as name FROM information_schema.tables" + } else if query == innerShowTables { + sql = `SELECT table_name FROM information_schema.tables WHERE table_catalog = '%s' and table_schema != 'pg_catalog' and table_schema != 'information_schema'` + } else if query == innerCurrentDB { + sql = "SELECT current_database() as name" + } else { + sql = query + } + return +} diff --git a/pkg/server.go b/pkg/server.go index 6f42f4d..c6d3ebc 100644 --- a/pkg/server.go +++ b/pkg/server.go @@ -128,13 +128,7 @@ func (s *dbserver) getClientWithDatabase(ctx context.Context, dbName string) (db } } - switch driver { - case "postgres": - dbQuery = NewCommonDataQuery("select table_catalog as name from information_schema.tables", - `SELECT table_name FROM information_schema.tables WHERE table_catalog = '%s' and table_schema != 'pg_catalog' and table_schema != 'information_schema'`, "SELECT current_database() as name", db) - default: - dbQuery = NewCommonDataQuery("show databases", "show tables", "SELECT DATABASE() as name", db) - } + dbQuery = NewCommonDataQuery(GetInnerSQL(driver), db) } return } From c74371f12aae30edda85cc716534fe97621ff17e Mon Sep 17 00:00:00 2001 From: rick Date: Sun, 23 Mar 2025 07:09:40 +0000 Subject: [PATCH 3/4] add more unit tests --- go.mod | 10 --------- go.sum | 45 --------------------------------------- pkg/convert_test.go | 47 +++++++++++++++++++++++++++++++++++------ pkg/data_query.go | 31 ++++++++++++++------------- pkg/inner_sql.go | 30 +++++++++++++------------- pkg/inner_sql_test.go | 49 +++++++++++++++++++++++++++++++++++++++++++ pkg/server.go | 6 +++--- pkg/server_test.go | 4 ++-- pkg/types.go | 5 +++++ 9 files changed, 132 insertions(+), 95 deletions(-) create mode 100644 pkg/inner_sql_test.go diff --git a/go.mod b/go.mod index e6502b0..43d0c50 100644 --- a/go.mod +++ b/go.mod @@ -30,9 +30,6 @@ require ( github.com/blang/semver/v4 v4.0.0 // indirect github.com/bufbuild/protocompile v0.6.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cucumber/gherkin-go/v19 v19.0.3 // indirect - github.com/cucumber/godog v0.12.6 // indirect - github.com/cucumber/messages-go/v16 v16.0.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/evanphx/json-patch v0.5.2 // indirect github.com/expr-lang/expr v1.15.6 // indirect @@ -45,20 +42,14 @@ require ( github.com/go-openapi/spec v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect github.com/go-sql-driver/mysql v1.7.0 // indirect - github.com/gofrs/uuid v4.2.0+incompatible // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect - github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-memdb v1.3.2 // indirect - github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/huandu/xstrings v1.4.0 // indirect - github.com/iancoleman/orderedmap v0.3.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/invopop/jsonschema v0.7.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect github.com/jackc/pgx/v5 v5.4.3 // indirect @@ -67,7 +58,6 @@ require ( github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/linuxsuren/go-fake-runtime v0.0.4 // indirect - github.com/linuxsuren/go-service v0.0.0-20231225060426-efabcd3a5161 // indirect github.com/linuxsuren/oauth-hub v0.0.0-20240809060240-e78c21b5d8d4 // indirect github.com/linuxsuren/unstructured v0.0.1 // indirect github.com/mailru/easyjson v0.7.7 // indirect diff --git a/go.sum b/go.sum index 051cde2..0f5bc8e 100644 --- a/go.sum +++ b/go.sum @@ -19,15 +19,7 @@ github.com/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28 github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cucumber/gherkin-go/v19 v19.0.3 h1:mMSKu1077ffLbTJULUfM5HPokgeBcIGboyeNUof1MdE= -github.com/cucumber/gherkin-go/v19 v19.0.3/go.mod h1:jY/NP6jUtRSArQQJ5h1FXOUgk5fZK24qtE7vKi776Vw= -github.com/cucumber/godog v0.12.6 h1:3IToXviU45G7FgijwTk/LdB4iojn8zUFDfQLj4MMiHc= -github.com/cucumber/godog v0.12.6/go.mod h1:Y02TTpimPXDb70PnG6M3zpODXm1+bjCsuZzcW76xAww= -github.com/cucumber/messages-go/v16 v16.0.0/go.mod h1:EJcyR5Mm5ZuDsKJnT2N9KRnBK30BGjtYotDKpwQ0v6g= -github.com/cucumber/messages-go/v16 v16.0.1 h1:fvkpwsLgnIm0qugftrw2YwNlio+ABe2Iu94Ap8GMYIY= -github.com/cucumber/messages-go/v16 v16.0.1/go.mod h1:EJcyR5Mm5ZuDsKJnT2N9KRnBK30BGjtYotDKpwQ0v6g= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -57,9 +49,6 @@ github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+Gr github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= -github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -69,7 +58,6 @@ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= @@ -80,30 +68,16 @@ github.com/h2non/gock v1.2.0 h1:K6ol8rfrRkUOefooBC8elXoaNGYkpp7y2qcxGG6BzUE= github.com/h2non/gock v1.2.0/go.mod h1:tNhoxHYW2W42cYkYb1WqzdbYIieALC99kpYr7rH/BQk= github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw= github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= -github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-memdb v1.3.2 h1:RBKHOsnSszpU6vxq80LzC2BaQjuuvoyaQbkLTf7V7g8= -github.com/hashicorp/go-memdb v1.3.2/go.mod h1:Mluclgwib3R93Hk5fxEfiRhB+6Dar64wWh71LpNSe3g= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= github.com/iancoleman/orderedmap v0.3.0 h1:5cbR2grmZR/DiVt+VJopEhtVs9YGInGIxAoMJn+Ichc= github.com/iancoleman/orderedmap v0.3.0/go.mod h1:XuLcCUkdL5owUCQeF2Ue9uuw1EptkJDkXXS7VoV7XGE= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/invopop/jsonschema v0.7.0 h1:2vgQcBz1n256N+FpX3Jq7Y17AjYt46Ig3zIWyy770So= -github.com/invopop/jsonschema v0.7.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= @@ -121,29 +95,17 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8Hm github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/linuxsuren/api-testing v0.0.19-0.20250220092001-ed58adc30f20 h1:DiT8lZ4rfFO4WWhZ9hMaY1Wg90jVi9KVZ7t2L7eAsps= -github.com/linuxsuren/api-testing v0.0.19-0.20250220092001-ed58adc30f20/go.mod h1:SA9cvDE/Hg0QUTgbL5g9tY9ye65beYyfK3Y/y6x0B5k= -github.com/linuxsuren/api-testing v0.0.19-0.20250226135405-35c828fe2524 h1:qJfmOpBK/IWEYIoaC1r/CTaYK8k6xmErjhFlduBJOxA= -github.com/linuxsuren/api-testing v0.0.19-0.20250226135405-35c828fe2524/go.mod h1:SA9cvDE/Hg0QUTgbL5g9tY9ye65beYyfK3Y/y6x0B5k= -github.com/linuxsuren/api-testing v0.0.19-0.20250310093028-dd08c128ca0e h1:3dVXBA+OnZAaIbTNSAB5IHlbdYifORDTzkAUp7R/vnc= -github.com/linuxsuren/api-testing v0.0.19-0.20250310093028-dd08c128ca0e/go.mod h1:igcyUJb5Q463tMpdEJxgURLLPR2pTcV7HoRyuvyP/2Y= -github.com/linuxsuren/api-testing v0.0.19-0.20250312132236-e3e7357d6687 h1:AFF1vWQbxOCqEENxK5F2va3d4Xmu5wK9tl2zZfUgHdY= -github.com/linuxsuren/api-testing v0.0.19-0.20250312132236-e3e7357d6687/go.mod h1:igcyUJb5Q463tMpdEJxgURLLPR2pTcV7HoRyuvyP/2Y= github.com/linuxsuren/api-testing v0.0.20-0.20250319020913-f5f9383e2948 h1:YOyqT+9GQsAhRJ0nfqkFMtFJufAS3X/nKmxs25iPUss= github.com/linuxsuren/api-testing v0.0.20-0.20250319020913-f5f9383e2948/go.mod h1:igcyUJb5Q463tMpdEJxgURLLPR2pTcV7HoRyuvyP/2Y= github.com/linuxsuren/go-fake-runtime v0.0.4 h1:y+tvBuw6MKTCav8Bo5HWwaXhBx1Z//VAvqI3gpOWqvw= github.com/linuxsuren/go-fake-runtime v0.0.4/go.mod h1:zmh6J78hSnWZo68faMA2eKOdaEp8eFbERHi3ZB9xHCQ= -github.com/linuxsuren/go-service v0.0.0-20231225060426-efabcd3a5161 h1:dSL/ah6zaRGqH3FW0ogtMjP6xCFXX5NsgWJTaNIofI4= -github.com/linuxsuren/go-service v0.0.0-20231225060426-efabcd3a5161/go.mod h1:QX22v61PxpOfJa4Xug8qzGTbPjclDZFx2j1PlGLknJw= github.com/linuxsuren/oauth-hub v0.0.0-20240809060240-e78c21b5d8d4 h1:muVmKxx+JneaVgUKHqLc+As5vpgKXZAfVu6h+iyb5LQ= github.com/linuxsuren/oauth-hub v0.0.0-20240809060240-e78c21b5d8d4/go.mod h1:6K1L5ajpFTNO8iJSsNrxMWAigAqczI0UPfEV9NSE0nc= github.com/linuxsuren/unstructured v0.0.1 h1:ilUA8MUYbR6l9ebo/YPV2bKqlf62bzQursDSE+j00iU= @@ -190,12 +152,9 @@ github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5g github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/signintech/gopdf v0.18.0 h1:ktQSrhoeQSImPBIIH9Z3vnTJZXCfiGYzgYW2Vy5Ff+c= github.com/signintech/gopdf v0.18.0/go.mod h1:wrLtZoWaRNrS4hphED0oflFoa6IWkOu6M3nJjm4VbO4= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -203,11 +162,9 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/swaggest/assertjson v1.9.0 h1:dKu0BfJkIxv/xe//mkCrK5yZbs79jL7OVf9Ija7o2xQ= @@ -259,7 +216,6 @@ golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ss golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= @@ -290,7 +246,6 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/pkg/convert_test.go b/pkg/convert_test.go index be912a0..7840291 100644 --- a/pkg/convert_test.go +++ b/pkg/convert_test.go @@ -1,5 +1,5 @@ /* -Copyright 2023 API Testing Authors. +Copyright 2023-2025 API Testing Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -16,13 +16,14 @@ limitations under the License. package pkg_test import ( + "testing" + "time" + "github.com/linuxsuren/api-testing/pkg/server" "github.com/linuxsuren/api-testing/pkg/testing/remote" "github.com/linuxsuren/atest-ext-store-orm/pkg" "github.com/stretchr/testify/assert" "google.golang.org/protobuf/types/known/timestamppb" - "testing" - "time" ) func TestConvertToRemoteTestCase(t *testing.T) { @@ -157,6 +158,27 @@ func TestConvertToDBHistoryTestResult(t *testing.T) { t.Run("have testcaseResult", func(t *testing.T) { result := pkg.ConvertToDBHistoryTestResult(&server.HistoryTestResult{ + Data: &server.HistoryTestCase{ + SuiteParam: []*server.Pair{{ + Key: "key", + Value: "value", + }}, + Request: &server.Request{ + Header: []*server.Pair{{ + Key: "key", + Value: "value", + }}, + }, + Response: &server.Response{ + Header: []*server.Pair{{ + Key: "key", + Value: "value", + }}, + }, + SuiteSpec: &server.APISpec{ + Kind: "kind", + }, + }, TestCaseResult: []*server.TestCaseResult{ { StatusCode: 200, @@ -166,9 +188,22 @@ func TestConvertToDBHistoryTestResult(t *testing.T) { }, }) assert.Equal(t, &pkg.HistoryTestResult{ - StatusCode: 200, - Body: "Test body", - Output: "Test output", + StatusCode: 200, + Body: "Test body", + Output: "Test output", + Param: `{"key":"value"}`, + Header: `{"key":"value"}`, + ExpectHeader: `{"key":"value"}`, + ExpectBodyFields: "{}", + ExpectVerify: "[]", + Message: "", + ExpectSchema: "", + HistoryHeader: `{}`, + Cookie: `{}`, + Query: `{}`, + Form: `{}`, + SpecKind: "kind", + SpecURL: "", }, result) }) } diff --git a/pkg/data_query.go b/pkg/data_query.go index 98e3784..fc0acf3 100644 --- a/pkg/data_query.go +++ b/pkg/data_query.go @@ -169,15 +169,14 @@ type DataQuery interface { GetDatabases(context.Context) (databases []string, err error) GetTables(ctx context.Context, currentDatabase string) (tables []string, err error) GetCurrentDatabase() (string, error) - GetLabels(context.Context, string) map[string]string + GetLabels(context.Context, string) []*server.Pair GetClient() *gorm.DB GetInnerSQL() InnerSQL } type commonDataQuery struct { - showTables string - db *gorm.DB - innerSQL InnerSQL + db *gorm.DB + innerSQL InnerSQL } var _ DataQuery = &commonDataQuery{} @@ -191,7 +190,7 @@ func NewCommonDataQuery(innerSQL InnerSQL, db *gorm.DB) DataQuery { func (q *commonDataQuery) GetDatabases(ctx context.Context) (databases []string, err error) { var databaseResult *server.DataQueryResult - if databaseResult, err = sqlQuery(ctx, q.GetInnerSQL().ToNativeSQL(innerShowDatabases), q.db); err == nil { + if databaseResult, err = sqlQuery(ctx, q.GetInnerSQL().ToNativeSQL(InnerShowDatabases), q.db); err == nil { for _, table := range databaseResult.Items { for _, item := range table.GetData() { if item.Key == "Database" || item.Key == "name" { @@ -213,7 +212,7 @@ func (q *commonDataQuery) GetDatabases(ctx context.Context) (databases []string, } func (q *commonDataQuery) GetTables(ctx context.Context, currentDatabase string) (tables []string, err error) { - showTables := q.GetInnerSQL().ToNativeSQL(innerShowTables) + showTables := q.GetInnerSQL().ToNativeSQL(InnerShowTables) if strings.Contains(showTables, "%s") { showTables = fmt.Sprintf(showTables, currentDatabase) } @@ -243,21 +242,25 @@ func (q *commonDataQuery) GetTables(ctx context.Context, currentDatabase string) func (q *commonDataQuery) GetCurrentDatabase() (current string, err error) { var row *sql.Row - if row = q.db.Raw(q.GetInnerSQL().ToNativeSQL(innerCurrentDB)).Row(); row != nil { + if row = q.db.Raw(q.GetInnerSQL().ToNativeSQL(InnerCurrentDB)).Row(); row != nil { err = row.Scan(¤t) } return } -func (q *commonDataQuery) GetLabels(ctx context.Context, sql string) (metadata map[string]string) { +func (q *commonDataQuery) GetLabels(ctx context.Context, sql string) (metadata []*server.Pair) { + metadata = make([]*server.Pair, 0) if databaseResult, err := sqlQuery(ctx, fmt.Sprintf("explain %s", sql), q.db); err == nil { if len(databaseResult.Items) != 1 { - metadata = make(map[string]string) - for _, data := range databaseResult.Items[0].Data { - switch data.Key { - case "type": - metadata["sql_type"] = data.Value - } + return + } + for _, data := range databaseResult.Items[0].Data { + switch data.Key { + case "type": + metadata = append(metadata, &server.Pair{ + Key: "sql_type", + Value: data.Value, + }) } } } diff --git a/pkg/inner_sql.go b/pkg/inner_sql.go index 0876775..efe8013 100644 --- a/pkg/inner_sql.go +++ b/pkg/inner_sql.go @@ -23,15 +23,15 @@ type InnerSQL interface { } const ( - innerSelectTable_ = "@selectTable_" - innerShowDatabases = "@showDatabases" - innerShowTables = "@showTables" - innerCurrentDB = "@currentDB" + InnerSelectTable_ = "@selectTable_" + InnerShowDatabases = "@showDatabases" + InnerShowTables = "@showTables" + InnerCurrentDB = "@currentDB" ) func GetInnerSQL(dialect string) InnerSQL { switch dialect { - case "postgres": + case DialectorPostgres: return &postgresDialect{} default: return &mysqlDialect{} @@ -42,13 +42,13 @@ type mysqlDialect struct { } func (m *mysqlDialect) ToNativeSQL(query string) (sql string) { - if strings.HasPrefix(query, innerSelectTable_) { - sql = "SELECT * FROM " + strings.ReplaceAll(query, innerSelectTable_, "") - } else if query == innerShowDatabases { + if strings.HasPrefix(query, InnerSelectTable_) { + sql = "SELECT * FROM " + strings.ReplaceAll(query, InnerSelectTable_, "") + } else if query == InnerShowDatabases { sql = "SHOW DATABASES" - } else if query == innerShowTables { + } else if query == InnerShowTables { sql = "SHOW TABLES" - } else if query == innerCurrentDB { + } else if query == InnerCurrentDB { sql = "SELECT DATABASE() as name" } else { sql = query @@ -60,13 +60,13 @@ type postgresDialect struct { } func (p *postgresDialect) ToNativeSQL(query string) (sql string) { - if strings.HasPrefix(query, innerSelectTable_) { - sql = `SELECT * FROM "` + strings.ReplaceAll(query, innerSelectTable_, "") + `"` - } else if query == innerShowDatabases { + if strings.HasPrefix(query, InnerSelectTable_) { + sql = `SELECT * FROM "` + strings.ReplaceAll(query, InnerSelectTable_, "") + `"` + } else if query == InnerShowDatabases { sql = "SELECT table_catalog as name FROM information_schema.tables" - } else if query == innerShowTables { + } else if query == InnerShowTables { sql = `SELECT table_name FROM information_schema.tables WHERE table_catalog = '%s' and table_schema != 'pg_catalog' and table_schema != 'information_schema'` - } else if query == innerCurrentDB { + } else if query == InnerCurrentDB { sql = "SELECT current_database() as name" } else { sql = query diff --git a/pkg/inner_sql_test.go b/pkg/inner_sql_test.go new file mode 100644 index 0000000..d2cde85 --- /dev/null +++ b/pkg/inner_sql_test.go @@ -0,0 +1,49 @@ +/* +Copyright 2025 API Testing Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package pkg_test + +import ( + "testing" + + "github.com/linuxsuren/atest-ext-store-orm/pkg" + "github.com/stretchr/testify/assert" +) + +func TestInnerSQL(t *testing.T) { + t.Run("support postgres", func(t *testing.T) { + assert.NotNil(t, pkg.GetInnerSQL(pkg.DialectorPostgres)) + }) + + t.Run("complext native SQL", func(t *testing.T) { + const sql = "select * from table limit 3" + assert.Equal(t, sql, pkg.GetInnerSQL(pkg.DialectorMySQL).ToNativeSQL(sql)) + assert.Equal(t, sql, pkg.GetInnerSQL(pkg.DialectorPostgres).ToNativeSQL(sql)) + }) + + innerSQLs := []string{ + pkg.InnerSelectTable_, + pkg.InnerShowDatabases, + pkg.InnerShowTables, + pkg.InnerCurrentDB, + } + t.Run("inner SQL", func(t *testing.T) { + for _, sql := range innerSQLs { + assert.NotEqual(t, sql, pkg.GetInnerSQL(pkg.DialectorMySQL).ToNativeSQL(sql)) + assert.NotEqual(t, sql, pkg.GetInnerSQL(pkg.DialectorPostgres).ToNativeSQL(sql)) + } + }) +} diff --git a/pkg/server.go b/pkg/server.go index c6d3ebc..aef808b 100644 --- a/pkg/server.go +++ b/pkg/server.go @@ -54,7 +54,7 @@ func createDB(user, password, address, database, driver string) (db *gorm.DB, er var dialector gorm.Dialector var dsn string switch driver { - case "mysql", "", "greptime": + case DialectorMySQL, "", "greptime": if !strings.Contains(address, ":") { address = fmt.Sprintf("%s:%d", address, 3306) } @@ -63,7 +63,7 @@ func createDB(user, password, address, database, driver string) (db *gorm.DB, er case "sqlite": dsn = fmt.Sprintf("%s.db", database) dialector = sqlite.Open(dsn) - case "postgres": + case DialectorPostgres: obj := strings.Split(address, ":") host, port := obj[0], "5432" if len(obj) > 1 { @@ -111,7 +111,7 @@ func (s *dbserver) getClientWithDatabase(ctx context.Context, dbName string) (db } } - driver := "mysql" + driver := DialectorMySQL if v, ok := store.Properties["driver"]; ok && v != "" { driver = v } diff --git a/pkg/server_test.go b/pkg/server_test.go index f730d55..2abe7d4 100644 --- a/pkg/server_test.go +++ b/pkg/server_test.go @@ -136,7 +136,7 @@ func TestNewRemoteServer(t *testing.T) { assert.NotNil(t, remoteServer) defaultCtx := remote.WithIncomingStoreContext(context.TODO(), &atest.Store{ Properties: map[string]string{ - "driver": "mysql", + "driver": DialectorMySQL, }, }) _, err := remoteServer.ListTestSuite(defaultCtx, &server.Empty{}) @@ -148,7 +148,7 @@ func TestNewRemoteServer(t *testing.T) { assert.NotNil(t, remoteServer) defaultCtx := remote.WithIncomingStoreContext(context.TODO(), &atest.Store{ Properties: map[string]string{ - "driver": "postgres", + "driver": DialectorPostgres, }, URL: "0.0.0.0:-123", }) diff --git a/pkg/types.go b/pkg/types.go index e900023..bfe69d4 100644 --- a/pkg/types.go +++ b/pkg/types.go @@ -78,3 +78,8 @@ type HistoryTestResult struct { StatusCode int32 `json:"statusCode"` Output string `json:"output"` } + +const ( + DialectorPostgres = "postgres" + DialectorMySQL = "mysql" +) From 7511567dc01e780062f7c09dd641e02b92b1eedd Mon Sep 17 00:00:00 2001 From: rick Date: Mon, 24 Mar 2025 06:39:45 +0000 Subject: [PATCH 4/4] return the native sql in the lables --- e2e/compose.yaml | 2 ++ pkg/data_query.go | 4 ++++ pkg/inner_sql.go | 13 +++++++++---- pkg/inner_sql_test.go | 1 + 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/e2e/compose.yaml b/e2e/compose.yaml index 6ea246e..ea4ff4e 100644 --- a/e2e/compose.yaml +++ b/e2e/compose.yaml @@ -82,5 +82,7 @@ services: interval: 3s timeout: 30s retries: 10 + ports: + - 5432 volumes: cache: diff --git a/pkg/data_query.go b/pkg/data_query.go index fc0acf3..3b45d7a 100644 --- a/pkg/data_query.go +++ b/pkg/data_query.go @@ -66,6 +66,10 @@ func (s *dbserver) Query(ctx context.Context, query *server.DataQuery) (result * query.Sql = dbQuery.GetInnerSQL().ToNativeSQL(query.Sql) result.Meta.Labels = dbQuery.GetLabels(ctx, query.Sql) + result.Meta.Labels = append(result.Meta.Labels, &server.Pair{ + Key: "_native_sql", + Value: query.Sql, + }) var dataResult *server.DataQueryResult now := time.Now() diff --git a/pkg/inner_sql.go b/pkg/inner_sql.go index efe8013..f9c3935 100644 --- a/pkg/inner_sql.go +++ b/pkg/inner_sql.go @@ -23,10 +23,11 @@ type InnerSQL interface { } const ( - InnerSelectTable_ = "@selectTable_" - InnerShowDatabases = "@showDatabases" - InnerShowTables = "@showTables" - InnerCurrentDB = "@currentDB" + InnerSelectTable_ = "@selectTable_" + InnerSelectTableLimit_ = "@selectTableLImit100_" + InnerShowDatabases = "@showDatabases" + InnerShowTables = "@showTables" + InnerCurrentDB = "@currentDB" ) func GetInnerSQL(dialect string) InnerSQL { @@ -44,6 +45,8 @@ type mysqlDialect struct { func (m *mysqlDialect) ToNativeSQL(query string) (sql string) { if strings.HasPrefix(query, InnerSelectTable_) { sql = "SELECT * FROM " + strings.ReplaceAll(query, InnerSelectTable_, "") + } else if strings.HasPrefix(query, InnerSelectTableLimit_) { + sql = "SELECT * FROM " + strings.ReplaceAll(query, InnerSelectTableLimit_, "") + " LIMIT 100" } else if query == InnerShowDatabases { sql = "SHOW DATABASES" } else if query == InnerShowTables { @@ -62,6 +65,8 @@ type postgresDialect struct { func (p *postgresDialect) ToNativeSQL(query string) (sql string) { if strings.HasPrefix(query, InnerSelectTable_) { sql = `SELECT * FROM "` + strings.ReplaceAll(query, InnerSelectTable_, "") + `"` + } else if strings.HasPrefix(query, InnerSelectTableLimit_) { + sql = `SELECT * FROM "` + strings.ReplaceAll(query, InnerSelectTableLimit_, "") + `" LIMIT 100` } else if query == InnerShowDatabases { sql = "SELECT table_catalog as name FROM information_schema.tables" } else if query == InnerShowTables { diff --git a/pkg/inner_sql_test.go b/pkg/inner_sql_test.go index d2cde85..893ec81 100644 --- a/pkg/inner_sql_test.go +++ b/pkg/inner_sql_test.go @@ -36,6 +36,7 @@ func TestInnerSQL(t *testing.T) { innerSQLs := []string{ pkg.InnerSelectTable_, + pkg.InnerSelectTableLimit_, pkg.InnerShowDatabases, pkg.InnerShowTables, pkg.InnerCurrentDB,