summaryrefslogtreecommitdiffstats
path: root/scripts/mysql_find_rows.sh
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/mysql_find_rows.sh')
-rw-r--r--scripts/mysql_find_rows.sh159
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);
+}