go正则表达式

https://github.com/cookieY/Yearning/blob/ad6c04b2904bb4cdcb64f732ce088d072751074e/src/lib/toolbox.go#L237

 

 

package soar
   
  import (
  "errors"
  "fmt"
  "github.com/pingcap/parser"
  "github.com/pingcap/parser/ast"
  _ "github.com/pingcap/tidb/types/parser_driver"
  "log"
  "regexp"
  "strings"
  )
   
  func MergeAlterTables(sql string) (string, error) {
  alterSQLs := make(map[string][]string)
  var mergedAlterStr string
  var nonSqls string
  // table/column/index name can be quoted in back ticks
  backTicks := "(`[^\\s]*`)"
   
  alterExp := regexp.MustCompile(`(?i)alter\s*table\s*(` + backTicks + `|([^\s]*))\s*`) // ALTER TABLE
  createIndexExp := regexp.MustCompile(`(?i)create((unique)|(fulltext)|(spatial)|(primary)|(\s*)\s*)((index)|(key))\s*`)
  renameExp := regexp.MustCompile(`(?i)rename\s*table\s*(` + backTicks + `|([^\s]*))\s*`) // RENAME TABLE
  indexNameExp := regexp.MustCompile(`(?i)(` + backTicks + `|([^\s]*))\s*`)
  indexColsExp := regexp.MustCompile(`(?i)(` + backTicks + `|([^\s]*))\s*on\s*(` + backTicks + `|([^\s]*))\s*`)
   
  p := parser.New()
  stmt, _, err := p.Parse(sql, "", "")
  if err != nil {
  return "", errors.New(err.Error())
  }
  for _, idx := range stmt {
  alterSQL := ""
  dbName := ""
  tableName := ""
  switch n := idx.(type) {
  case *ast.AlterTableStmt:
  sols := strings.Trim(n.Text(), ";")
  tableName = n.Table.Name.L
  dbName = n.Table.Schema.L
  if alterExp.MatchString(sols) {
  alterSQL = fmt.Sprint(alterExp.ReplaceAllString(sols, ""))
  } else if createIndexExp.MatchString(sols) {
  buf := createIndexExp.ReplaceAllString(sols, "")
  idxName := strings.TrimSpace(indexNameExp.FindString(buf))
  buf = indexColsExp.ReplaceAllString(buf, "")
  alterSQL = fmt.Sprint("ADD INDEX", " "+idxName+" ", buf)
  }
  case *ast.RenameTableStmt:
  sols := strings.Trim(n.Text(), ";")
  if alterExp.MatchString(sols) {
  alterSQL = fmt.Sprint(alterExp.ReplaceAllString(sols, ""))
  } else if renameExp.MatchString(sols) {
  alterSQL = fmt.Sprint(alterExp.ReplaceAllString(sols, ""))
  } else {
  log.Printf("rename not match: %v", n.Text())
  }
  default:
  nonSqls += n.Text() + "\n"
  }
  if alterSQL != "" && tableName != "" && tableName != "dual" {
  if dbName == "" {
  alterSQLs["`"+tableName+"`"] = append(alterSQLs["`"+tableName+"`"], alterSQL)
  } else {
  alterSQLs["`"+dbName+"`.`"+tableName+"`"] = append(alterSQLs["`"+dbName+"`.`"+tableName+"`"], alterSQL)
  }
  }
  }
  for k, v := range alterSQLs {
  mergedAlterStr += fmt.Sprintln("ALTER TABLE", k, strings.Join(v, ", "), ";")
  }
  mergedAlterStr += nonSqls
  return mergedAlterStr, nil
  }
posted @ 2022-04-08 15:48  技术颜良  阅读(167)  评论(0编辑  收藏  举报