zzk.go 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. /*
  2. * Copyright (c) 2000-2018, 达梦数据库有限公司.
  3. * All rights reserved.
  4. */
  5. package dm
  6. import (
  7. "bytes"
  8. "strconv"
  9. "strings"
  10. "gitee.com/chunanyong/dm/parser"
  11. "gitee.com/chunanyong/dm/util"
  12. )
  13. func (dc *DmConnection) lex(sql string) ([]*parser.LVal, error) {
  14. if dc.lexer == nil {
  15. dc.lexer = parser.NewLexer(strings.NewReader(sql), false)
  16. } else {
  17. dc.lexer.Reset(strings.NewReader(sql))
  18. }
  19. lexer := dc.lexer
  20. var lval *parser.LVal
  21. var err error
  22. lvalList := make([]*parser.LVal, 0, 64)
  23. lval, err = lexer.Yylex()
  24. if err != nil {
  25. return nil, err
  26. }
  27. for lval != nil {
  28. lvalList = append(lvalList, lval)
  29. lval.Position = len(lvalList)
  30. lval, err = lexer.Yylex()
  31. if err != nil {
  32. return nil, err
  33. }
  34. }
  35. return lvalList, nil
  36. }
  37. func lexSkipWhitespace(sql string, n int) ([]*parser.LVal, error) {
  38. lexer := parser.NewLexer(strings.NewReader(sql), false)
  39. var lval *parser.LVal
  40. var err error
  41. lvalList := make([]*parser.LVal, 0, 64)
  42. lval, err = lexer.Yylex()
  43. if err != nil {
  44. return nil, err
  45. }
  46. for lval != nil && n > 0 {
  47. lval.Position = len(lvalList)
  48. if lval.Tp == parser.WHITESPACE_OR_COMMENT {
  49. continue
  50. }
  51. lvalList = append(lvalList, lval)
  52. n--
  53. lval, err = lexer.Yylex()
  54. if err != nil {
  55. return nil, err
  56. }
  57. }
  58. return lvalList, nil
  59. }
  60. func (dc *DmConnection) escape(sql string, keywords []string) (string, error) {
  61. if (keywords == nil || len(keywords) == 0) && strings.Index(sql, "{") == -1 {
  62. return sql, nil
  63. }
  64. var keywordMap map[string]interface{}
  65. if keywords != nil && len(keywords) > 0 {
  66. keywordMap = make(map[string]interface{}, len(keywords))
  67. for _, keyword := range keywords {
  68. keywordMap[strings.ToUpper(keyword)] = nil
  69. }
  70. }
  71. nsql := bytes.NewBufferString("")
  72. stack := make([]bool, 0, 64)
  73. lvalList, err := dc.lex(sql)
  74. if err != nil {
  75. return "", err
  76. }
  77. for i := 0; i < len(lvalList); i++ {
  78. lval0 := lvalList[i]
  79. if lval0.Tp == parser.NORMAL {
  80. if lval0.Value == "{" {
  81. lval1 := next(lvalList, i+1)
  82. if lval1 == nil || lval1.Tp != parser.NORMAL {
  83. stack = append(stack, false)
  84. nsql.WriteString(lval0.Value)
  85. } else if util.StringUtil.EqualsIgnoreCase(lval1.Value, "escape") || util.StringUtil.EqualsIgnoreCase(lval1.Value, "call") {
  86. stack = append(stack, true)
  87. } else if util.StringUtil.EqualsIgnoreCase(lval1.Value, "oj") {
  88. stack = append(stack, true)
  89. lval1.Value = ""
  90. lval1.Tp = parser.WHITESPACE_OR_COMMENT
  91. } else if util.StringUtil.EqualsIgnoreCase(lval1.Value, "d") {
  92. stack = append(stack, true)
  93. lval1.Value = "date"
  94. } else if util.StringUtil.EqualsIgnoreCase(lval1.Value, "t") {
  95. stack = append(stack, true)
  96. lval1.Value = "time"
  97. } else if util.StringUtil.EqualsIgnoreCase(lval1.Value, "ts") {
  98. stack = append(stack, true)
  99. lval1.Value = "datetime"
  100. } else if util.StringUtil.EqualsIgnoreCase(lval1.Value, "fn") {
  101. stack = append(stack, true)
  102. lval1.Value = ""
  103. lval1.Tp = parser.WHITESPACE_OR_COMMENT
  104. lval2 := next(lvalList, lval1.Position+1)
  105. if lval2 != nil && lval2.Tp == parser.NORMAL && util.StringUtil.EqualsIgnoreCase(lval2.Value, "database") {
  106. lval2.Value = "cur_database"
  107. }
  108. } else if util.StringUtil.Equals(lval1.Value, "?") {
  109. lval2 := next(lvalList, lval1.Position+1)
  110. if lval2 != nil && lval2.Tp == parser.NORMAL && util.StringUtil.EqualsIgnoreCase(lval2.Value, "=") {
  111. lval3 := next(lvalList, lval2.Position+1)
  112. if lval3 != nil && lval3.Tp == parser.NORMAL && util.StringUtil.EqualsIgnoreCase(lval3.Value, "call") {
  113. stack = append(stack, true)
  114. lval3.Value = ""
  115. lval3.Tp = parser.WHITESPACE_OR_COMMENT
  116. } else {
  117. stack = append(stack, false)
  118. nsql.WriteString(lval0.Value)
  119. }
  120. } else {
  121. stack = append(stack, false)
  122. nsql.WriteString(lval0.Value)
  123. }
  124. } else {
  125. stack = append(stack, false)
  126. nsql.WriteString(lval0.Value)
  127. }
  128. } else if util.StringUtil.Equals(lval0.Value, "}") {
  129. if len(stack) != 0 && stack[len(stack)-1] {
  130. } else {
  131. nsql.WriteString(lval0.Value)
  132. }
  133. stack = stack[:len(stack)-1]
  134. } else {
  135. if keywordMap != nil {
  136. _, ok := keywordMap[strings.ToUpper(lval0.Value)]
  137. if ok {
  138. nsql.WriteString("\"" + util.StringUtil.ProcessDoubleQuoteOfName(strings.ToUpper(lval0.Value)) + "\"")
  139. } else {
  140. nsql.WriteString(lval0.Value)
  141. }
  142. } else {
  143. nsql.WriteString(lval0.Value)
  144. }
  145. }
  146. } else if lval0.Tp == parser.STRING {
  147. nsql.WriteString("'" + util.StringUtil.ProcessSingleQuoteOfName(lval0.Value) + "'")
  148. } else {
  149. nsql.WriteString(lval0.Value)
  150. }
  151. }
  152. return nsql.String(), nil
  153. }
  154. func next(lvalList []*parser.LVal, start int) *parser.LVal {
  155. var lval *parser.LVal
  156. size := len(lvalList)
  157. for i := start; i < size; i++ {
  158. lval = lvalList[i]
  159. if lval.Tp != parser.WHITESPACE_OR_COMMENT {
  160. break
  161. }
  162. }
  163. return lval
  164. }
  165. func (dc *DmConnection) execOpt(sql string, optParamList []OptParameter, serverEncoding string) (string, []OptParameter, error) {
  166. nsql := bytes.NewBufferString("")
  167. lvalList, err := dc.lex(sql)
  168. if err != nil {
  169. return "", optParamList, err
  170. }
  171. if nil == lvalList || len(lvalList) == 0 {
  172. return sql, optParamList, nil
  173. }
  174. firstWord := lvalList[0].Value
  175. if !(util.StringUtil.EqualsIgnoreCase(firstWord, "INSERT") || util.StringUtil.EqualsIgnoreCase(firstWord, "SELECT") ||
  176. util.StringUtil.EqualsIgnoreCase(firstWord, "UPDATE") || util.StringUtil.EqualsIgnoreCase(firstWord, "DELETE")) {
  177. return sql, optParamList, nil
  178. }
  179. breakIndex := 0
  180. for i := 0; i < len(lvalList); i++ {
  181. lval := lvalList[i]
  182. switch lval.Tp {
  183. case parser.NULL:
  184. {
  185. nsql.WriteString("?")
  186. optParamList = append(optParamList, newOptParameter(nil, NULL, NULL_PREC))
  187. }
  188. case parser.INT:
  189. {
  190. nsql.WriteString("?")
  191. value, err := strconv.Atoi(lval.Value)
  192. if err != nil {
  193. return "", optParamList, err
  194. }
  195. if value <= int(INT32_MAX) && value >= int(INT32_MIN) {
  196. optParamList = append(optParamList, newOptParameter(G2DB.toInt32(int32(value)), INT, INT_PREC))
  197. } else {
  198. optParamList = append(optParamList, newOptParameter(G2DB.toInt64(int64(value)), BIGINT, BIGINT_PREC))
  199. }
  200. }
  201. case parser.DOUBLE:
  202. {
  203. nsql.WriteString("?")
  204. f, err := strconv.ParseFloat(lval.Value, 64)
  205. if err != nil {
  206. return "", optParamList, err
  207. }
  208. optParamList = append(optParamList, newOptParameter(G2DB.toFloat64(f), DOUBLE, DOUBLE_PREC))
  209. }
  210. case parser.DECIMAL:
  211. {
  212. nsql.WriteString("?")
  213. bytes, err := G2DB.toDecimal(lval.Value, 0, 0)
  214. if err != nil {
  215. return "", optParamList, err
  216. }
  217. optParamList = append(optParamList, newOptParameter(bytes, DECIMAL, 0))
  218. }
  219. case parser.STRING:
  220. {
  221. if len(lval.Value) > int(INT16_MAX) {
  222. nsql.WriteString("'" + util.StringUtil.ProcessSingleQuoteOfName(lval.Value) + "'")
  223. } else {
  224. nsql.WriteString("?")
  225. optParamList = append(optParamList, newOptParameter(Dm_build_1.Dm_build_217(lval.Value, serverEncoding, dc), VARCHAR, VARCHAR_PREC))
  226. }
  227. }
  228. case parser.HEX_INT:
  229. nsql.WriteString(lval.Value)
  230. default:
  231. nsql.WriteString(lval.Value)
  232. }
  233. if breakIndex > 0 {
  234. break
  235. }
  236. }
  237. if breakIndex > 0 {
  238. for i := breakIndex + 1; i < len(lvalList); i++ {
  239. nsql.WriteString(lvalList[i].Value)
  240. }
  241. }
  242. return nsql.String(), optParamList, nil
  243. }
  244. func (dc *DmConnection) hasConst(sql string) (bool, error) {
  245. lvalList, err := dc.lex(sql)
  246. if err != nil {
  247. return false, err
  248. }
  249. if nil == lvalList || len(lvalList) == 0 {
  250. return false, nil
  251. }
  252. for i := 0; i < len(lvalList); i++ {
  253. switch lvalList[i].Tp {
  254. case parser.NULL, parser.INT, parser.DOUBLE, parser.DECIMAL, parser.STRING, parser.HEX_INT:
  255. return true, nil
  256. }
  257. }
  258. return false, nil
  259. }
  260. type OptParameter struct {
  261. bytes []byte
  262. ioType byte
  263. tp int
  264. prec int
  265. scale int
  266. }
  267. func newOptParameter(bytes []byte, tp int, prec int) OptParameter {
  268. o := new(OptParameter)
  269. o.bytes = bytes
  270. o.tp = tp
  271. o.prec = prec
  272. return *o
  273. }
  274. func (parameter *OptParameter) String() string {
  275. if parameter.bytes == nil {
  276. return ""
  277. }
  278. return string(parameter.bytes)
  279. }