1
1
<?php
2
2
3
3
class QueryRewrite{
4
- private $ sql = null ;
5
- private $ type = 0 ;
4
+ public $ sql = null ;
5
+ public $ type = 0 ;
6
6
7
- const UNKNOWN = 0 ;
8
- const SELECT = 1 ;
9
- const DELETE = 2 ;
10
- const INSERT = 3 ;
11
- const UPDATE = 4 ;
12
- const ALTER = 5 ;
13
- const DROP = 6 ;
14
- const CREATE = 7 ;
15
- const DELETEMULTI = 8 ;
16
- const UNION = 9 ;
7
+ const UNKNOWN = 0 ;
8
+ const SELECT = 1 ;
9
+ const DELETE = 2 ;
10
+ const INSERT = 3 ;
11
+ const UPDATE = 4 ;
12
+ const ALTER = 5 ;
13
+ const DROP = 6 ;
14
+ const CREATE = 7 ;
15
+ const DELETEMULTI = 8 ;
16
+ const UNION = 9 ;
17
+ const INSERTSELECT = 10 ;
17
18
18
19
// Valid Table Regex
19
20
const TABLEREF = '`?[A-Za-z0-9_]+`?(\.`?[A-Za-z0-9_]+`?)? ' ;
@@ -48,6 +49,8 @@ private function figureOutType(){
48
49
$ this ->type = self ::DELETE ;
49
50
elseif (preg_match ('/^DELETE\s+ ' .self ::TABLEREF .'\s+FROM\s/i ' , $ this ->sql ))
50
51
$ this ->type = self ::DELETEMULTI ;
52
+ elseif (preg_match ('/^INSERT\s+INTO\s ' .self ::TABLEREF .'[\s\(]*SELECT\s+/i ' , $ this ->sql ))
53
+ $ this ->type = self ::INSERTSELECT ;
51
54
elseif (preg_match ('/^INSERT\s+INTO\s/i ' , $ this ->sql ))
52
55
$ this ->type = self ::INSERT ;
53
56
elseif (preg_match ('/^(.*)\s+UNION\s+(.*)$/i ' , $ this ->sql ))
@@ -80,6 +83,12 @@ public function toSelect() {
80
83
case self ::UPDATE :
81
84
preg_match ('/^UPDATE\s+(.*)\s+SET\s+(.*)\s+WHERE\s+(.*)$/i ' , $ this ->sql , $ subpatterns );
82
85
return "SELECT {$ subpatterns [2 ]} FROM {$ subpatterns [1 ]} WHERE {$ subpatterns [3 ]}" ;
86
+ case self ::INSERTSELECT :
87
+ if (preg_match ('/\(\s*(SELECT\s+.*)\)/ ' , $ this ->sql , $ subpatterns ))
88
+ return trim ("{$ subpatterns [1 ]}" );
89
+ else
90
+ preg_match ('/^INSERT\s+INTO\s+(SELECT.*)/i ' , $ subpatterns );
91
+ return trim ("{$ subpatterns [1 ]}" );
83
92
}
84
93
return null ;
85
94
}
@@ -93,6 +102,7 @@ public function asExplain() {
93
102
case self ::DELETE :
94
103
case self ::DELETEMULTI :
95
104
case self ::UPDATE :
105
+ case self ::INSERTSELECT :
96
106
$ sql = $ this ->toSelect ();
97
107
break ;
98
108
default :
0 commit comments