提交 5638646d 编写于 作者: martianzhang's avatar martianzhang

Merge branch 'dev' into mod

...@@ -90,18 +90,20 @@ func TestParseDSN(t *testing.T) { ...@@ -90,18 +90,20 @@ func TestParseDSN(t *testing.T) {
// go-sql-driver dsn // go-sql-driver dsn
"user@unix(/path/to/socket)/dbname", "user@unix(/path/to/socket)/dbname",
"root:pw@unix(/tmp/mysql.sock)/myDatabase?loc=Local", "root:pw@unix(/tmp/mysql.sock)/myDatabase?loc=Local",
"user:password@tcp(localhost:5555)/dbname?tls=skip-verify&autocommit=true", "user:password@tcp(localhost:5555)/dbname?tls=skip-verify",
"user:password@tcp(localhost:5555)/dbname?autocommit=true",
"user:password@/dbname?sql_mode=TRADITIONAL", "user:password@/dbname?sql_mode=TRADITIONAL",
"user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname?timeout=90s&collation=utf8mb4_unicode_ci", "user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname?timeout=90s",
"user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname?collation=utf8mb4_unicode_ci",
"id:password@tcp(your-amazonaws-uri.com:3306)/dbname", "id:password@tcp(your-amazonaws-uri.com:3306)/dbname",
"user@cloudsql(project-id:instance-name)/dbname", "user@cloudsql(project-id:instance-name)/dbname",
"user@cloudsql(project-id:regionname:instance-name)/dbname", "user@cloudsql(project-id:regionname:instance-name)/dbname",
"user:password@tcp/dbname?charset=utf8mb4,utf8&sys_var=esc%40ped", //"user:password@tcp/dbname?charset=utf8mb4,utf8&sys_var=esc%40ped", multi key in map, pretty print in random order, by pass
"user:password@tcp/dbname?sys_var=esc%40ped",
"user:password@/dbname", "user:password@/dbname",
"user:password@/", "user:password@/",
"user:password@tcp(localhost:3307)/database?charset=utf8&timeout=5s", "user:password@tcp(localhost:3307)/database?timeout=5s",
} }
err := GoldenDiff(func() { err := GoldenDiff(func() {
for _, dsn := range dsns { for _, dsn := range dsns {
pretty.Println(dsn) pretty.Println(dsn)
......
...@@ -438,7 +438,7 @@ root:pw@unix(/tmp/mysql.sock)/myDatabase?loc=Local ...@@ -438,7 +438,7 @@ root:pw@unix(/tmp/mysql.sock)/myDatabase?loc=Local
Disable: false, Disable: false,
Version: 99999, Version: 99999,
} }
user:password@tcp(localhost:5555)/dbname?tls=skip-verify&autocommit=true user:password@tcp(localhost:5555)/dbname?tls=skip-verify
&common.Dsn{ &common.Dsn{
User: "user", User: "user",
Password: "password", Password: "password",
...@@ -451,6 +451,28 @@ user:password@tcp(localhost:5555)/dbname?tls=skip-verify&autocommit=true ...@@ -451,6 +451,28 @@ user:password@tcp(localhost:5555)/dbname?tls=skip-verify&autocommit=true
TLS: "skip-verify", TLS: "skip-verify",
ServerPubKey: "", ServerPubKey: "",
MaxAllowedPacket: 4194304, MaxAllowedPacket: 4194304,
Params: {},
Timeout: "0s",
ReadTimeout: "0s",
WriteTimeout: "0s",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
Version: 99999,
}
user:password@tcp(localhost:5555)/dbname?autocommit=true
&common.Dsn{
User: "user",
Password: "password",
Net: "tcp",
Addr: "localhost:5555",
Schema: "dbname",
Charset: "utf8",
Collation: "utf8_general_ci",
Loc: "UTC",
TLS: "",
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {"autocommit":"true"}, Params: {"autocommit":"true"},
Timeout: "0s", Timeout: "0s",
ReadTimeout: "0s", ReadTimeout: "0s",
...@@ -482,7 +504,7 @@ user:password@/dbname?sql_mode=TRADITIONAL ...@@ -482,7 +504,7 @@ user:password@/dbname?sql_mode=TRADITIONAL
Disable: false, Disable: false,
Version: 99999, Version: 99999,
} }
user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname?timeout=90s&collation=utf8mb4_unicode_ci user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname?timeout=90s
&common.Dsn{ &common.Dsn{
User: "user", User: "user",
Password: "password", Password: "password",
...@@ -490,7 +512,7 @@ user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname?timeout=90s&collation=utf8mb4_ ...@@ -490,7 +512,7 @@ user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname?timeout=90s&collation=utf8mb4_
Addr: "[de:ad:be:ef::ca:fe]:80", Addr: "[de:ad:be:ef::ca:fe]:80",
Schema: "dbname", Schema: "dbname",
Charset: "utf8", Charset: "utf8",
Collation: "utf8mb4_unicode_ci", Collation: "utf8_general_ci",
Loc: "UTC", Loc: "UTC",
TLS: "", TLS: "",
ServerPubKey: "", ServerPubKey: "",
...@@ -504,6 +526,28 @@ user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname?timeout=90s&collation=utf8mb4_ ...@@ -504,6 +526,28 @@ user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname?timeout=90s&collation=utf8mb4_
Disable: false, Disable: false,
Version: 99999, Version: 99999,
} }
user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname?collation=utf8mb4_unicode_ci
&common.Dsn{
User: "user",
Password: "password",
Net: "tcp",
Addr: "[de:ad:be:ef::ca:fe]:80",
Schema: "dbname",
Charset: "utf8",
Collation: "utf8mb4_unicode_ci",
Loc: "UTC",
TLS: "",
ServerPubKey: "",
MaxAllowedPacket: 4194304,
Params: {},
Timeout: "0s",
ReadTimeout: "0s",
WriteTimeout: "0s",
AllowNativePasswords: true,
AllowOldPasswords: false,
Disable: false,
Version: 99999,
}
id:password@tcp(your-amazonaws-uri.com:3306)/dbname id:password@tcp(your-amazonaws-uri.com:3306)/dbname
&common.Dsn{ &common.Dsn{
User: "id", User: "id",
...@@ -570,20 +614,20 @@ user@cloudsql(project-id:regionname:instance-name)/dbname ...@@ -570,20 +614,20 @@ user@cloudsql(project-id:regionname:instance-name)/dbname
Disable: false, Disable: false,
Version: 99999, Version: 99999,
} }
user:password@tcp/dbname?charset=utf8mb4,utf8&sys_var=esc%40ped user:password@tcp/dbname?sys_var=esc%40ped
&common.Dsn{ &common.Dsn{
User: "user", User: "user",
Password: "password", Password: "password",
Net: "tcp", Net: "tcp",
Addr: "127.0.0.1:3306", Addr: "127.0.0.1:3306",
Schema: "dbname", Schema: "dbname",
Charset: "utf8mb4,utf8", Charset: "utf8",
Collation: "utf8_general_ci", Collation: "utf8_general_ci",
Loc: "UTC", Loc: "UTC",
TLS: "", TLS: "",
ServerPubKey: "", ServerPubKey: "",
MaxAllowedPacket: 4194304, MaxAllowedPacket: 4194304,
Params: {"charset":"utf8mb4,utf8", "sys_var":"esc@ped"}, Params: {"sys_var":"esc@ped"},
Timeout: "0s", Timeout: "0s",
ReadTimeout: "0s", ReadTimeout: "0s",
WriteTimeout: "0s", WriteTimeout: "0s",
...@@ -636,7 +680,7 @@ user:password@/ ...@@ -636,7 +680,7 @@ user:password@/
Disable: false, Disable: false,
Version: 99999, Version: 99999,
} }
user:password@tcp(localhost:3307)/database?charset=utf8&timeout=5s user:password@tcp(localhost:3307)/database?timeout=5s
&common.Dsn{ &common.Dsn{
User: "user", User: "user",
Password: "password", Password: "password",
...@@ -649,7 +693,7 @@ user:password@tcp(localhost:3307)/database?charset=utf8&timeout=5s ...@@ -649,7 +693,7 @@ user:password@tcp(localhost:3307)/database?charset=utf8&timeout=5s
TLS: "", TLS: "",
ServerPubKey: "", ServerPubKey: "",
MaxAllowedPacket: 4194304, MaxAllowedPacket: 4194304,
Params: {"charset":"utf8"}, Params: {},
Timeout: "5s", Timeout: "5s",
ReadTimeout: "0s", ReadTimeout: "0s",
WriteTimeout: "0s", WriteTimeout: "0s",
......
...@@ -189,11 +189,14 @@ func (db *Connector) ColumnCardinality(tb, col string) float64 { ...@@ -189,11 +189,14 @@ func (db *Connector) ColumnCardinality(tb, col string) float64 {
common.Log.Debug("(db *Connector) ColumnCardinality() No table status: %s", tb) common.Log.Debug("(db *Connector) ColumnCardinality() No table status: %s", tb)
return 1 return 1
} }
rowTotal := tbStatus.Rows[0].Rows rowTotal, err := strconv.ParseUint(string(tbStatus.Rows[0].Rows), 10, 64)
if rowTotal == 0 { if rowTotal == 0 || err != nil {
if common.Config.Sampling { if common.Config.Sampling {
common.Log.Debug("ColumnCardinality, %s rowTotal == 0", tb) common.Log.Debug("ColumnCardinality, %s rowTotal == 0", tb)
} }
if err != nil {
common.Log.Error("ColumnCardinality, Error:", err.Error())
}
return 1 return 1
} }
......
...@@ -19,6 +19,7 @@ package database ...@@ -19,6 +19,7 @@ package database
import ( import (
"database/sql" "database/sql"
"fmt" "fmt"
"strconv"
"strings" "strings"
"time" "time"
...@@ -74,9 +75,12 @@ func (db *Connector) SamplingData(onlineConn *Connector, tables ...string) error ...@@ -74,9 +75,12 @@ func (db *Connector) SamplingData(onlineConn *Connector, tables ...string) error
return nil return nil
} }
tableRows := tableStatus.Rows[0].Rows tableRows, err := strconv.ParseUint(string(tableStatus.Rows[0].Rows), 10, 64)
if tableRows == 0 { if tableRows == 0 || err != nil {
common.Log.Info("SamplingData, Table %s with no data, stop sampling", table) common.Log.Info("SamplingData, Table %s with no data, stop sampling", table)
if err != nil {
common.Log.Error("SamplingData, Error: ", err.Error())
}
return nil return nil
} }
......
...@@ -41,25 +41,25 @@ type tableStatusRow struct { ...@@ -41,25 +41,25 @@ type tableStatusRow struct {
Engine []byte // 该表使用的存储引擎 Engine []byte // 该表使用的存储引擎
Version []byte // 该表的 .frm 文件版本号 Version []byte // 该表的 .frm 文件版本号
RowFormat []byte // 该表使用的行存储格式 RowFormat []byte // 该表使用的行存储格式
Rows uint64 // 表行数, InnoDB 引擎中为预估值,甚至可能会有40%~50%的数值偏差 Rows []byte // 表行数, InnoDB 引擎中为预估值,甚至可能会有40%~50%的数值偏差
AvgRowLength uint64 // 平均行长度 AvgRowLength []byte // 平均行长度
// MyISAM: Data_length 为数据文件的大小,单位为 bytes // MyISAM: Data_length 为数据文件的大小,单位为 bytes
// InnoDB: Data_length 为聚簇索引分配的近似内存量,单位为 bytes, 计算方式为聚簇索引数量乘以 InnoDB 页面大小 // InnoDB: Data_length 为聚簇索引分配的近似内存量,单位为 bytes, 计算方式为聚簇索引数量乘以 InnoDB 页面大小
// 其他不同的存储引擎中该值的意义可能不尽相同 // 其他不同的存储引擎中该值的意义可能不尽相同
DataLength uint64 DataLength []byte
// MyISAM: Max_data_length 为数据文件长度的最大值。这是在给定使用的数据指针大小的情况下,可以存储在表中的数据的最大字节数 // MyISAM: Max_data_length 为数据文件长度的最大值。这是在给定使用的数据指针大小的情况下,可以存储在表中的数据的最大字节数
// InnoDB: 未使用 // InnoDB: 未使用
// 其他不同的存储引擎中该值的意义可能不尽相同 // 其他不同的存储引擎中该值的意义可能不尽相同
MaxDataLength uint64 MaxDataLength []byte
// MyISAM: Index_length 为 index 文件的大小,单位为 bytes // MyISAM: Index_length 为 index 文件的大小,单位为 bytes
// InnoDB: Index_length 为非聚簇索引分配的近似内存量,单位为 bytes,计算方式为非聚簇索引数量乘以 InnoDB 页面大小 // InnoDB: Index_length 为非聚簇索引分配的近似内存量,单位为 bytes,计算方式为非聚簇索引数量乘以 InnoDB 页面大小
// 其他不同的存储引擎中该值的意义可能不尽相同 // 其他不同的存储引擎中该值的意义可能不尽相同
IndexLength uint64 IndexLength []byte
DataFree uint64 // 已分配但未使用的字节数 DataFree []byte // 已分配但未使用的字节数
AutoIncrement []byte // 下一个自增值 AutoIncrement []byte // 下一个自增值
CreateTime []byte // 创建时间 CreateTime []byte // 创建时间
UpdateTime []byte // 最近一次更新时间,该值不准确 UpdateTime []byte // 最近一次更新时间,该值不准确
......
...@@ -38,16 +38,15 @@ func TestShowTableStatus(t *testing.T) { ...@@ -38,16 +38,15 @@ func TestShowTableStatus(t *testing.T) {
} }
pretty.Println(ts) pretty.Println(ts)
// FIXME: too much column NULL ABLE connTest.Database = "sakila"
//connTest.Database = "sakila" ts, err = connTest.ShowTableStatus("actor_info")
//ts, err = connTest.ShowTableStatus("actor_info") if err != nil {
//if err != nil { t.Error("ShowTableStatus Error: ", err)
// t.Error("ShowTableStatus Error: ", err) }
//} if string(ts.Rows[0].Comment) != "VIEW" {
//if string(ts.Rows[0].Comment) != "VIEW" { t.Error("actor_info should be VIEW", ts.Rows[0].Comment)
// t.Error("actor_info should be VIEW", ts.Rows[0].Comment) }
//} pretty.Println(ts)
//pretty.Println(ts)
connTest.Database = orgDatabase connTest.Database = orgDatabase
common.Log.Debug("Exiting function: %s", common.GetFunctionName()) common.Log.Debug("Exiting function: %s", common.GetFunctionName())
} }
......
...@@ -259,14 +259,13 @@ func TestCreateTable(t *testing.T) { ...@@ -259,14 +259,13 @@ func TestCreateTable(t *testing.T) {
"rental", "rental",
"staff", "staff",
"store", "store",
// FIXME: SUPPORT VIEW "staff_list",
//"staff_list", "customer_list",
//"customer_list", "actor_info",
//"actor_info", "sales_by_film_category",
//"sales_by_film_category", "sales_by_store",
//"sales_by_store", "nicer_but_slower_film_list",
//"nicer_but_slower_film_list", "film_list",
//"film_list",
} }
for _, table := range tables { for _, table := range tables {
err := vEnv.createTable(rEnv, table) err := vEnv.createTable(rEnv, table)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册