# ############################################################################ =pod =head1 NAME mk-query-advisor - Scrutinize queries. =head1 SYNOPSIS This POD sample simulates special POD stuff used by mk-query-advisor. The format used here is not the same actually used in mk-query-advisor. This POD sample is, therore, just for testing. =head1 CHECKS These are the check that mk-advisor can perform on a query. There are several classes of checks, each described in its own seciton. You can add new checks by adding new entires like the ones below. Read L<"CHECK SYNTAX"> to learn the structure of these checks. =head2 Literals id: LIT.001 level: note rule: colval matches \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\. desc: IP address used as string. The string literal looks like an IP address but is not used inside INET_ATON(). WHERE ip='127.0.0.1' is better as ip=INET_ATON('127.0.0.1') if the column is numeric. id: LIT.002 level: warn rule: colval matches (?:\d{2,4}-\d{1,2}-\d{1,2}|\d{4,6}) desc: Date literal is not quoted. WHERE col<2010-02-12 is valid but wrong; the date should be quoted. =head2 Table List id: TBL.001 level: note rule: tbl matches * desc: SELECT *. Selecting specific columns is preferable to SELECT *. =head2 Clauses id: CLA.001 level: note rule: query matches ORDER BY RAND desc: ORDER BY RAND(). ORDER BY RAND() is not preferred. =head2 Query id: QRY.001 level: note rule: INSERT without columns desc: Blind INSERT. The INSERT does not specify columns. INSERT INTO tbl (col1,col2) VALUES (1,2) is preferred to INSERT INTO tbl VALUES (1,2). id: QRY.002 level: note rule: query matches SQL_CALC_FOUND_ROWS desc: SQL_CALC_FOUND_ROWS does not scale. SQL_CALC_FOUND_ROWS can cause performance problems because it does not scale well. =head1 CHECK SYNTAX Each check is a single paragraph (blank line before and after) with the following attributes: * id A unique ID used by the tool to identify the check * level note, warn, or crit * rule A special syntax telling the tool how to perform the check * desc A terse, fuller and complete description of the check. The check is two parts: CCC.NNN where CCC is the class abbreviation and NNN is the next avaiable number. The classes are shown above, LIT for Literals, TBL for Table List, etc. The numbers should never overlap or change. The level is either note, warn or crit (for "critical"). The rule is a special, limited syntax that the tool translateis into code. Each rule is a single sentence with a subject, verb and noun. These are: SUBJECT REFERS TO ======= ================================================================ query The whole text of the query (the SQL statement) colval Any column value for any column tbl Any table from anywhere Any Data Manipulation Statement in caps: SELECT, INSERT, DELETE, etc. The rule only applies if the query is this type of statement. clause One of these MAGIC_clauses: GROUP BY, ORDER BY, LIMIT VERB DOES ======= ================================================================ matches Perl regex match SUBJECT =~ m/NOUN/ims with subject has NOUN part without subject does not have NOUN part NOUN DESCRIBES ======= ================================================================ where WHERE clause, used only with subjects columns Columns list of the query, used only with subjects <...> Anything after the verb, used with most verbs. The description (desc) should have at least two period-terminate sentences. The first sentece should be the terse definition of the check. The second sentence should be the fuller defintion. Any more sentences are the complete defintion of the check. =head1 OPTIONS =over =item --define type: array Define these check IDs. If L<"--verbose"> is zero (i.e. not specified) then a terse definition is given. If one then a fuller definition is given. If two then the complete definition is given. =item --ignore-checks type: array Ignore these L<"CHECKS">. =item --verbose cumulative; default: 0 Print more information. =back =head1 ENVIRONMENT The environment variable C enables verbose debugging output in all of the Maatkit tools: PTDEBUG=1 mk-.... =head1 VERSION This manual page documents Ver @VERSION@ Distrib @DISTRIB@ $Revision: 1929 $. =cut