diff options
Diffstat (limited to 'scripts/mysql_find_rows.sh')
-rw-r--r-- | scripts/mysql_find_rows.sh | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/scripts/mysql_find_rows.sh b/scripts/mysql_find_rows.sh new file mode 100644 index 00000000..09bcc227 --- /dev/null +++ b/scripts/mysql_find_rows.sh @@ -0,0 +1,159 @@ +#!@PERL_PATH@ +# Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA + +$version="1.02"; + +use Getopt::Long; + +$opt_help=$opt_Information=$opt_skip_use_db=0; +$opt_regexp=$opt_dbregexp=".*"; +$opt_start_row=1; $opt_rows=9999999999; + +GetOptions("Information","help","regexp=s","start_row=i","rows=i", + "dbregexp=s", "skip-use-db") + || usage(); +usage() if ($opt_help || $opt_Information); + +$query=$search=$database=$set=""; $eoq=0; +while (<>) +{ + next if (length($query) == 0 && /^\#/); # Skip comments + $query.=search($_); + if ($eoq) + { + if ($query =~ /^use /i || $query =~ /^SET / || + ($query =~ /$opt_regexp/o && $database =~ /$opt_dbregexp/o)) + { + if ($opt_skip_use_db && $query =~ /^use /i) + { + $query=""; + next; + } + if ($opt_start_row <= 1) + { + if ($database) + { + print $database, $set; + $database=$set=""; + } + print $query; + last if (--$opt_rows == 0); + } + else + { + $opt_start_row--; + if ($query =~ /^use /) + { + $database=$query; + $set=""; + } + elsif ($query =~ /^SET/) + { + $set=$query; + } + else + { + $set=""; + } + } + } + $query=""; $search=""; $eoq=0; + } +} + +exit 0; + +sub search +{ + my($row)=shift; + my($i); + + for ($i=0 ; $i < length($row) ; $i++) + { + if (length($search)) + { + if (length($search) > 1) + { # Comment + next if (substr($row,$i,length($search)) ne $search); + $i+=length($search)-1; + $search=""; + } + elsif (substr($row,$i,1) eq '\\') # Escaped char in string + { + $i++; + } + elsif (substr($row,$i,1) eq $search) + { + if (substr($row,$i+1,1) eq $search) # Double " or ' + { + $i++; + } + else + { + $search=""; + } + } + next; + } + if (substr($row,$i,2) eq '/*') # Comment + { + $search="*/"; + $i++; + } + elsif (substr($row,$i,1) eq "'" || substr($row,$i,1) eq '"') + { + $search=substr($row,$i,1); + } + } + $eoq=1 if (!length($search) && $row =~ /;\s*$/); + return $row; +} + + +sub usage +{ + print <<EOF; +$0 Ver $version + +Prints all SQL queries that matches a regexp or contains a 'use +database' or 'set ..' command to stdout. A SQL query may contain +newlines. This is useful to find things in a MariaDB update log. + +$0 takes the following options: + +--help or --Information + Shows this help + +--regexp=# + Print queries that matches this. + +--start_row=# + Start output from this row (first row = 1) + +--skip-use-db + Don\'t include \'use database\' commands in the output. + +--rows=# + Quit after this many rows. + +Example: + +$0 --regexp "problem_table" < update.log + +$0 --regexp "problem_table" update-log.1 update-log.2 +EOF + exit(0); +} |