pax_global_header00006660000000000000000000000064122645403100014507gustar00rootroot0000000000000052 comment=64990d96e0959dff8e059dfcdc1af130728d92bc sql-formatter-1.2.17/000077500000000000000000000000001226454031000143775ustar00rootroot00000000000000sql-formatter-1.2.17/.gitignore000066400000000000000000000000101226454031000163560ustar00rootroot00000000000000vendor/ sql-formatter-1.2.17/.travis.yml000066400000000000000000000001031226454031000165020ustar00rootroot00000000000000language: php php: - 5.4 - 5.3 script: phpunit --coverage-text sql-formatter-1.2.17/LICENSE.txt000066400000000000000000000021161226454031000162220ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2013 Jeremy Dorn Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. sql-formatter-1.2.17/README.md000066400000000000000000000105321226454031000156570ustar00rootroot00000000000000SqlFormatter ============= A lightweight php class for formatting sql statements. It can automatically indent and add line breaks in addition to syntax highlighting. History ============ I found myself having to debug auto-generated SQL statements all the time and wanted some way to easily output formatted HTML without having to include a huge library or copy and paste into online formatters. I was originally planning to extract the formatting code from PhpMyAdmin, but that was 10,000+ lines of code and used global variables. I saw that other people had the same problem and used Stack Overflow user losif's answer as a starting point. http://stackoverflow.com/a/3924147 Usage ============ The SqlFormatter class has a static method 'format' which takes a SQL string as input and returns a formatted HTML block inside a pre tag. Sample usage: ```php = NOW()) ) GROUP BY Column1 ORDER BY Column3 DESC LIMIT 5,10"; echo SqlFormatter::format($query); ``` Output: ![](http://jdorn.github.com/sql-formatter/format-highlight.png) Formatting Only ------------------------- If you don't want syntax highlighting and only want the indentations and line breaks, pass in false as the second parameter. This is useful for outputting to error logs or other non-html formats. ```php =5.2.4" }, "require-dev": { "phpunit/phpunit": "3.7.*" }, "authors": [ { "name": "Jeremy Dorn", "email": "jeremy@jeremydorn.com", "homepage": "http://jeremydorn.com/" } ], "autoload": { "classmap": ["lib"] }, "extra": { "branch-alias": { "dev-master": "1.3.x-dev" } } } sql-formatter-1.2.17/composer.lock000066400000000000000000000336321226454031000171070ustar00rootroot00000000000000{ "hash": "a709b40d4a35e7077aa40fbd0f78f6c6", "packages": [ ], "packages-dev": [ { "name": "phpunit/php-code-coverage", "version": "1.2.x-dev", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", "reference": "1.2.9" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/1.2.9", "reference": "1.2.9", "shasum": "" }, "require": { "php": ">=5.3.3", "phpunit/php-file-iterator": ">=1.3.0@stable", "phpunit/php-text-template": ">=1.1.1@stable", "phpunit/php-token-stream": ">=1.1.3@stable" }, "suggest": { "ext-dom": "*", "ext-xdebug": ">=2.0.5" }, "type": "library", "autoload": { "classmap": [ "PHP/" ] }, "notification-url": "https://packagist.org/downloads/", "include-path": [ "" ], "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", "homepage": "https://github.com/sebastianbergmann/php-code-coverage", "keywords": [ "coverage", "testing", "xunit" ], "time": "2013-02-26 18:55:56" }, { "name": "phpunit/php-file-iterator", "version": "dev-master", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", "reference": "2deb24c65ea78e126daa8d45b2089ddc29ec1d26" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/2deb24c65ea78e126daa8d45b2089ddc29ec1d26", "reference": "2deb24c65ea78e126daa8d45b2089ddc29ec1d26", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "autoload": { "classmap": [ "File/" ] }, "notification-url": "https://packagist.org/downloads/", "include-path": [ "" ], "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "FilterIterator implementation that filters files based on a list of suffixes.", "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", "keywords": [ "filesystem", "iterator" ], "time": "2013-01-07 10:47:05" }, { "name": "phpunit/php-text-template", "version": "dev-master", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", "reference": "1eeef106193d2f8c539728e566bb4793071a9e18" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/1eeef106193d2f8c539728e566bb4793071a9e18", "reference": "1eeef106193d2f8c539728e566bb4793071a9e18", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "autoload": { "classmap": [ "Text/" ] }, "notification-url": "https://packagist.org/downloads/", "include-path": [ "" ], "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "Simple template engine.", "homepage": "https://github.com/sebastianbergmann/php-text-template/", "keywords": [ "template" ], "time": "2013-01-07 10:56:17" }, { "name": "phpunit/php-timer", "version": "1.0.x-dev", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", "reference": "ecf7920b27003a9412b07dad79dbb5ad1249e6c3" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/ecf7920b27003a9412b07dad79dbb5ad1249e6c3", "reference": "ecf7920b27003a9412b07dad79dbb5ad1249e6c3", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "autoload": { "classmap": [ "PHP/" ] }, "notification-url": "https://packagist.org/downloads/", "include-path": [ "" ], "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "Utility class for timing", "homepage": "https://github.com/sebastianbergmann/php-timer/", "keywords": [ "timer" ], "time": "2013-01-30 06:08:51" }, { "name": "phpunit/php-token-stream", "version": "dev-master", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", "reference": "c25dd88e1592e66dee2553c99ef244203d5a1b98" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/c25dd88e1592e66dee2553c99ef244203d5a1b98", "reference": "c25dd88e1592e66dee2553c99ef244203d5a1b98", "shasum": "" }, "require": { "ext-tokenizer": "*", "php": ">=5.3.3" }, "type": "library", "autoload": { "classmap": [ "PHP/" ] }, "notification-url": "https://packagist.org/downloads/", "include-path": [ "" ], "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "Wrapper around PHP's tokenizer extension.", "homepage": "https://github.com/sebastianbergmann/php-token-stream/", "keywords": [ "tokenizer" ], "time": "2013-01-07 10:56:35" }, { "name": "phpunit/phpunit", "version": "3.7.x-dev", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", "reference": "2c67e52445416bb7c14046b432acd7eb79e4e612" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2c67e52445416bb7c14046b432acd7eb79e4e612", "reference": "2c67e52445416bb7c14046b432acd7eb79e4e612", "shasum": "" }, "require": { "ext-dom": "*", "ext-pcre": "*", "ext-reflection": "*", "ext-spl": "*", "php": ">=5.3.3", "phpunit/php-code-coverage": ">=1.2.1,<1.3.0", "phpunit/php-file-iterator": ">=1.3.1", "phpunit/php-text-template": ">=1.1.1", "phpunit/php-timer": ">=1.0.2,<1.1.0", "phpunit/phpunit-mock-objects": ">=1.2.0,<1.3.0", "symfony/yaml": ">=2.2.0" }, "require-dev": { "pear-pear/pear": "1.9.4" }, "suggest": { "ext-json": "*", "ext-simplexml": "*", "ext-tokenizer": "*", "phpunit/php-invoker": ">=1.1.0,<1.2.0" }, "bin": [ "composer/bin/phpunit" ], "type": "library", "extra": { "branch-alias": { "dev-master": "3.7.x-dev" } }, "autoload": { "classmap": [ "PHPUnit/" ] }, "notification-url": "https://packagist.org/downloads/", "include-path": [ "", "../../symfony/yaml/" ], "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "The PHP Unit Testing framework.", "homepage": "http://www.phpunit.de/", "keywords": [ "phpunit", "testing", "xunit" ], "time": "2013-03-11 07:06:05" }, { "name": "phpunit/phpunit-mock-objects", "version": "1.2.x-dev", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", "reference": "d49b5683200b5db9b1c64cb06f52f50d147891c4" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/d49b5683200b5db9b1c64cb06f52f50d147891c4", "reference": "d49b5683200b5db9b1c64cb06f52f50d147891c4", "shasum": "" }, "require": { "php": ">=5.3.3", "phpunit/php-text-template": ">=1.1.1@stable" }, "suggest": { "ext-soap": "*" }, "type": "library", "autoload": { "classmap": [ "PHPUnit/" ] }, "notification-url": "https://packagist.org/downloads/", "include-path": [ "" ], "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "Mock Object library for PHPUnit", "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", "keywords": [ "mock", "xunit" ], "time": "2013-02-05 07:46:41" }, { "name": "symfony/yaml", "version": "dev-master", "target-dir": "Symfony/Component/Yaml", "source": { "type": "git", "url": "https://github.com/symfony/Yaml.git", "reference": "f198ac28048eeceae852419c076123aaee59cd1c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/Yaml/zipball/f198ac28048eeceae852419c076123aaee59cd1c", "reference": "f198ac28048eeceae852419c076123aaee59cd1c", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.3-dev" } }, "autoload": { "psr-0": { "Symfony\\Component\\Yaml\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony Yaml Component", "homepage": "http://symfony.com", "time": "2013-01-31 21:39:01" } ], "aliases": [ ], "minimum-stability": "dev", "stability-flags": [ ], "platform": { "php": ">=5.2.4" }, "platform-dev": [ ] } sql-formatter-1.2.17/examples/000077500000000000000000000000001226454031000162155ustar00rootroot00000000000000sql-formatter-1.2.17/examples/cli.php000066400000000000000000000012441226454031000174760ustar00rootroot00000000000000Run this php script from the command line to see CLI syntax highlighting and formatting. It support Unix pipes or command line argument style.

"; echo "
php examples/cli.php \"SELECT * FROM MyTable WHERE (id>5 AND \\`name\\` LIKE \\"testing\\");\"
"; echo "
echo \"SELECT * FROM MyTable WHERE (id>5 AND \\`name\\` LIKE \\"testing\\");\" | php examples/cli.php
"; } if(isset($argv[1])) { $sql = $argv[1]; } else { $sql = stream_get_contents(fopen("php://stdin", "r")); } require_once(__DIR__.'/../lib/SqlFormatter.php'); echo SqlFormatter::format($sql); sql-formatter-1.2.17/examples/examples.php000066400000000000000000000145751226454031000205600ustar00rootroot00000000000000 SqlFormatter Examples = DATE_FORMAT((DATE_SUB(NOW(),INTERVAL 1 DAY)),'%Y-%c-%d') AND t_create < DATE_FORMAT(NOW(), '%Y-%c-%d') ORDER BY d.id LIMIT 2,10) a, orc_scheme_detail b WHERE a.id = b.id", "SELECT * from Table1 LEFT OUTER JOIN Table2 on Table1.id = Table2.id", "SELECT * FROM MyTable WHERE id = 46", "SELECT count(*),`Column1` as count,`Testing`, `Testing Three` FROM `Table1` WHERE Column1 = 'testing' AND ( (`Column2` = `Column3` OR Column4 >= NOW()) ) GROUP BY Column1 ORDER BY Column3 DESC LIMIT 5,10", "select * from `Table`, (SELECT group_concat(column1) as col FROM Table2 GROUP BY category) Table2, Table3 where Table2.col = (Table3.col2 - `Table`.id)", "insert ignore into Table3 (column1, column2) VALUES ('test1','test2'), ('test3','test4');", "UPDATE MyTable SET name='sql', category='databases' WHERE id > '65'", "delete from MyTable WHERE name LIKE \"test%\"", "SELECT * FROM UnmatchedParens WHERE ( A = B)) AND (((Test=1)", "-- This is a comment SELECT /* This is another comment On more than one line */ Id #This is one final comment as temp, DateCreated as Created FROM MyTable;", ); // Example statements for splitting SQL strings into individual queries $split_statements = array( "DROP TABLE IF EXISTS MyTable; CREATE TABLE MyTable ( id int ); INSERT INTO MyTable (id) VALUES (1),(2),(3),(4); SELECT * FROM MyTable;", "SELECT \";\"; SELECT \";\\\"; a;\"; SELECT \"; abc\"; SELECT a,b #comment; FROM test;", " -- Drop the table first if it exists DROP TABLE IF EXISTS MyTable; -- Create the table CREATE TABLE MyTable ( id int ); -- Insert values INSERT INTO MyTable (id) VALUES (1),(2),(3),(4); -- Done", ); // Example statements for removing comments $comment_statements = array( "-- This is a comment SELECT /* This is another comment On more than one line */ Id #This is one final comment as temp, DateCreated as Created FROM MyTable;", ); ?>

Formatting And Syntax Highlighting

Usage:
    '); ?>
    
Original Formatted And Highlighted

Formatting Only

Usage:
    '); ?>
    
Original Formatted

Syntax Highlighting Only

Usage:
    '); ?>
    
Original Highlighted

Compress Query

Usage:
    '); ?>
    
Original Compressed

Splitting SQL Strings Into Individual Queries

Usage:
    '); ?>
    
Original Split
"; foreach ($queries as $query) { echo "
  • " . SqlFormatter::highlight($query) . "
  • "; } echo ""; ?>

    Removing Comments

    Usage:
        '); ?>
        
    Original Comments Removed
    sql-formatter-1.2.17/lib/000077500000000000000000000000001226454031000151455ustar00rootroot00000000000000sql-formatter-1.2.17/lib/SqlFormatter.php000066400000000000000000001276131226454031000203130ustar00rootroot00000000000000 * @author Florin Patan * @copyright 2013 Jeremy Dorn * @license http://opensource.org/licenses/MIT * @link http://github.com/jdorn/sql-formatter * @version 1.2.17 */ class SqlFormatter { // Constants for token types const TOKEN_TYPE_WHITESPACE = 0; const TOKEN_TYPE_WORD = 1; const TOKEN_TYPE_QUOTE = 2; const TOKEN_TYPE_BACKTICK_QUOTE = 3; const TOKEN_TYPE_RESERVED = 4; const TOKEN_TYPE_RESERVED_TOPLEVEL = 5; const TOKEN_TYPE_RESERVED_NEWLINE = 6; const TOKEN_TYPE_BOUNDARY = 7; const TOKEN_TYPE_COMMENT = 8; const TOKEN_TYPE_BLOCK_COMMENT = 9; const TOKEN_TYPE_NUMBER = 10; const TOKEN_TYPE_ERROR = 11; const TOKEN_TYPE_VARIABLE = 12; // Constants for different components of a token const TOKEN_TYPE = 0; const TOKEN_VALUE = 1; // Reserved words (for syntax highlighting) protected static $reserved = array( 'ACCESSIBLE', 'ACTION', 'AGAINST', 'AGGREGATE', 'ALGORITHM', 'ALL', 'ALTER', 'ANALYSE', 'ANALYZE', 'AS', 'ASC', 'AUTOCOMMIT', 'AUTO_INCREMENT', 'BACKUP', 'BEGIN', 'BETWEEN', 'BINLOG', 'BOTH', 'CASCADE', 'CASE', 'CHANGE', 'CHANGED', 'CHARACTER SET', 'CHARSET', 'CHECK', 'CHECKSUM', 'COLLATE', 'COLLATION', 'COLUMN', 'COLUMNS', 'COMMENT', 'COMMIT', 'COMMITTED', 'COMPRESSED', 'CONCURRENT', 'CONSTRAINT', 'CONTAINS', 'CONVERT', 'CREATE', 'CROSS', 'CURRENT_TIMESTAMP', 'DATABASE', 'DATABASES', 'DAY', 'DAY_HOUR', 'DAY_MINUTE', 'DAY_SECOND', 'DEFAULT', 'DEFINER', 'DELAYED', 'DELETE', 'DESC', 'DESCRIBE', 'DETERMINISTIC', 'DISTINCT', 'DISTINCTROW', 'DIV', 'DO', 'DUMPFILE', 'DUPLICATE', 'DYNAMIC', 'ELSE', 'ENCLOSED', 'END', 'ENGINE', 'ENGINE_TYPE', 'ENGINES', 'ESCAPE', 'ESCAPED', 'EVENTS', 'EXECUTE', 'EXISTS', 'EXPLAIN', 'EXTENDED', 'FAST', 'FIELDS', 'FILE', 'FIRST', 'FIXED', 'FLUSH', 'FOR', 'FORCE', 'FOREIGN', 'FULL', 'FULLTEXT', 'FUNCTION', 'GLOBAL', 'GRANT', 'GRANTS', 'GROUP_CONCAT', 'HEAP', 'HIGH_PRIORITY', 'HOSTS', 'HOUR', 'HOUR_MINUTE', 'HOUR_SECOND', 'IDENTIFIED', 'IF', 'IFNULL', 'IGNORE', 'IN', 'INDEX', 'INDEXES', 'INFILE', 'INSERT', 'INSERT_ID', 'INSERT_METHOD', 'INTERVAL', 'INTO', 'INVOKER', 'IS', 'ISOLATION', 'KEY', 'KEYS', 'KILL', 'LAST_INSERT_ID', 'LEADING', 'LEVEL', 'LIKE', 'LINEAR', 'LINES', 'LOAD', 'LOCAL', 'LOCK', 'LOCKS', 'LOGS', 'LOW_PRIORITY', 'MARIA', 'MASTER', 'MASTER_CONNECT_RETRY', 'MASTER_HOST', 'MASTER_LOG_FILE', 'MATCH','MAX_CONNECTIONS_PER_HOUR', 'MAX_QUERIES_PER_HOUR', 'MAX_ROWS', 'MAX_UPDATES_PER_HOUR', 'MAX_USER_CONNECTIONS', 'MEDIUM', 'MERGE', 'MINUTE', 'MINUTE_SECOND', 'MIN_ROWS', 'MODE', 'MODIFY', 'MONTH', 'MRG_MYISAM', 'MYISAM', 'NAMES', 'NATURAL', 'NOT', 'NOW()','NULL', 'OFFSET', 'ON', 'OPEN', 'OPTIMIZE', 'OPTION', 'OPTIONALLY', 'ON UPDATE', 'ON DELETE', 'OUTFILE', 'PACK_KEYS', 'PAGE', 'PARTIAL', 'PARTITION', 'PARTITIONS', 'PASSWORD', 'PRIMARY', 'PRIVILEGES', 'PROCEDURE', 'PROCESS', 'PROCESSLIST', 'PURGE', 'QUICK', 'RANGE', 'RAID0', 'RAID_CHUNKS', 'RAID_CHUNKSIZE','RAID_TYPE', 'READ', 'READ_ONLY', 'READ_WRITE', 'REFERENCES', 'REGEXP', 'RELOAD', 'RENAME', 'REPAIR', 'REPEATABLE', 'REPLACE', 'REPLICATION', 'RESET', 'RESTORE', 'RESTRICT', 'RETURN', 'RETURNS', 'REVOKE', 'RLIKE', 'ROLLBACK', 'ROW', 'ROWS', 'ROW_FORMAT', 'SECOND', 'SECURITY', 'SEPARATOR', 'SERIALIZABLE', 'SESSION', 'SHARE', 'SHOW', 'SHUTDOWN', 'SLAVE', 'SONAME', 'SOUNDS', 'SQL', 'SQL_AUTO_IS_NULL', 'SQL_BIG_RESULT', 'SQL_BIG_SELECTS', 'SQL_BIG_TABLES', 'SQL_BUFFER_RESULT', 'SQL_CALC_FOUND_ROWS', 'SQL_LOG_BIN', 'SQL_LOG_OFF', 'SQL_LOG_UPDATE', 'SQL_LOW_PRIORITY_UPDATES', 'SQL_MAX_JOIN_SIZE', 'SQL_QUOTE_SHOW_CREATE', 'SQL_SAFE_UPDATES', 'SQL_SELECT_LIMIT', 'SQL_SLAVE_SKIP_COUNTER', 'SQL_SMALL_RESULT', 'SQL_WARNINGS', 'SQL_CACHE', 'SQL_NO_CACHE', 'START', 'STARTING', 'STATUS', 'STOP', 'STORAGE', 'STRAIGHT_JOIN', 'STRING', 'STRIPED', 'SUPER', 'TABLE', 'TABLES', 'TEMPORARY', 'TERMINATED', 'THEN', 'TO', 'TRAILING', 'TRANSACTIONAL', 'TRUE', 'TRUNCATE', 'TYPE', 'TYPES', 'UNCOMMITTED', 'UNIQUE', 'UNLOCK', 'UNSIGNED', 'USAGE', 'USE', 'USING', 'VARIABLES', 'VIEW', 'WHEN', 'WITH', 'WORK', 'WRITE', 'YEAR_MONTH' ); // For SQL formatting // These keywords will all be on their own line protected static $reserved_toplevel = array( 'SELECT', 'FROM', 'WHERE', 'SET', 'ORDER BY', 'GROUP BY', 'LIMIT', 'DROP', 'VALUES', 'UPDATE', 'HAVING', 'ADD', 'AFTER', 'ALTER TABLE', 'DELETE FROM', 'UNION ALL', 'UNION', 'EXCEPT', 'INTERSECT' ); protected static $reserved_newline = array( 'LEFT OUTER JOIN', 'RIGHT OUTER JOIN', 'LEFT JOIN', 'RIGHT JOIN', 'OUTER JOIN', 'INNER JOIN', 'JOIN', 'XOR', 'OR', 'AND' ); protected static $functions = array ( 'ABS', 'ACOS', 'ADDDATE', 'ADDTIME', 'AES_DECRYPT', 'AES_ENCRYPT', 'AREA', 'ASBINARY', 'ASCII', 'ASIN', 'ASTEXT', 'ATAN', 'ATAN2', 'AVG', 'BDMPOLYFROMTEXT', 'BDMPOLYFROMWKB', 'BDPOLYFROMTEXT', 'BDPOLYFROMWKB', 'BENCHMARK', 'BIN', 'BIT_AND', 'BIT_COUNT', 'BIT_LENGTH', 'BIT_OR', 'BIT_XOR', 'BOUNDARY', 'BUFFER', 'CAST', 'CEIL', 'CEILING', 'CENTROID', 'CHAR', 'CHARACTER_LENGTH', 'CHARSET', 'CHAR_LENGTH', 'COALESCE', 'COERCIBILITY', 'COLLATION', 'COMPRESS', 'CONCAT', 'CONCAT_WS', 'CONNECTION_ID', 'CONTAINS', 'CONV', 'CONVERT', 'CONVERT_TZ', 'CONVEXHULL', 'COS', 'COT', 'COUNT', 'CRC32', 'CROSSES', 'CURDATE', 'CURRENT_DATE', 'CURRENT_TIME', 'CURRENT_TIMESTAMP', 'CURRENT_USER', 'CURTIME', 'DATABASE', 'DATE', 'DATEDIFF', 'DATE_ADD', 'DATE_DIFF', 'DATE_FORMAT', 'DATE_SUB', 'DAY', 'DAYNAME', 'DAYOFMONTH', 'DAYOFWEEK', 'DAYOFYEAR', 'DECODE', 'DEFAULT', 'DEGREES', 'DES_DECRYPT', 'DES_ENCRYPT', 'DIFFERENCE', 'DIMENSION', 'DISJOINT', 'DISTANCE', 'ELT', 'ENCODE', 'ENCRYPT', 'ENDPOINT', 'ENVELOPE', 'EQUALS', 'EXP', 'EXPORT_SET', 'EXTERIORRING', 'EXTRACT', 'EXTRACTVALUE', 'FIELD', 'FIND_IN_SET', 'FLOOR', 'FORMAT', 'FOUND_ROWS', 'FROM_DAYS', 'FROM_UNIXTIME', 'GEOMCOLLFROMTEXT', 'GEOMCOLLFROMWKB', 'GEOMETRYCOLLECTION', 'GEOMETRYCOLLECTIONFROMTEXT', 'GEOMETRYCOLLECTIONFROMWKB', 'GEOMETRYFROMTEXT', 'GEOMETRYFROMWKB', 'GEOMETRYN', 'GEOMETRYTYPE', 'GEOMFROMTEXT', 'GEOMFROMWKB', 'GET_FORMAT', 'GET_LOCK', 'GLENGTH', 'GREATEST', 'GROUP_CONCAT', 'GROUP_UNIQUE_USERS', 'HEX', 'HOUR', 'IF', 'IFNULL', 'INET_ATON', 'INET_NTOA', 'INSERT', 'INSTR', 'INTERIORRINGN', 'INTERSECTION', 'INTERSECTS', 'INTERVAL', 'ISCLOSED', 'ISEMPTY', 'ISNULL', 'ISRING', 'ISSIMPLE', 'IS_FREE_LOCK', 'IS_USED_LOCK', 'LAST_DAY', 'LAST_INSERT_ID', 'LCASE', 'LEAST', 'LEFT', 'LENGTH', 'LINEFROMTEXT', 'LINEFROMWKB', 'LINESTRING', 'LINESTRINGFROMTEXT', 'LINESTRINGFROMWKB', 'LN', 'LOAD_FILE', 'LOCALTIME', 'LOCALTIMESTAMP', 'LOCATE', 'LOG', 'LOG10', 'LOG2', 'LOWER', 'LPAD', 'LTRIM', 'MAKEDATE', 'MAKETIME', 'MAKE_SET', 'MASTER_POS_WAIT', 'MAX', 'MBRCONTAINS', 'MBRDISJOINT', 'MBREQUAL', 'MBRINTERSECTS', 'MBROVERLAPS', 'MBRTOUCHES', 'MBRWITHIN', 'MD5', 'MICROSECOND', 'MID', 'MIN', 'MINUTE', 'MLINEFROMTEXT', 'MLINEFROMWKB', 'MOD', 'MONTH', 'MONTHNAME', 'MPOINTFROMTEXT', 'MPOINTFROMWKB', 'MPOLYFROMTEXT', 'MPOLYFROMWKB', 'MULTILINESTRING', 'MULTILINESTRINGFROMTEXT', 'MULTILINESTRINGFROMWKB', 'MULTIPOINT', 'MULTIPOINTFROMTEXT', 'MULTIPOINTFROMWKB', 'MULTIPOLYGON', 'MULTIPOLYGONFROMTEXT', 'MULTIPOLYGONFROMWKB', 'NAME_CONST', 'NULLIF', 'NUMGEOMETRIES', 'NUMINTERIORRINGS', 'NUMPOINTS', 'OCT', 'OCTET_LENGTH', 'OLD_PASSWORD', 'ORD', 'OVERLAPS', 'PASSWORD', 'PERIOD_ADD', 'PERIOD_DIFF', 'PI', 'POINT', 'POINTFROMTEXT', 'POINTFROMWKB', 'POINTN', 'POINTONSURFACE', 'POLYFROMTEXT', 'POLYFROMWKB', 'POLYGON', 'POLYGONFROMTEXT', 'POLYGONFROMWKB', 'POSITION', 'POW', 'POWER', 'QUARTER', 'QUOTE', 'RADIANS', 'RAND', 'RELATED', 'RELEASE_LOCK', 'REPEAT', 'REPLACE', 'REVERSE', 'RIGHT', 'ROUND', 'ROW_COUNT', 'RPAD', 'RTRIM', 'SCHEMA', 'SECOND', 'SEC_TO_TIME', 'SESSION_USER', 'SHA', 'SHA1', 'SIGN', 'SIN', 'SLEEP', 'SOUNDEX', 'SPACE', 'SQRT', 'SRID', 'STARTPOINT', 'STD', 'STDDEV', 'STDDEV_POP', 'STDDEV_SAMP', 'STRCMP', 'STR_TO_DATE', 'SUBDATE', 'SUBSTR', 'SUBSTRING', 'SUBSTRING_INDEX', 'SUBTIME', 'SUM', 'SYMDIFFERENCE', 'SYSDATE', 'SYSTEM_USER', 'TAN', 'TIME', 'TIMEDIFF', 'TIMESTAMP', 'TIMESTAMPADD', 'TIMESTAMPDIFF', 'TIME_FORMAT', 'TIME_TO_SEC', 'TOUCHES', 'TO_DAYS', 'TRIM', 'TRUNCATE', 'UCASE', 'UNCOMPRESS', 'UNCOMPRESSED_LENGTH', 'UNHEX', 'UNIQUE_USERS', 'UNIX_TIMESTAMP', 'UPDATEXML', 'UPPER', 'USER', 'UTC_DATE', 'UTC_TIME', 'UTC_TIMESTAMP', 'UUID', 'VARIANCE', 'VAR_POP', 'VAR_SAMP', 'VERSION', 'WEEK', 'WEEKDAY', 'WEEKOFYEAR', 'WITHIN', 'X', 'Y', 'YEAR', 'YEARWEEK' ); // Punctuation that can be used as a boundary between other tokens protected static $boundaries = array(',', ';',':', ')', '(', '.', '=', '<', '>', '+', '-', '*', '/', '!', '^', '%', '|', '&', '#'); // For HTML syntax highlighting // Styles applied to different token types public static $quote_attributes = 'style="color: blue;"'; public static $backtick_quote_attributes = 'style="color: purple;"'; public static $reserved_attributes = 'style="font-weight:bold;"'; public static $boundary_attributes = ''; public static $number_attributes = 'style="color: green;"'; public static $word_attributes = 'style="color: #333;"'; public static $error_attributes = 'style="background-color: red;"'; public static $comment_attributes = 'style="color: #aaa;"'; public static $variable_attributes = 'style="color: orange;"'; public static $pre_attributes = 'style="color: black; background-color: white;"'; // Boolean - whether or not the current environment is the CLI // This affects the type of syntax highlighting // If not defined, it will be determined automatically public static $cli; // For CLI syntax highlighting public static $cli_quote = "\x1b[34;1m"; public static $cli_backtick_quote = "\x1b[35;1m"; public static $cli_reserved = "\x1b[37m"; public static $cli_boundary = ""; public static $cli_number = "\x1b[32;1m"; public static $cli_word = ""; public static $cli_error = "\x1b[31;1;7m"; public static $cli_comment = "\x1b[30;1m"; public static $cli_functions = "\x1b[37m"; public static $cli_variable = "\x1b[36;1m"; // The tab character to use when formatting SQL public static $tab = ' '; // This flag tells us if queries need to be enclosed in
     tags
        public static $use_pre = true;
    
        // This flag tells us if SqlFormatted has been initialized
        protected static $init;
    
        // Regular expressions for tokenizing
        protected static $regex_boundaries;
        protected static $regex_reserved;
        protected static $regex_reserved_newline;
        protected static $regex_reserved_toplevel;
        protected static $regex_function;
    
        // Cache variables
        // Only tokens shorter than this size will be cached.  Somewhere between 10 and 20 seems to work well for most cases.
        public static $max_cachekey_size = 15;
        protected static $token_cache = array();
        protected static $cache_hits = 0;
        protected static $cache_misses = 0;
    
        /**
         * Get stats about the token cache
         * @return Array An array containing the keys 'hits', 'misses', 'entries', and 'size' in bytes
         */
        public static function getCacheStats()
        {
            return array(
                'hits'=>self::$cache_hits,
                'misses'=>self::$cache_misses,
                'entries'=>count(self::$token_cache),
                'size'=>strlen(serialize(self::$token_cache))
            );
        }
    
        /**
         * Stuff that only needs to be done once.  Builds regular expressions and sorts the reserved words.
         */
        protected static function init()
        {
            if (self::$init) return;
    
            // Sort reserved word list from longest word to shortest, 3x faster than usort
            $reservedMap = array_combine(self::$reserved, array_map('strlen', self::$reserved));
            arsort($reservedMap);
            self::$reserved = array_keys($reservedMap);
    
            // Set up regular expressions
            self::$regex_boundaries = '('.implode('|',array_map(array(__CLASS__, 'quote_regex'),self::$boundaries)).')';
            self::$regex_reserved = '('.implode('|',array_map(array(__CLASS__, 'quote_regex'),self::$reserved)).')';
            self::$regex_reserved_toplevel = str_replace(' ','\\s+','('.implode('|',array_map(array(__CLASS__, 'quote_regex'),self::$reserved_toplevel)).')');
            self::$regex_reserved_newline = str_replace(' ','\\s+','('.implode('|',array_map(array(__CLASS__, 'quote_regex'),self::$reserved_newline)).')');
    
            self::$regex_function = '('.implode('|',array_map(array(__CLASS__, 'quote_regex'),self::$functions)).')';
    
            self::$init = true;
        }
    
        /**
         * Return the next token and token type in a SQL string.
         * Quoted strings, comments, reserved words, whitespace, and punctuation are all their own tokens.
         *
         * @param String $string   The SQL string
         * @param array  $previous The result of the previous getNextToken() call
         *
         * @return Array An associative array containing the type and value of the token.
         */
        protected static function getNextToken($string, $previous = null)
        {
            // Whitespace
            if (preg_match('/^\s+/',$string,$matches)) {
                return array(
                    self::TOKEN_VALUE => $matches[0],
                    self::TOKEN_TYPE=>self::TOKEN_TYPE_WHITESPACE
                );
            }
    
            // Comment
            if ($string[0] === '#' || (isset($string[1])&&($string[0]==='-'&&$string[1]==='-') || ($string[0]==='/'&&$string[1]==='*'))) {
                // Comment until end of line
                if ($string[0] === '-' || $string[0] === '#') {
                    $last = strpos($string, "\n");
                    $type = self::TOKEN_TYPE_COMMENT;
                } else { // Comment until closing comment tag
                    $last = strpos($string, "*/", 2) + 2;
                    $type = self::TOKEN_TYPE_BLOCK_COMMENT;
                }
    
                if ($last === false) {
                    $last = strlen($string);
                }
    
                return array(
                    self::TOKEN_VALUE => substr($string, 0, $last),
                    self::TOKEN_TYPE  => $type
                );
            }
    
            // Quoted String
            if ($string[0]==='"' || $string[0]==='\'' || $string[0]==='`') {
                $return = array(
                    self::TOKEN_TYPE => ($string[0]==='`'? self::TOKEN_TYPE_BACKTICK_QUOTE : self::TOKEN_TYPE_QUOTE),
                    self::TOKEN_VALUE => self::getQuotedString($string)
                );
    
                return $return;
            }
    
            // User-defined Variable
            if ($string[0] === '@' && isset($string[1])) {
                $ret = array(
                    self::TOKEN_VALUE => null,
                    self::TOKEN_TYPE => self::TOKEN_TYPE_VARIABLE
                );
                
                // If the variable name is quoted
                if ($string[1]==='"' || $string[1]==='\'' || $string[1]==='`') {
                    $ret[self::TOKEN_VALUE] = '@'.self::getQuotedString(substr($string,1));
                }
                // Non-quoted variable name
                else {
                    preg_match('/^(@[a-zA-Z0-9\._\$]+)/',$string,$matches);
                    if ($matches) {
                        $ret[self::TOKEN_VALUE] = $matches[1];
                    }
                }
                
                if($ret[self::TOKEN_VALUE] !== null) return $ret;
            }
    
            // Number (decimal, binary, or hex)
            if (preg_match('/^([0-9]+(\.[0-9]+)?|0x[0-9a-fA-F]+|0b[01]+)($|\s|"\'`|'.self::$regex_boundaries.')/',$string,$matches)) {
                return array(
                    self::TOKEN_VALUE => $matches[1],
                    self::TOKEN_TYPE=>self::TOKEN_TYPE_NUMBER
                );
            }
    
            // Boundary Character (punctuation and symbols)
            if (preg_match('/^('.self::$regex_boundaries.')/',$string,$matches)) {
                return array(
                    self::TOKEN_VALUE => $matches[1],
                    self::TOKEN_TYPE  => self::TOKEN_TYPE_BOUNDARY
                );
            }
    
            // A reserved word cannot be preceded by a '.'
            // this makes it so in "mytable.from", "from" is not considered a reserved word
            if (!$previous || !isset($previous[self::TOKEN_VALUE]) || $previous[self::TOKEN_VALUE] !== '.') {
                $upper = strtoupper($string);
                // Top Level Reserved Word
                if (preg_match('/^('.self::$regex_reserved_toplevel.')($|\s|'.self::$regex_boundaries.')/', $upper,$matches)) {
                    return array(
                        self::TOKEN_TYPE=>self::TOKEN_TYPE_RESERVED_TOPLEVEL,
                        self::TOKEN_VALUE=>substr($string,0,strlen($matches[1]))
                    );
                }
                // Newline Reserved Word
                if (preg_match('/^('.self::$regex_reserved_newline.')($|\s|'.self::$regex_boundaries.')/', $upper,$matches)) {
                    return array(
                        self::TOKEN_TYPE=>self::TOKEN_TYPE_RESERVED_NEWLINE,
                        self::TOKEN_VALUE=>substr($string,0,strlen($matches[1]))
                    );
                }
                // Other Reserved Word
                if (preg_match('/^('.self::$regex_reserved.')($|\s|'.self::$regex_boundaries.')/', $upper,$matches)) {
                    return array(
                        self::TOKEN_TYPE=>self::TOKEN_TYPE_RESERVED,
                        self::TOKEN_VALUE=>substr($string,0,strlen($matches[1]))
                    );
                }
            }
    
            // A function must be suceeded by '('
            // this makes it so "count(" is considered a function, but "count" alone is not
            $upper = strtoupper($string);
            // function
            if (preg_match('/^('.self::$regex_function.'[(]|\s|[)])/', $upper,$matches)) {
                return array(
                    self::TOKEN_TYPE=>self::TOKEN_TYPE_RESERVED,
                    self::TOKEN_VALUE=>substr($string,0,strlen($matches[1])-1)
                );
            }
    
            // Non reserved word
            preg_match('/^(.*?)($|\s|["\'`]|'.self::$regex_boundaries.')/',$string,$matches);
    
            return array(
                self::TOKEN_VALUE => $matches[1],
                self::TOKEN_TYPE  => self::TOKEN_TYPE_WORD
            );
        }
    
        protected static function getQuotedString($string)
        {
            $ret = null;
            
            // This checks for the following patterns:
            // 1. backtick quoted string using `` to escape
            // 2. double quoted string using "" or \" to escape
            // 3. single quoted string using '' or \' to escape
            if ( preg_match('/^(((`[^`]*($|`))+)|(("[^"\\\\]*(?:\\\\.[^"\\\\]*)*("|$))+)|((\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*(\'|$))+))/s', $string, $matches)) {
                $ret = $matches[1];
            }
            
            return $ret;
        }
    
        /**
         * Takes a SQL string and breaks it into tokens.
         * Each token is an associative array with type and value.
         *
         * @param String $string The SQL string
         *
         * @return Array An array of tokens.
         */
        protected static function tokenize($string)
        {
            self::init();
    
            $tokens = array();
    
            // Used for debugging if there is an error while tokenizing the string
            $original_length = strlen($string);
    
            // Used to make sure the string keeps shrinking on each iteration
            $old_string_len = strlen($string) + 1;
    
            $token = null;
    
            $current_length = strlen($string);
    
            // Keep processing the string until it is empty
            while ($current_length) {
                // If the string stopped shrinking, there was a problem
                if ($old_string_len <= $current_length) {
                    $tokens[] = array(
                        self::TOKEN_VALUE=>$string,
                        self::TOKEN_TYPE=>self::TOKEN_TYPE_ERROR
                    );
    
                    return $tokens;
                }
                $old_string_len =  $current_length;
    
                // Determine if we can use caching
                if ($current_length >= self::$max_cachekey_size) {
                    $cacheKey = substr($string,0,self::$max_cachekey_size);
                } else {
                    $cacheKey = false;
                }
    
                // See if the token is already cached
                if ($cacheKey && isset(self::$token_cache[$cacheKey])) {
                    // Retrieve from cache
                    $token = self::$token_cache[$cacheKey];
                    $token_length = strlen($token[self::TOKEN_VALUE]);
                    self::$cache_hits++;
                } else {
                    // Get the next token and the token type
                    $token = self::getNextToken($string, $token);
                    $token_length = strlen($token[self::TOKEN_VALUE]);
                    self::$cache_misses++;
    
                    // If the token is shorter than the max length, store it in cache
                    if ($cacheKey && $token_length < self::$max_cachekey_size) {
                        self::$token_cache[$cacheKey] = $token;
                    }
                }
    
                $tokens[] = $token;
    
                // Advance the string
                $string = substr($string, $token_length);
    
                $current_length -= $token_length;
            }
    
            return $tokens;
        }
    
        /**
         * Format the whitespace in a SQL string to make it easier to read.
         *
         * @param String  $string    The SQL string
         * @param boolean $highlight If true, syntax highlighting will also be performed
         *
         * @return String The SQL string with HTML styles and formatting wrapped in a 
     tag
         */
        public static function format($string, $highlight=true)
        {
            // This variable will be populated with formatted html
            $return = '';
    
            // Use an actual tab while formatting and then switch out with self::$tab at the end
            $tab = "\t";
    
            $indent_level = 0;
            $newline = false;
            $inline_parentheses = false;
            $increase_special_indent = false;
            $increase_block_indent = false;
            $indent_types = array();
            $added_newline = false;
            $inline_count = 0;
            $inline_indented = false;
            $clause_limit = false;
    
            // Tokenize String
            $original_tokens = self::tokenize($string);
    
            // Remove existing whitespace
            $tokens = array();
            foreach ($original_tokens as $i=>$token) {
                if ($token[self::TOKEN_TYPE] !== self::TOKEN_TYPE_WHITESPACE) {
                    $token['i'] = $i;
                    $tokens[] = $token;
                }
            }
    
            // Format token by token
            foreach ($tokens as $i=>$token) {
                // Get highlighted token if doing syntax highlighting
                if ($highlight) {
                    $highlighted = self::highlightToken($token);
                } else { // If returning raw text
                    $highlighted = $token[self::TOKEN_VALUE];
                }
    
                // If we are increasing the special indent level now
                if ($increase_special_indent) {
                    $indent_level++;
                    $increase_special_indent = false;
                    array_unshift($indent_types,'special');
                }
                // If we are increasing the block indent level now
                if ($increase_block_indent) {
                    $indent_level++;
                    $increase_block_indent = false;
                    array_unshift($indent_types,'block');
                }
    
                // If we need a new line before the token
                if ($newline) {
                    $return .= "\n" . str_repeat($tab, $indent_level);
                    $newline = false;
                    $added_newline = true;
                } else {
                    $added_newline = false;
                }
    
                // Display comments directly where they appear in the source
                if ($token[self::TOKEN_TYPE] === self::TOKEN_TYPE_COMMENT || $token[self::TOKEN_TYPE] === self::TOKEN_TYPE_BLOCK_COMMENT) {
                    if ($token[self::TOKEN_TYPE] === self::TOKEN_TYPE_BLOCK_COMMENT) {
                        $indent = str_repeat($tab,$indent_level);
                        $return .= "\n" . $indent;
                        $highlighted = str_replace("\n","\n".$indent,$highlighted);
                    }
    
                    $return .= $highlighted;
                    $newline = true;
                    continue;
                }
    
                if ($inline_parentheses) {
                    // End of inline parentheses
                    if ($token[self::TOKEN_VALUE] === ')') {
                        $return = rtrim($return,' ');
    
                        if ($inline_indented) {
                            array_shift($indent_types);
                            $indent_level --;
                            $return .= "\n" . str_repeat($tab, $indent_level);
                        }
    
                        $inline_parentheses = false;
    
                        $return .= $highlighted . ' ';
                        continue;
                    }
    
                    if ($token[self::TOKEN_VALUE] === ',') {
                        if ($inline_count >= 30) {
                            $inline_count = 0;
                            $newline = true;
                        }
                    }
    
                    $inline_count += strlen($token[self::TOKEN_VALUE]);
                }
    
                // Opening parentheses increase the block indent level and start a new line
                if ($token[self::TOKEN_VALUE] === '(') {
                    // First check if this should be an inline parentheses block
                    // Examples are "NOW()", "COUNT(*)", "int(10)", key(`somecolumn`), DECIMAL(7,2)
                    // Allow up to 3 non-whitespace tokens inside inline parentheses
                    $length = 0;
                    for ($j=1;$j<=250;$j++) {
                        // Reached end of string
                        if (!isset($tokens[$i+$j])) break;
    
                        $next = $tokens[$i+$j];
    
                        // Reached closing parentheses, able to inline it
                        if ($next[self::TOKEN_VALUE] === ')') {
                            $inline_parentheses = true;
                            $inline_count = 0;
                            $inline_indented = false;
                            break;
                        }
    
                        // Reached an invalid token for inline parentheses
                        if ($next[self::TOKEN_VALUE]===';' || $next[self::TOKEN_VALUE]==='(') {
                            break;
                        }
    
                        // Reached an invalid token type for inline parentheses
                        if ($next[self::TOKEN_TYPE]===self::TOKEN_TYPE_RESERVED_TOPLEVEL || $next[self::TOKEN_TYPE]===self::TOKEN_TYPE_RESERVED_NEWLINE || $next[self::TOKEN_TYPE]===self::TOKEN_TYPE_COMMENT || $next[self::TOKEN_TYPE]===self::TOKEN_TYPE_BLOCK_COMMENT) {
                            break;
                        }
    
                        $length += strlen($next[self::TOKEN_VALUE]);
                    }
    
                    if ($inline_parentheses && $length > 30) {
                        $increase_block_indent = true;
                        $inline_indented = true;
                        $newline = true;
                    }
    
                    // Take out the preceding space unless there was whitespace there in the original query
                    if (isset($original_tokens[$token['i']-1]) && $original_tokens[$token['i']-1][self::TOKEN_TYPE] !== self::TOKEN_TYPE_WHITESPACE) {
                        $return = rtrim($return,' ');
                    }
    
                    if (!$inline_parentheses) {
                        $increase_block_indent = true;
                        // Add a newline after the parentheses
                        $newline = true;
                    }
    
                }
    
                // Closing parentheses decrease the block indent level
                elseif ($token[self::TOKEN_VALUE] === ')') {
                    // Remove whitespace before the closing parentheses
                    $return = rtrim($return,' ');
    
                    $indent_level--;
    
                    // Reset indent level
                    while ($j=array_shift($indent_types)) {
                        if ($j==='special') {
                            $indent_level--;
                        } else {
                            break;
                        }
                    }
    
                    if ($indent_level < 0) {
                        // This is an error
                        $indent_level = 0;
    
                        if ($highlight) {
                            $return .= "\n".self::highlightError($token[self::TOKEN_VALUE]);
                            continue;
                        }
                    }
    
                    // Add a newline before the closing parentheses (if not already added)
                    if (!$added_newline) {
                        $return .= "\n" . str_repeat($tab, $indent_level);
                    }
                }
    
                // Top level reserved words start a new line and increase the special indent level
                elseif ($token[self::TOKEN_TYPE] === self::TOKEN_TYPE_RESERVED_TOPLEVEL) {
                    $increase_special_indent = true;
    
                    // If the last indent type was 'special', decrease the special indent for this round
                    reset($indent_types);
                    if (current($indent_types)==='special') {
                        $indent_level--;
                        array_shift($indent_types);
                    }
    
                    // Add a newline after the top level reserved word
                    $newline = true;
                    // Add a newline before the top level reserved word (if not already added)
                    if (!$added_newline) {
                        $return .= "\n" . str_repeat($tab, $indent_level);
                    }
                    // If we already added a newline, redo the indentation since it may be different now
                    else {
                        $return = rtrim($return,$tab).str_repeat($tab, $indent_level);
                    }
    
                    // If the token may have extra whitespace
                    if (strpos($token[self::TOKEN_VALUE],' ')!==false || strpos($token[self::TOKEN_VALUE],"\n")!==false || strpos($token[self::TOKEN_VALUE],"\t")!==false) {
                        $highlighted = preg_replace('/\s+/',' ',$highlighted);
                    }
                    //if SQL 'LIMIT' clause, start variable to reset newline
                    if ($token[self::TOKEN_VALUE] === 'LIMIT' && !$inline_parentheses) {
                        $clause_limit = true;
                    }
                }
    
                // Checks if we are out of the limit clause
                elseif ($clause_limit && $token[self::TOKEN_VALUE] !== "," && $token[self::TOKEN_TYPE] !== self::TOKEN_TYPE_NUMBER && $token[self::TOKEN_TYPE] !== self::TOKEN_TYPE_WHITESPACE) {
                    $clause_limit = false;
                }
    
                // Commas start a new line (unless within inline parentheses or SQL 'LIMIT' clause)
                elseif ($token[self::TOKEN_VALUE] === ',' && !$inline_parentheses) {
                    //If the previous TOKEN_VALUE is 'LIMIT', resets new line
                    if ($clause_limit === true) {
                        $newline = false;
                        $clause_limit = false;
                    }
                    // All other cases of commas
                    else {
                        $newline = true;
                    }
                }
    
                // Newline reserved words start a new line
                elseif ($token[self::TOKEN_TYPE] === self::TOKEN_TYPE_RESERVED_NEWLINE) {
                    // Add a newline before the reserved word (if not already added)
                    if (!$added_newline) {
                        $return .= "\n" . str_repeat($tab, $indent_level);
                    }
    
                    // If the token may have extra whitespace
                    if (strpos($token[self::TOKEN_VALUE],' ')!==false || strpos($token[self::TOKEN_VALUE],"\n")!==false || strpos($token[self::TOKEN_VALUE],"\t")!==false) {
                        $highlighted = preg_replace('/\s+/',' ',$highlighted);
                    }
                }
    
                // Multiple boundary characters in a row should not have spaces between them (not including parentheses)
                elseif ($token[self::TOKEN_TYPE] === self::TOKEN_TYPE_BOUNDARY) {
                    if (isset($tokens[$i-1]) && $tokens[$i-1][self::TOKEN_TYPE] === self::TOKEN_TYPE_BOUNDARY) {
                        if (isset($original_tokens[$token['i']-1]) && $original_tokens[$token['i']-1][self::TOKEN_TYPE] !== self::TOKEN_TYPE_WHITESPACE) {
                            $return = rtrim($return,' ');
                        }
                    }
                }
    
                // If the token shouldn't have a space before it
                if ($token[self::TOKEN_VALUE] === '.' || $token[self::TOKEN_VALUE] === ',' || $token[self::TOKEN_VALUE] === ';') {
                    $return = rtrim($return, ' ');
                }
    
                $return .= $highlighted.' ';
    
                // If the token shouldn't have a space after it
                if ($token[self::TOKEN_VALUE] === '(' || $token[self::TOKEN_VALUE] === '.') {
                    $return = rtrim($return,' ');
                }
                
                // If this is the "-" of a negative number, it shouldn't have a space after it
                if($token[self::TOKEN_VALUE] === '-' && isset($tokens[$i+1]) && $tokens[$i+1][self::TOKEN_TYPE] === self::TOKEN_TYPE_NUMBER && isset($tokens[$i-1])) {
                    $prev = $tokens[$i-1][self::TOKEN_TYPE];
                    if($prev !== self::TOKEN_TYPE_QUOTE && $prev !== self::TOKEN_TYPE_BACKTICK_QUOTE && $prev !== self::TOKEN_TYPE_WORD && $prev !== self::TOKEN_TYPE_NUMBER) {
                        $return = rtrim($return,' ');
                    }
                } 
            }
    
            // If there are unmatched parentheses
            if ($highlight && array_search('block',$indent_types) !== false) {
                $return .= "\n".self::highlightError("WARNING: unclosed parentheses or section");
            }
    
            // Replace tab characters with the configuration tab character
            $return = trim(str_replace("\t",self::$tab,$return));
    
            if ($highlight) {
                $return = self::output($return);
            }
    
            return $return;
        }
    
        /**
         * Add syntax highlighting to a SQL string
         *
         * @param String $string The SQL string
         *
         * @return String The SQL string with HTML styles applied
         */
        public static function highlight($string)
        {
            $tokens = self::tokenize($string);
    
            $return = '';
    
            foreach ($tokens as $token) {
                $return .= self::highlightToken($token);
            }
    
            return self::output($return);
        }
    
        /**
         * Split a SQL string into multiple queries.
         * Uses ";" as a query delimiter.
         *
         * @param String $string The SQL string
         *
         * @return Array An array of individual query strings without trailing semicolons
         */
        public static function splitQuery($string)
        {
            $queries = array();
            $current_query = '';
            $empty = true;
    
            $tokens = self::tokenize($string);
    
            foreach ($tokens as $token) {
                // If this is a query separator
                if ($token[self::TOKEN_VALUE] === ';') {
                    if (!$empty) {
                        $queries[] = $current_query.';';
                    }
                    $current_query = '';
                    $empty = true;
                    continue;
                }
    
                // If this is a non-empty character
                if ($token[self::TOKEN_TYPE] !== self::TOKEN_TYPE_WHITESPACE && $token[self::TOKEN_TYPE] !== self::TOKEN_TYPE_COMMENT && $token[self::TOKEN_TYPE] !== self::TOKEN_TYPE_BLOCK_COMMENT) {
                    $empty = false;
                }
    
                $current_query .= $token[self::TOKEN_VALUE];
            }
    
            if (!$empty) {
                $queries[] = trim($current_query);
            }
    
            return $queries;
        }
    
        /**
         * Remove all comments from a SQL string
         *
         * @param String $string The SQL string
         *
         * @return String The SQL string without comments
         */
        public static function removeComments($string)
        {
            $result = '';
    
            $tokens = self::tokenize($string);
    
            foreach ($tokens as $token) {
                // Skip comment tokens
                if ($token[self::TOKEN_TYPE] === self::TOKEN_TYPE_COMMENT || $token[self::TOKEN_TYPE] === self::TOKEN_TYPE_BLOCK_COMMENT) {
                    continue;
                }
    
                $result .= $token[self::TOKEN_VALUE];
            }
            $result = self::format( $result,false);
    
            return $result;
        }
    
        /**
         * Compress a query by collapsing white space and removing comments
         *
         * @param String $string The SQL string
         *
         * @return String The SQL string without comments
         */
        public static function compress($string)
        {
            $result = '';
    
            $tokens = self::tokenize($string);
    
            $whitespace = true;
            foreach ($tokens as $token) {
                // Skip comment tokens
                if ($token[self::TOKEN_TYPE] === self::TOKEN_TYPE_COMMENT || $token[self::TOKEN_TYPE] === self::TOKEN_TYPE_BLOCK_COMMENT) {
                    continue;
                }
                // Remove extra whitespace in reserved words (e.g "OUTER     JOIN" becomes "OUTER JOIN")
                elseif ($token[self::TOKEN_TYPE] === self::TOKEN_TYPE_RESERVED || $token[self::TOKEN_TYPE] === self::TOKEN_TYPE_RESERVED_NEWLINE || $token[self::TOKEN_TYPE] === self::TOKEN_TYPE_RESERVED_TOPLEVEL) {
                    $token[self::TOKEN_VALUE] = preg_replace('/\s+/',' ',$token[self::TOKEN_VALUE]);
                }
    
                if ($token[self::TOKEN_TYPE] === self::TOKEN_TYPE_WHITESPACE) {
                    // If the last token was whitespace, don't add another one
                    if ($whitespace) {
                        continue;
                    } else {
                        $whitespace = true;
                        // Convert all whitespace to a single space
                        $token[self::TOKEN_VALUE] = ' ';
                    }
                } else {
                    $whitespace = false;
                }
    
                $result .= $token[self::TOKEN_VALUE];
            }
    
            return rtrim($result);
        }
    
        /**
         * Highlights a token depending on its type.
         *
         * @param Array $token An associative array containing type and value.
         *
         * @return String HTML code of the highlighted token.
         */
        protected static function highlightToken($token)
        {
            $type = $token[self::TOKEN_TYPE];
    
            if (self::is_cli()) {
                $token = $token[self::TOKEN_VALUE];
            } else {
                $token = htmlentities($token[self::TOKEN_VALUE],ENT_COMPAT,'UTF-8');
            }
    
            if ($type===self::TOKEN_TYPE_BOUNDARY) {
                return self::highlightBoundary($token);
            } elseif ($type===self::TOKEN_TYPE_WORD) {
                return self::highlightWord($token);
            } elseif ($type===self::TOKEN_TYPE_BACKTICK_QUOTE) {
                return self::highlightBacktickQuote($token);
            } elseif ($type===self::TOKEN_TYPE_QUOTE) {
                return self::highlightQuote($token);
            } elseif ($type===self::TOKEN_TYPE_RESERVED) {
                return self::highlightReservedWord($token);
            } elseif ($type===self::TOKEN_TYPE_RESERVED_TOPLEVEL) {
                return self::highlightReservedWord($token);
            } elseif ($type===self::TOKEN_TYPE_RESERVED_NEWLINE) {
                return self::highlightReservedWord($token);
            } elseif ($type===self::TOKEN_TYPE_NUMBER) {
                return self::highlightNumber($token);
            } elseif ($type===self::TOKEN_TYPE_VARIABLE) {
                return self::highlightVariable($token);
            } elseif ($type===self::TOKEN_TYPE_COMMENT || $type===self::TOKEN_TYPE_BLOCK_COMMENT) {
                return self::highlightComment($token);
            }
    
            return $token;
        }
    
        /**
         * Highlights a quoted string
         *
         * @param String $value The token's value
         *
         * @return String HTML code of the highlighted token.
         */
        protected static function highlightQuote($value)
        {
            if (self::is_cli()) {
                return self::$cli_quote . $value . "\x1b[0m";
            } else {
                return '' . $value . '';
            }
        }
    
        /**
         * Highlights a backtick quoted string
         *
         * @param String $value The token's value
         *
         * @return String HTML code of the highlighted token.
         */
        protected static function highlightBacktickQuote($value)
        {
            if (self::is_cli()) {
                return self::$cli_backtick_quote . $value . "\x1b[0m";
            } else {
                return '' . $value . '';
            }
        }
    
        /**
         * Highlights a reserved word
         *
         * @param String $value The token's value
         *
         * @return String HTML code of the highlighted token.
         */
        protected static function highlightReservedWord($value)
        {
            if (self::is_cli()) {
                return self::$cli_reserved . $value . "\x1b[0m";
            } else {
                return '' . $value . '';
            }
        }
    
        /**
         * Highlights a boundary token
         *
         * @param String $value The token's value
         *
         * @return String HTML code of the highlighted token.
         */
        protected static function highlightBoundary($value)
        {
            if ($value==='(' || $value===')') return $value;
    
            if (self::is_cli()) {
                return self::$cli_boundary . $value . "\x1b[0m";
            } else {
                return '' . $value . '';
            }
        }
    
        /**
         * Highlights a number
         *
         * @param String $value The token's value
         *
         * @return String HTML code of the highlighted token.
         */
        protected static function highlightNumber($value)
        {
            if (self::is_cli()) {
                return self::$cli_number . $value . "\x1b[0m";
            } else {
                return '' . $value . '';
            }
        }
    
        /**
         * Highlights an error
         *
         * @param String $value The token's value
         *
         * @return String HTML code of the highlighted token.
         */
        protected static function highlightError($value)
        {
            if (self::is_cli()) {
                return self::$cli_error . $value . "\x1b[0m";
            } else {
                return '' . $value . '';
            }
        }
    
        /**
         * Highlights a comment
         *
         * @param String $value The token's value
         *
         * @return String HTML code of the highlighted token.
         */
        protected static function highlightComment($value)
        {
            if (self::is_cli()) {
                return self::$cli_comment . $value . "\x1b[0m";
            } else {
                return '' . $value . '';
            }
        }
    
        /**
         * Highlights a word token
         *
         * @param String $value The token's value
         *
         * @return String HTML code of the highlighted token.
         */
        protected static function highlightWord($value)
        {
            if (self::is_cli()) {
                return self::$cli_word . $value . "\x1b[0m";
            } else {
                return '' . $value . '';
            }
        }
    
        /**
         * Highlights a variable token
         *
         * @param String $value The token's value
         *
         * @return String HTML code of the highlighted token.
         */
        protected static function highlightVariable($value)
        {
            if (self::is_cli()) {
                return self::$cli_variable . $value . "\x1b[0m";
            } else {
                return '' . $value . '';
            }
        }
    
        /**
         * Helper function for building regular expressions for reserved words and boundary characters
         *
         * @param String $a The string to be quoted
         *
         * @return String The quoted string
         */
        private static function quote_regex($a)
        {
            return preg_quote($a,'/');
        }
    
        /**
         * Helper function for building string output
         *
         * @param String $string The string to be quoted
         *
         * @return String The quoted string
         */
        private static function output($string)
        {
            if (self::is_cli()) {
                return $string."\n";
            } else {
                $string=trim($string);
                if (!self::$use_pre) {
                    return $string;
                }
    
                return '
    ' . $string . '
    '; } } private static function is_cli() { if (isset(self::$cli)) return self::$cli; else return php_sapi_name() === 'cli'; } } sql-formatter-1.2.17/phpunit.xml.dist000066400000000000000000000010211226454031000175440ustar00rootroot00000000000000 ./tests ./ ./tests ./vendor ./examples sql-formatter-1.2.17/tests/000077500000000000000000000000001226454031000155415ustar00rootroot00000000000000sql-formatter-1.2.17/tests/SqlFormatterTest.php000066400000000000000000000116141226454031000215400ustar00rootroot00000000000000assertEquals(trim($html), trim(SqlFormatter::format($sql))); } /** * @dataProvider formatData */ function testFormat($sql, $html) { $this->assertEquals(trim($html), trim(SqlFormatter::format($sql, false))); } /** * @dataProvider highlightData */ function testHighlight($sql, $html) { $this->assertEquals(trim($html), trim(SqlFormatter::highlight($sql))); } /** * @dataProvider highlightCliData */ function testCliHighlight($sql, $html) { SqlFormatter::$cli = true; $this->assertEquals(trim($html), trim(SqlFormatter::format($sql))); SqlFormatter::$cli = false; } /** * @dataProvider compressData */ function testCompress($sql, $html) { $this->assertEquals(trim($html), trim(SqlFormatter::compress($sql))); } function testUsePre() { SqlFormatter::$use_pre = false; $actual = SqlFormatter::highlight("test"); $expected = 'test'; $this->assertEquals($actual,$expected); SqlFormatter::$use_pre = true; $actual = SqlFormatter::highlight("test"); $expected = '
    test
    '; $this->assertEquals($actual,$expected); } function testSplitQuery() { $expected = array( "SELECT 'test' FROM MyTable;", "SELECT Column2 FROM SomeOther Table WHERE (test = true);" ); $actual = SqlFormatter::splitQuery(implode(';',$expected)); $this->assertEquals($expected, $actual); } function testSplitQueryEmpty() { $sql = "SELECT 1;SELECT 2;\n-- This is a comment\n;SELECT 3"; $expected = array("SELECT 1;","SELECT 2;","SELECT 3"); $actual = SqlFormatter::splitQuery($sql); $this->assertEquals($expected, $actual); } function testRemoveComments() { $expected = SqlFormatter::format("SELECT\n * FROM\n MyTable",false); $sql = "/* this is a comment */SELECT#This is another comment\n * FROM-- One final comment\n MyTable"; $actual = SqlFormatter::removeComments($sql); $this->assertEquals($expected, $actual); } function testCacheStats() { $stats = SqlFormatter::getCacheStats(); $this->assertGreaterThan(1,$stats['hits']); } function formatHighlightData() { $formatHighlightData = explode("\n\n",file_get_contents(__DIR__."/format-highlight.html")); $sqlData = $this->sqlData(); $return = array(); foreach($formatHighlightData as $i=>$data) { $return[] = array( $sqlData[$i], $data ); } return $return; } function highlightCliData() { $clidata = explode("\n\n",file_get_contents(__DIR__."/clihighlight.html")); $sqlData = $this->sqlData(); $return = array(); foreach($clidata as $i=>$data) { $return[] = array( $sqlData[$i], $data ); } return $return; } function formatData() { $formatData = explode("\n\n",file_get_contents(__DIR__."/format.html")); $sqlData = $this->sqlData(); $return = array(); foreach($formatData as $i=>$data) { $return[] = array( $sqlData[$i], $data ); } return $return; } function compressData() { $compressData = explode("\n\n",file_get_contents(__DIR__."/compress.html")); $sqlData = $this->sqlData(); $return = array(); foreach($compressData as $i=>$data) { $return[] = array( $sqlData[$i], $data ); } return $return; } function highlightData() { $highlightData = explode("\n\n",file_get_contents(__DIR__."/highlight.html")); $sqlData = $this->sqlData(); $return = array(); foreach($highlightData as $i=>$data) { $return[] = array( $sqlData[$i], $data ); } return $return; } function sqlData() { if(!$this->sqlData) { $this->sqlData = explode("\n\n",file_get_contents(__DIR__."/sql.sql")); } /** $formatHighlight = array(); $highlight = array(); $format = array(); $compress = array(); $clihighlight = array(); foreach($this->sqlData as $sql) { $formatHighlight[] = trim(SqlFormatter::format($sql)); $highlight[] = trim(SqlFormatter::highlight($sql)); $format[] = trim(SqlFormatter::format($sql, false)); $compress[] = trim(SqlFormatter::compress($sql)); SqlFormatter::$cli = true; $clihighlight[] = trim(SqlFormatter::format($sql)); SqlFormatter::$cli = false; } file_put_contents(__DIR__."/format-highlight.html", implode("\n\n",$formatHighlight)); file_put_contents(__DIR__."/highlight.html", implode("\n\n",$highlight)); file_put_contents(__DIR__."/format.html", implode("\n\n",$format)); file_put_contents(__DIR__."/compress.html", implode("\n\n",$compress)); file_put_contents(__DIR__."/clihighlight.html", implode("\n\n",$clihighlight)); /**/ return $this->sqlData; } } sql-formatter-1.2.17/tests/clihighlight.html000066400000000000000000000665621226454031000211050ustar00rootroot00000000000000SELECT customer_id, customer_name, COUNT(order_id) as total FROM customers INNER JOIN orders ON customers.customer_id = orders.customer_id GROUP BY customer_id, customer_name HAVING COUNT(order_id) > 5 ORDER BY COUNT(order_id) DESC; UPDATE customers SET totalorders = ordersummary.total FROM ( SELECT customer_id, count(order_id) As total FROM orders GROUP BY customer_id ) As ordersummary WHERE customers.customer_id = ordersummary.customer_id SELECT * FROM sometable UNION ALL SELECT * FROM someothertable; SET NAMES 'utf8'; CREATE TABLE `PREFIX_address` ( `id_address` int(10) unsigned NOT NULL auto_increment, `id_country` int(10) unsigned NOT NULL, `id_state` int(10) unsigned default NULL, `id_customer` int(10) unsigned NOT NULL default '0', `id_manufacturer` int(10) unsigned NOT NULL default '0', `id_supplier` int(10) unsigned NOT NULL default '0', `id_warehouse` int(10) unsigned NOT NULL default '0', `alias` varchar(32) NOT NULL, `company` varchar(64) default NULL, `lastname` varchar(32) NOT NULL, `firstname` varchar(32) NOT NULL, `address1` varchar(128) NOT NULL, `address2` varchar(128) default NULL, `postcode` varchar(12) default NULL, `city` varchar(64) NOT NULL, `other` text, `phone` varchar(16) default NULL, `phone_mobile` varchar(16) default NULL, `vat_number` varchar(32) default NULL, `dni` varchar(16) DEFAULT NULL, `date_add` datetime NOT NULL, `date_upd` datetime NOT NULL, `active` tinyint(1) unsigned NOT NULL default '1', `deleted` tinyint(1) unsigned NOT NULL default '0', PRIMARY KEY (`id_address`), KEY `address_customer` (`id_customer`), KEY `id_country` (`id_country`), KEY `id_state` (`id_state`), KEY `id_manufacturer` (`id_manufacturer`), KEY `id_supplier` (`id_supplier`), KEY `id_warehouse` (`id_warehouse`) ) ENGINE = ENGINE_TYPE DEFAULT CHARSET = utf8 CREATE TABLE `PREFIX_alias` ( `id_alias` int(10) unsigned NOT NULL auto_increment, `alias` varchar(255) NOT NULL, `search` varchar(255) NOT NULL, `active` tinyint(1) NOT NULL default '1', PRIMARY KEY (`id_alias`), UNIQUE KEY `alias` (`alias`) ) ENGINE = ENGINE_TYPE DEFAULT CHARSET = utf8 CREATE TABLE `PREFIX_carrier` ( `id_carrier` int(10) unsigned NOT NULL AUTO_INCREMENT, `id_reference` int(10) unsigned NOT NULL, `id_tax_rules_group` int(10) unsigned DEFAULT '0', `name` varchar(64) NOT NULL, `url` varchar(255) DEFAULT NULL, `active` tinyint(1) unsigned NOT NULL DEFAULT '0', `deleted` tinyint(1) unsigned NOT NULL DEFAULT '0', `shipping_handling` tinyint(1) unsigned NOT NULL DEFAULT '1', `range_behavior` tinyint(1) unsigned NOT NULL DEFAULT '0', `is_module` tinyint(1) unsigned NOT NULL DEFAULT '0', `is_free` tinyint(1) unsigned NOT NULL DEFAULT '0', `shipping_external` tinyint(1) unsigned NOT NULL DEFAULT '0', `need_range` tinyint(1) unsigned NOT NULL DEFAULT '0', `external_module_name` varchar(64) DEFAULT NULL, `shipping_method` int(2) NOT NULL DEFAULT '0', `position` int(10) unsigned NOT NULL default '0', `max_width` int(10) DEFAULT 0, `max_height` int(10) DEFAULT 0, `max_depth` int(10) DEFAULT 0, `max_weight` int(10) DEFAULT 0, `grade` int(10) DEFAULT 0, PRIMARY KEY (`id_carrier`), KEY `deleted` (`deleted`, `active`), KEY `id_tax_rules_group` (`id_tax_rules_group`) ) ENGINE = ENGINE_TYPE DEFAULT CHARSET = utf8 CREATE TABLE IF NOT EXISTS `PREFIX_specific_price_rule` ( `id_specific_price_rule` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, `id_shop` int(11) unsigned NOT NULL DEFAULT '1', `id_currency` int(10) unsigned NOT NULL, `id_country` int(10) unsigned NOT NULL, `id_group` int(10) unsigned NOT NULL, `from_quantity` mediumint(8) unsigned NOT NULL, `price` DECIMAL(20, 6), `reduction` decimal(20, 6) NOT NULL, `reduction_type` enum('amount', 'percentage') NOT NULL, `from` datetime NOT NULL, `to` datetime NOT NULL, PRIMARY KEY (`id_specific_price_rule`), KEY `id_product` ( `id_shop`, `id_currency`, `id_country`, `id_group`, `from_quantity`, `from`, `to` ) ) ENGINE = ENGINE_TYPE DEFAULT CHARSET = utf8 UPDATE `PREFIX_configuration` SET value = '6' WHERE name = 'PS_SEARCH_WEIGHT_PNAME' UPDATE `PREFIX_hook_module` SET position = 1 WHERE id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayPayment' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'cheque' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayPaymentReturn' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'cheque' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayHome' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'homeslider' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionAuthentication' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'statsdata' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionShopDataDuplication' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'homeslider' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayTop' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'blocklanguages' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionCustomerAccountAdd' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'statsdata' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayCustomerAccount' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'favoriteproducts' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayAdminStatsModules' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'statsvisits' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayAdminStatsGraphEngine' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'graphvisifire' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayAdminStatsGridEngine' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'gridhtml' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayLeftColumnProduct' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'blocksharefb' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionSearch' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'statssearch' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionCategoryAdd' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'blockcategories' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionCategoryUpdate' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'blockcategories' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionCategoryDelete' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'blockcategories' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionAdminMetaSave' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'blockcategories' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayMyAccountBlock' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'favoriteproducts' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayFooter' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'blockreinsurance' ) ALTER TABLE `PREFIX_employee` ADD `bo_color` varchar(32) default NULL AFTER `stats_date_to` INSERT INTO `PREFIX_cms_category_lang` VALUES ( 1, 3, 'Inicio', '', 'home', NULL, NULL, NULL ) INSERT INTO `PREFIX_cms_category` VALUES (1, 0, 0, 1, NOW(), NOW(), 0) UPDATE `PREFIX_cms_category` SET `position` = 0 ALTER TABLE `PREFIX_customer` ADD `note` text AFTER `secure_key` ALTER TABLE `PREFIX_contact` ADD `customer_service` tinyint(1) NOT NULL DEFAULT 0 AFTER `email` INSERT INTO `PREFIX_specific_price` ( `id_product`, `id_shop`, `id_currency`, `id_country`, `id_group`, `priority`, `price`, `from_quantity`, `reduction`, `reduction_type`, `from`, `to` ) ( SELECT dq.`id_product`, 1, 1, 0, 1, 0, 0.00, dq.`quantity`, IF( dq.`id_discount_type` = 2, dq.`value`, dq.`value` / 100 ), IF ( dq.`id_discount_type` = 2, 'amount', 'percentage' ), '0000-00-00 00:00:00', '0000-00-00 00:00:00' FROM `PREFIX_discount_quantity` dq INNER JOIN `PREFIX_product` p ON (p.`id_product` = dq.`id_product`) ) DROP TABLE `PREFIX_discount_quantity` INSERT INTO `PREFIX_specific_price` ( `id_product`, `id_shop`, `id_currency`, `id_country`, `id_group`, `priority`, `price`, `from_quantity`, `reduction`, `reduction_type`, `from`, `to` ) ( SELECT p.`id_product`, 1, 0, 0, 0, 0, 0.00, 1, IF( p.`reduction_price` > 0, p.`reduction_price`, p.`reduction_percent` / 100 ), IF( p.`reduction_price` > 0, 'amount', 'percentage' ), IF ( p.`reduction_from` = p.`reduction_to`, '0000-00-00 00:00:00', p.`reduction_from` ), IF ( p.`reduction_from` = p.`reduction_to`, '0000-00-00 00:00:00', p.`reduction_to` ) FROM `PREFIX_product` p WHERE p.`reduction_price` OR p.`reduction_percent` ) ALTER TABLE `PREFIX_product` DROP `reduction_price`, DROP `reduction_percent`, DROP `reduction_from`, DROP `reduction_to` INSERT INTO `PREFIX_configuration` ( `name`, `value`, `date_add`, `date_upd` ) VALUES ( 'PS_SPECIFIC_PRICE_PRIORITIES', 'id_shop;id_currency;id_country;id_group', NOW(), NOW() ), ('PS_TAX_DISPLAY', 0, NOW(), NOW()), ( 'PS_SMARTY_FORCE_COMPILE', 1, NOW(), NOW() ), ( 'PS_DISTANCE_UNIT', 'km', NOW(), NOW() ), ( 'PS_STORES_DISPLAY_CMS', 0, NOW(), NOW() ), ( 'PS_STORES_DISPLAY_FOOTER', 0, NOW(), NOW() ), ( 'PS_STORES_SIMPLIFIED', 0, NOW(), NOW() ), ( 'PS_STATSDATA_CUSTOMER_PAGESVIEWS', 1, NOW(), NOW() ), ( 'PS_STATSDATA_PAGESVIEWS', 1, NOW(), NOW() ), ( 'PS_STATSDATA_PLUGINS', 1, NOW(), NOW() ) INSERT INTO `PREFIX_configuration` ( `name`, `value`, `date_add`, `date_upd` ) VALUES ( 'PS_CONDITIONS_CMS_ID', IFNULL( ( SELECT `id_cms` FROM `PREFIX_cms` WHERE `id_cms` = 3 ), 0 ), NOW(), NOW() ) CREATE TEMPORARY TABLE `PREFIX_configuration_tmp` (`value` text) SET @defaultOOS = ( SELECT value FROM `PREFIX_configuration` WHERE name = 'PS_ORDER_OUT_OF_STOCK' ) UPDATE `PREFIX_product` p SET `cache_default_attribute` = 0 WHERE `id_product` NOT IN ( SELECT `id_product` FROM `PREFIX_product_attribute` ) INSERT INTO `PREFIX_hook` ( `name`, `title`, `description`, `position` ) VALUES ( 'processCarrier', 'Carrier Process', NULL, 0 ) INSERT INTO `PREFIX_stock_mvt_reason_lang` ( `id_stock_mvt_reason`, `id_lang`, `name` ) VALUES (1, 1, 'Order'), (1, 2, 'Commande'), (2, 1, 'Missing Stock Movement'), ( 2, 2, 'Mouvement de stock manquant' ), (3, 1, 'Restocking'), (3, 2, 'Réassort') INSERT INTO `PREFIX_meta_lang` ( `id_lang`, `id_meta`, `title`, `url_rewrite` ) VALUES ( 1, ( SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'authentication' ), 'Authentication', 'authentication' ), ( 2, ( SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'authentication' ), 'Authentification', 'authentification' ), ( 3, ( SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'authentication' ), 'Autenticación', 'autenticacion' ) LOCK TABLES `admin_assert` WRITE UNLOCK TABLES DROP TABLE IF EXISTS `admin_role` SELECT * FROM -- This is another comment MyTable # One final comment /* This is a block comment */ WHERE 1 = 2; SELECT -- This is a test SELECT Test FROM Test WHERE (MyColumn = 1) ) AND ( ( (SomeOtherColumn = 2); WARNING: unclosed parentheses or section SELECT * LIMIT 1; SELECT a, b, c, d FROM e LIMIT 1, 2; SELECT 1, 2, 3 WHERE a in (1, 2, 3, 4, 5) and b = 5; SELECT count - 50 WHERE a - 50 = b WHERE 1 and -50 WHERE -50 = a WHERE a = -50 WHERE 1 /*test*/ -50 WHERE 1 and -50; SELECT @ and b; SELECT @"weird variable name"; SELECT "no closing quote sql-formatter-1.2.17/tests/compress.html000066400000000000000000000262051226454031000202670ustar00rootroot00000000000000SELECT customer_id, customer_name, COUNT(order_id) as total FROM customers INNER JOIN orders ON customers.customer_id = orders.customer_id GROUP BY customer_id, customer_name HAVING COUNT(order_id) > 5 ORDER BY COUNT(order_id) DESC; UPDATE customers SET totalorders = ordersummary.total FROM (SELECT customer_id, count(order_id) As total FROM orders GROUP BY customer_id) As ordersummary WHERE customers.customer_id = ordersummary.customer_id SELECT * FROM sometable UNION ALL SELECT * FROM someothertable; SET NAMES 'utf8'; CREATE TABLE `PREFIX_address` ( `id_address` int(10) unsigned NOT NULL auto_increment, `id_country` int(10) unsigned NOT NULL, `id_state` int(10) unsigned default NULL, `id_customer` int(10) unsigned NOT NULL default '0', `id_manufacturer` int(10) unsigned NOT NULL default '0', `id_supplier` int(10) unsigned NOT NULL default '0', `id_warehouse` int(10) unsigned NOT NULL default '0', `alias` varchar(32) NOT NULL, `company` varchar(64) default NULL, `lastname` varchar(32) NOT NULL, `firstname` varchar(32) NOT NULL, `address1` varchar(128) NOT NULL, `address2` varchar(128) default NULL, `postcode` varchar(12) default NULL, `city` varchar(64) NOT NULL, `other` text, `phone` varchar(16) default NULL, `phone_mobile` varchar(16) default NULL, `vat_number` varchar(32) default NULL, `dni` varchar(16) DEFAULT NULL, `date_add` datetime NOT NULL, `date_upd` datetime NOT NULL, `active` tinyint(1) unsigned NOT NULL default '1', `deleted` tinyint(1) unsigned NOT NULL default '0', PRIMARY KEY (`id_address`), KEY `address_customer` (`id_customer`), KEY `id_country` (`id_country`), KEY `id_state` (`id_state`), KEY `id_manufacturer` (`id_manufacturer`), KEY `id_supplier` (`id_supplier`), KEY `id_warehouse` (`id_warehouse`) ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8 CREATE TABLE `PREFIX_alias` ( `id_alias` int(10) unsigned NOT NULL auto_increment, `alias` varchar(255) NOT NULL, `search` varchar(255) NOT NULL, `active` tinyint(1) NOT NULL default '1', PRIMARY KEY (`id_alias`), UNIQUE KEY `alias` (`alias`) ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8 CREATE TABLE `PREFIX_carrier` ( `id_carrier` int(10) unsigned NOT NULL AUTO_INCREMENT, `id_reference` int(10) unsigned NOT NULL, `id_tax_rules_group` int(10) unsigned DEFAULT '0', `name` varchar(64) NOT NULL, `url` varchar(255) DEFAULT NULL, `active` tinyint(1) unsigned NOT NULL DEFAULT '0', `deleted` tinyint(1) unsigned NOT NULL DEFAULT '0', `shipping_handling` tinyint(1) unsigned NOT NULL DEFAULT '1', `range_behavior` tinyint(1) unsigned NOT NULL DEFAULT '0', `is_module` tinyint(1) unsigned NOT NULL DEFAULT '0', `is_free` tinyint(1) unsigned NOT NULL DEFAULT '0', `shipping_external` tinyint(1) unsigned NOT NULL DEFAULT '0', `need_range` tinyint(1) unsigned NOT NULL DEFAULT '0', `external_module_name` varchar(64) DEFAULT NULL, `shipping_method` int(2) NOT NULL DEFAULT '0', `position` int(10) unsigned NOT NULL default '0', `max_width` int(10) DEFAULT 0, `max_height` int(10) DEFAULT 0, `max_depth` int(10) DEFAULT 0, `max_weight` int(10) DEFAULT 0, `grade` int(10) DEFAULT 0, PRIMARY KEY (`id_carrier`), KEY `deleted` (`deleted`,`active`), KEY `id_tax_rules_group` (`id_tax_rules_group`) ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8 CREATE TABLE IF NOT EXISTS `PREFIX_specific_price_rule` ( `id_specific_price_rule` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, `id_shop` int(11) unsigned NOT NULL DEFAULT '1', `id_currency` int(10) unsigned NOT NULL, `id_country` int(10) unsigned NOT NULL, `id_group` int(10) unsigned NOT NULL, `from_quantity` mediumint(8) unsigned NOT NULL, `price` DECIMAL(20,6), `reduction` decimal(20,6) NOT NULL, `reduction_type` enum('amount','percentage') NOT NULL, `from` datetime NOT NULL, `to` datetime NOT NULL, PRIMARY KEY (`id_specific_price_rule`), KEY `id_product` (`id_shop`,`id_currency`,`id_country`,`id_group`,`from_quantity`,`from`,`to`) ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8 UPDATE `PREFIX_configuration` SET value = '6' WHERE name = 'PS_SEARCH_WEIGHT_PNAME' UPDATE `PREFIX_hook_module` SET position = 1 WHERE id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayPayment') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'cheque') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayPaymentReturn') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'cheque') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayHome') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'homeslider') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionAuthentication') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'statsdata') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionShopDataDuplication') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'homeslider') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayTop') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blocklanguages') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionCustomerAccountAdd') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'statsdata') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayCustomerAccount') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'favoriteproducts') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayAdminStatsModules') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'statsvisits') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayAdminStatsGraphEngine') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'graphvisifire') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayAdminStatsGridEngine') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'gridhtml') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayLeftColumnProduct') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blocksharefb') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionSearch') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'statssearch') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionCategoryAdd') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blockcategories') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionCategoryUpdate') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blockcategories') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionCategoryDelete') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blockcategories') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionAdminMetaSave') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blockcategories') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayMyAccountBlock') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'favoriteproducts') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayFooter') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blockreinsurance') ALTER TABLE `PREFIX_employee` ADD `bo_color` varchar(32) default NULL AFTER `stats_date_to` INSERT INTO `PREFIX_cms_category_lang` VALUES(1, 3, 'Inicio', '', 'home', NULL, NULL, NULL) INSERT INTO `PREFIX_cms_category` VALUES(1, 0, 0, 1, NOW(), NOW(),0) UPDATE `PREFIX_cms_category` SET `position` = 0 ALTER TABLE `PREFIX_customer` ADD `note` text AFTER `secure_key` ALTER TABLE `PREFIX_contact` ADD `customer_service` tinyint(1) NOT NULL DEFAULT 0 AFTER `email` INSERT INTO `PREFIX_specific_price` (`id_product`, `id_shop`, `id_currency`, `id_country`, `id_group`, `priority`, `price`, `from_quantity`, `reduction`, `reduction_type`, `from`, `to`) ( SELECT dq.`id_product`, 1, 1, 0, 1, 0, 0.00, dq.`quantity`, IF(dq.`id_discount_type` = 2, dq.`value`, dq.`value` / 100), IF (dq.`id_discount_type` = 2, 'amount', 'percentage'), '0000-00-00 00:00:00', '0000-00-00 00:00:00' FROM `PREFIX_discount_quantity` dq INNER JOIN `PREFIX_product` p ON (p.`id_product` = dq.`id_product`) ) DROP TABLE `PREFIX_discount_quantity` INSERT INTO `PREFIX_specific_price` (`id_product`, `id_shop`, `id_currency`, `id_country`, `id_group`, `priority`, `price`, `from_quantity`, `reduction`, `reduction_type`, `from`, `to`) ( SELECT p.`id_product`, 1, 0, 0, 0, 0, 0.00, 1, IF(p.`reduction_price` > 0, p.`reduction_price`, p.`reduction_percent` / 100), IF(p.`reduction_price` > 0, 'amount', 'percentage'), IF (p.`reduction_from` = p.`reduction_to`, '0000-00-00 00:00:00', p.`reduction_from`), IF (p.`reduction_from` = p.`reduction_to`, '0000-00-00 00:00:00', p.`reduction_to`) FROM `PREFIX_product` p WHERE p.`reduction_price` OR p.`reduction_percent` ) ALTER TABLE `PREFIX_product` DROP `reduction_price`, DROP `reduction_percent`, DROP `reduction_from`, DROP `reduction_to` INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_SPECIFIC_PRICE_PRIORITIES', 'id_shop;id_currency;id_country;id_group', NOW(), NOW()), ('PS_TAX_DISPLAY', 0, NOW(), NOW()), ('PS_SMARTY_FORCE_COMPILE', 1, NOW(), NOW()), ('PS_DISTANCE_UNIT', 'km', NOW(), NOW()), ('PS_STORES_DISPLAY_CMS', 0, NOW(), NOW()), ('PS_STORES_DISPLAY_FOOTER', 0, NOW(), NOW()), ('PS_STORES_SIMPLIFIED', 0, NOW(), NOW()), ('PS_STATSDATA_CUSTOMER_PAGESVIEWS', 1, NOW(), NOW()), ('PS_STATSDATA_PAGESVIEWS', 1, NOW(), NOW()), ('PS_STATSDATA_PLUGINS', 1, NOW(), NOW()) INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_CONDITIONS_CMS_ID', IFNULL((SELECT `id_cms` FROM `PREFIX_cms` WHERE `id_cms` = 3), 0), NOW(), NOW()) CREATE TEMPORARY TABLE `PREFIX_configuration_tmp` ( `value` text ) SET @defaultOOS = (SELECT value FROM `PREFIX_configuration` WHERE name = 'PS_ORDER_OUT_OF_STOCK') UPDATE `PREFIX_product` p SET `cache_default_attribute` = 0 WHERE `id_product` NOT IN (SELECT `id_product` FROM `PREFIX_product_attribute`) INSERT INTO `PREFIX_hook` (`name`, `title`, `description`, `position`) VALUES ('processCarrier', 'Carrier Process', NULL, 0) INSERT INTO `PREFIX_stock_mvt_reason_lang` (`id_stock_mvt_reason`, `id_lang`, `name`) VALUES (1, 1, 'Order'), (1, 2, 'Commande'), (2, 1, 'Missing Stock Movement'), (2, 2, 'Mouvement de stock manquant'), (3, 1, 'Restocking'), (3, 2, 'Réassort') INSERT INTO `PREFIX_meta_lang` (`id_lang`, `id_meta`, `title`, `url_rewrite`) VALUES (1, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'authentication'), 'Authentication', 'authentication'), (2, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'authentication'), 'Authentification', 'authentification'), (3, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'authentication'), 'Autenticación', 'autenticacion') LOCK TABLES `admin_assert` WRITE UNLOCK TABLES DROP TABLE IF EXISTS `admin_role` SELECT * FROM MyTable WHERE 1 = 2; SELECT SELECT Test FROM Test WHERE ( MyColumn = 1 )) AND ((( SomeOtherColumn = 2); SELECT * LIMIT 1; SELECT a,b,c,d FROM e LIMIT 1, 2; SELECT 1,2,3 WHERE a in (1,2,3,4,5) and b=5; SELECT count - 50 WHERE a-50 = b WHERE 1 and - 50 WHERE -50 = a WHERE a = -50 WHERE 1 - 50 WHERE 1 and -50; SELECT @ and b; SELECT @"weird variable name"; SELECT "no closing quotesql-formatter-1.2.17/tests/format-highlight.html000066400000000000000000002132151226454031000216700ustar00rootroot00000000000000
    SELECT 
      customer_id, 
      customer_name, 
      COUNT(order_id) as total 
    FROM 
      customers 
      INNER JOIN orders ON customers.customer_id = orders.customer_id 
    GROUP BY 
      customer_id, 
      customer_name 
    HAVING 
      COUNT(order_id) > 5 
    ORDER BY 
      COUNT(order_id) DESC;
    UPDATE 
      customers 
    SET 
      totalorders = ordersummary.total 
    FROM 
      (
        SELECT 
          customer_id, 
          count(order_id) As total 
        FROM 
          orders 
        GROUP BY 
          customer_id
      ) As ordersummary 
    WHERE 
      customers.customer_id = ordersummary.customer_id
    SELECT 
      * 
    FROM 
      sometable 
    UNION ALL 
    SELECT 
      * 
    FROM 
      someothertable;
    SET 
      NAMES 'utf8';
    CREATE TABLE `PREFIX_address` (
      `id_address` int(10) unsigned NOT NULL auto_increment, 
      `id_country` int(10) unsigned NOT NULL, 
      `id_state` int(10) unsigned default NULL, 
      `id_customer` int(10) unsigned NOT NULL default '0', 
      `id_manufacturer` int(10) unsigned NOT NULL default '0', 
      `id_supplier` int(10) unsigned NOT NULL default '0', 
      `id_warehouse` int(10) unsigned NOT NULL default '0', 
      `alias` varchar(32) NOT NULL, 
      `company` varchar(64) default NULL, 
      `lastname` varchar(32) NOT NULL, 
      `firstname` varchar(32) NOT NULL, 
      `address1` varchar(128) NOT NULL, 
      `address2` varchar(128) default NULL, 
      `postcode` varchar(12) default NULL, 
      `city` varchar(64) NOT NULL, 
      `other` text, 
      `phone` varchar(16) default NULL, 
      `phone_mobile` varchar(16) default NULL, 
      `vat_number` varchar(32) default NULL, 
      `dni` varchar(16) DEFAULT NULL, 
      `date_add` datetime NOT NULL, 
      `date_upd` datetime NOT NULL, 
      `active` tinyint(1) unsigned NOT NULL default '1', 
      `deleted` tinyint(1) unsigned NOT NULL default '0', 
      PRIMARY KEY (`id_address`), 
      KEY `address_customer` (`id_customer`), 
      KEY `id_country` (`id_country`), 
      KEY `id_state` (`id_state`), 
      KEY `id_manufacturer` (`id_manufacturer`), 
      KEY `id_supplier` (`id_supplier`), 
      KEY `id_warehouse` (`id_warehouse`)
    ) ENGINE = ENGINE_TYPE DEFAULT CHARSET = utf8
    CREATE TABLE `PREFIX_alias` (
      `id_alias` int(10) unsigned NOT NULL auto_increment, 
      `alias` varchar(255) NOT NULL, 
      `search` varchar(255) NOT NULL, 
      `active` tinyint(1) NOT NULL default '1', 
      PRIMARY KEY (`id_alias`), 
      UNIQUE KEY `alias` (`alias`)
    ) ENGINE = ENGINE_TYPE DEFAULT CHARSET = utf8
    CREATE TABLE `PREFIX_carrier` (
      `id_carrier` int(10) unsigned NOT NULL AUTO_INCREMENT, 
      `id_reference` int(10) unsigned NOT NULL, 
      `id_tax_rules_group` int(10) unsigned DEFAULT '0', 
      `name` varchar(64) NOT NULL, 
      `url` varchar(255) DEFAULT NULL, 
      `active` tinyint(1) unsigned NOT NULL DEFAULT '0', 
      `deleted` tinyint(1) unsigned NOT NULL DEFAULT '0', 
      `shipping_handling` tinyint(1) unsigned NOT NULL DEFAULT '1', 
      `range_behavior` tinyint(1) unsigned NOT NULL DEFAULT '0', 
      `is_module` tinyint(1) unsigned NOT NULL DEFAULT '0', 
      `is_free` tinyint(1) unsigned NOT NULL DEFAULT '0', 
      `shipping_external` tinyint(1) unsigned NOT NULL DEFAULT '0', 
      `need_range` tinyint(1) unsigned NOT NULL DEFAULT '0', 
      `external_module_name` varchar(64) DEFAULT NULL, 
      `shipping_method` int(2) NOT NULL DEFAULT '0', 
      `position` int(10) unsigned NOT NULL default '0', 
      `max_width` int(10) DEFAULT 0, 
      `max_height` int(10) DEFAULT 0, 
      `max_depth` int(10) DEFAULT 0, 
      `max_weight` int(10) DEFAULT 0, 
      `grade` int(10) DEFAULT 0, 
      PRIMARY KEY (`id_carrier`), 
      KEY `deleted` (`deleted`, `active`), 
      KEY `id_tax_rules_group` (`id_tax_rules_group`)
    ) ENGINE = ENGINE_TYPE DEFAULT CHARSET = utf8
    CREATE TABLE IF NOT EXISTS `PREFIX_specific_price_rule` (
      `id_specific_price_rule` int(10) unsigned NOT NULL AUTO_INCREMENT, 
      `name` VARCHAR(255) NOT NULL, 
      `id_shop` int(11) unsigned NOT NULL DEFAULT '1', 
      `id_currency` int(10) unsigned NOT NULL, 
      `id_country` int(10) unsigned NOT NULL, 
      `id_group` int(10) unsigned NOT NULL, 
      `from_quantity` mediumint(8) unsigned NOT NULL, 
      `price` DECIMAL(20, 6), 
      `reduction` decimal(20, 6) NOT NULL, 
      `reduction_type` enum('amount', 'percentage') NOT NULL, 
      `from` datetime NOT NULL, 
      `to` datetime NOT NULL, 
      PRIMARY KEY (`id_specific_price_rule`), 
      KEY `id_product` (
        `id_shop`, `id_currency`, `id_country`, 
        `id_group`, `from_quantity`, `from`, 
        `to`
      )
    ) ENGINE = ENGINE_TYPE DEFAULT CHARSET = utf8
    UPDATE 
      `PREFIX_configuration` 
    SET 
      value = '6' 
    WHERE 
      name = 'PS_SEARCH_WEIGHT_PNAME'
    UPDATE 
      `PREFIX_hook_module` 
    SET 
      position = 1 
    WHERE 
      id_hook = (
        SELECT 
          id_hook 
        FROM 
          `PREFIX_hook` 
        WHERE 
          name = 'displayPayment'
      ) 
      AND id_module = (
        SELECT 
          id_module 
        FROM 
          `PREFIX_module` 
        WHERE 
          name = 'cheque'
      ) 
      OR id_hook = (
        SELECT 
          id_hook 
        FROM 
          `PREFIX_hook` 
        WHERE 
          name = 'displayPaymentReturn'
      ) 
      AND id_module = (
        SELECT 
          id_module 
        FROM 
          `PREFIX_module` 
        WHERE 
          name = 'cheque'
      ) 
      OR id_hook = (
        SELECT 
          id_hook 
        FROM 
          `PREFIX_hook` 
        WHERE 
          name = 'displayHome'
      ) 
      AND id_module = (
        SELECT 
          id_module 
        FROM 
          `PREFIX_module` 
        WHERE 
          name = 'homeslider'
      ) 
      OR id_hook = (
        SELECT 
          id_hook 
        FROM 
          `PREFIX_hook` 
        WHERE 
          name = 'actionAuthentication'
      ) 
      AND id_module = (
        SELECT 
          id_module 
        FROM 
          `PREFIX_module` 
        WHERE 
          name = 'statsdata'
      ) 
      OR id_hook = (
        SELECT 
          id_hook 
        FROM 
          `PREFIX_hook` 
        WHERE 
          name = 'actionShopDataDuplication'
      ) 
      AND id_module = (
        SELECT 
          id_module 
        FROM 
          `PREFIX_module` 
        WHERE 
          name = 'homeslider'
      ) 
      OR id_hook = (
        SELECT 
          id_hook 
        FROM 
          `PREFIX_hook` 
        WHERE 
          name = 'displayTop'
      ) 
      AND id_module = (
        SELECT 
          id_module 
        FROM 
          `PREFIX_module` 
        WHERE 
          name = 'blocklanguages'
      ) 
      OR id_hook = (
        SELECT 
          id_hook 
        FROM 
          `PREFIX_hook` 
        WHERE 
          name = 'actionCustomerAccountAdd'
      ) 
      AND id_module = (
        SELECT 
          id_module 
        FROM 
          `PREFIX_module` 
        WHERE 
          name = 'statsdata'
      ) 
      OR id_hook = (
        SELECT 
          id_hook 
        FROM 
          `PREFIX_hook` 
        WHERE 
          name = 'displayCustomerAccount'
      ) 
      AND id_module = (
        SELECT 
          id_module 
        FROM 
          `PREFIX_module` 
        WHERE 
          name = 'favoriteproducts'
      ) 
      OR id_hook = (
        SELECT 
          id_hook 
        FROM 
          `PREFIX_hook` 
        WHERE 
          name = 'displayAdminStatsModules'
      ) 
      AND id_module = (
        SELECT 
          id_module 
        FROM 
          `PREFIX_module` 
        WHERE 
          name = 'statsvisits'
      ) 
      OR id_hook = (
        SELECT 
          id_hook 
        FROM 
          `PREFIX_hook` 
        WHERE 
          name = 'displayAdminStatsGraphEngine'
      ) 
      AND id_module = (
        SELECT 
          id_module 
        FROM 
          `PREFIX_module` 
        WHERE 
          name = 'graphvisifire'
      ) 
      OR id_hook = (
        SELECT 
          id_hook 
        FROM 
          `PREFIX_hook` 
        WHERE 
          name = 'displayAdminStatsGridEngine'
      ) 
      AND id_module = (
        SELECT 
          id_module 
        FROM 
          `PREFIX_module` 
        WHERE 
          name = 'gridhtml'
      ) 
      OR id_hook = (
        SELECT 
          id_hook 
        FROM 
          `PREFIX_hook` 
        WHERE 
          name = 'displayLeftColumnProduct'
      ) 
      AND id_module = (
        SELECT 
          id_module 
        FROM 
          `PREFIX_module` 
        WHERE 
          name = 'blocksharefb'
      ) 
      OR id_hook = (
        SELECT 
          id_hook 
        FROM 
          `PREFIX_hook` 
        WHERE 
          name = 'actionSearch'
      ) 
      AND id_module = (
        SELECT 
          id_module 
        FROM 
          `PREFIX_module` 
        WHERE 
          name = 'statssearch'
      ) 
      OR id_hook = (
        SELECT 
          id_hook 
        FROM 
          `PREFIX_hook` 
        WHERE 
          name = 'actionCategoryAdd'
      ) 
      AND id_module = (
        SELECT 
          id_module 
        FROM 
          `PREFIX_module` 
        WHERE 
          name = 'blockcategories'
      ) 
      OR id_hook = (
        SELECT 
          id_hook 
        FROM 
          `PREFIX_hook` 
        WHERE 
          name = 'actionCategoryUpdate'
      ) 
      AND id_module = (
        SELECT 
          id_module 
        FROM 
          `PREFIX_module` 
        WHERE 
          name = 'blockcategories'
      ) 
      OR id_hook = (
        SELECT 
          id_hook 
        FROM 
          `PREFIX_hook` 
        WHERE 
          name = 'actionCategoryDelete'
      ) 
      AND id_module = (
        SELECT 
          id_module 
        FROM 
          `PREFIX_module` 
        WHERE 
          name = 'blockcategories'
      ) 
      OR id_hook = (
        SELECT 
          id_hook 
        FROM 
          `PREFIX_hook` 
        WHERE 
          name = 'actionAdminMetaSave'
      ) 
      AND id_module = (
        SELECT 
          id_module 
        FROM 
          `PREFIX_module` 
        WHERE 
          name = 'blockcategories'
      ) 
      OR id_hook = (
        SELECT 
          id_hook 
        FROM 
          `PREFIX_hook` 
        WHERE 
          name = 'displayMyAccountBlock'
      ) 
      AND id_module = (
        SELECT 
          id_module 
        FROM 
          `PREFIX_module` 
        WHERE 
          name = 'favoriteproducts'
      ) 
      OR id_hook = (
        SELECT 
          id_hook 
        FROM 
          `PREFIX_hook` 
        WHERE 
          name = 'displayFooter'
      ) 
      AND id_module = (
        SELECT 
          id_module 
        FROM 
          `PREFIX_module` 
        WHERE 
          name = 'blockreinsurance'
      )
    ALTER TABLE 
      `PREFIX_employee` 
    ADD 
      `bo_color` varchar(32) default NULL 
    AFTER 
      `stats_date_to`
    INSERT INTO `PREFIX_cms_category_lang` 
    VALUES 
      (
        1, 3, 'Inicio', '', 'home', NULL, NULL, 
        NULL
      )
    INSERT INTO `PREFIX_cms_category` 
    VALUES 
      (1, 0, 0, 1, NOW(), NOW(), 0)
    UPDATE 
      `PREFIX_cms_category` 
    SET 
      `position` = 0
    ALTER TABLE 
      `PREFIX_customer` 
    ADD 
      `note` text 
    AFTER 
      `secure_key`
    ALTER TABLE 
      `PREFIX_contact` 
    ADD 
      `customer_service` tinyint(1) NOT NULL DEFAULT 0 
    AFTER 
      `email`
    INSERT INTO `PREFIX_specific_price` (
      `id_product`, `id_shop`, `id_currency`, 
      `id_country`, `id_group`, `priority`, 
      `price`, `from_quantity`, `reduction`, 
      `reduction_type`, `from`, `to`
    ) (
      SELECT 
        dq.`id_product`, 
        1, 
        1, 
        0, 
        1, 
        0, 
        0.00, 
        dq.`quantity`, 
        IF(
          dq.`id_discount_type` = 2, dq.`value`, 
          dq.`value` / 100
        ), 
        IF (
          dq.`id_discount_type` = 2, 'amount', 
          'percentage'
        ), 
        '0000-00-00 00:00:00', 
        '0000-00-00 00:00:00' 
      FROM 
        `PREFIX_discount_quantity` dq 
        INNER JOIN `PREFIX_product` p ON (p.`id_product` = dq.`id_product`)
    )
    DROP 
      TABLE `PREFIX_discount_quantity`
    INSERT INTO `PREFIX_specific_price` (
      `id_product`, `id_shop`, `id_currency`, 
      `id_country`, `id_group`, `priority`, 
      `price`, `from_quantity`, `reduction`, 
      `reduction_type`, `from`, `to`
    ) (
      SELECT 
        p.`id_product`, 
        1, 
        0, 
        0, 
        0, 
        0, 
        0.00, 
        1, 
        IF(
          p.`reduction_price` > 0, p.`reduction_price`, 
          p.`reduction_percent` / 100
        ), 
        IF(
          p.`reduction_price` > 0, 'amount', 
          'percentage'
        ), 
        IF (
          p.`reduction_from` = p.`reduction_to`, 
          '0000-00-00 00:00:00', p.`reduction_from`
        ), 
        IF (
          p.`reduction_from` = p.`reduction_to`, 
          '0000-00-00 00:00:00', p.`reduction_to`
        ) 
      FROM 
        `PREFIX_product` p 
      WHERE 
        p.`reduction_price` 
        OR p.`reduction_percent`
    )
    ALTER TABLE 
      `PREFIX_product` 
    DROP 
      `reduction_price`, 
    DROP 
      `reduction_percent`, 
    DROP 
      `reduction_from`, 
    DROP 
      `reduction_to`
    INSERT INTO `PREFIX_configuration` (
      `name`, `value`, `date_add`, `date_upd`
    ) 
    VALUES 
      (
        'PS_SPECIFIC_PRICE_PRIORITIES', 
        'id_shop;id_currency;id_country;id_group', 
        NOW(), NOW()
      ), 
      ('PS_TAX_DISPLAY', 0, NOW(), NOW()), 
      (
        'PS_SMARTY_FORCE_COMPILE', 1, NOW(), 
        NOW()
      ), 
      (
        'PS_DISTANCE_UNIT', 'km', NOW(), NOW()
      ), 
      (
        'PS_STORES_DISPLAY_CMS', 0, NOW(), 
        NOW()
      ), 
      (
        'PS_STORES_DISPLAY_FOOTER', 0, NOW(), 
        NOW()
      ), 
      (
        'PS_STORES_SIMPLIFIED', 0, NOW(), 
        NOW()
      ), 
      (
        'PS_STATSDATA_CUSTOMER_PAGESVIEWS', 
        1, NOW(), NOW()
      ), 
      (
        'PS_STATSDATA_PAGESVIEWS', 1, NOW(), 
        NOW()
      ), 
      (
        'PS_STATSDATA_PLUGINS', 1, NOW(), 
        NOW()
      )
    INSERT INTO `PREFIX_configuration` (
      `name`, `value`, `date_add`, `date_upd`
    ) 
    VALUES 
      (
        'PS_CONDITIONS_CMS_ID', 
        IFNULL(
          (
            SELECT 
              `id_cms` 
            FROM 
              `PREFIX_cms` 
            WHERE 
              `id_cms` = 3
          ), 
          0
        ), 
        NOW(), 
        NOW()
      )
    CREATE TEMPORARY TABLE `PREFIX_configuration_tmp` (`value` text)
    SET 
      @defaultOOS = (
        SELECT 
          value 
        FROM 
          `PREFIX_configuration` 
        WHERE 
          name = 'PS_ORDER_OUT_OF_STOCK'
      )
    UPDATE 
      `PREFIX_product` p 
    SET 
      `cache_default_attribute` = 0 
    WHERE 
      `id_product` NOT IN (
        SELECT 
          `id_product` 
        FROM 
          `PREFIX_product_attribute`
      )
    INSERT INTO `PREFIX_hook` (
      `name`, `title`, `description`, `position`
    ) 
    VALUES 
      (
        'processCarrier', 'Carrier Process', 
        NULL, 0
      )
    INSERT INTO `PREFIX_stock_mvt_reason_lang` (
      `id_stock_mvt_reason`, `id_lang`, 
      `name`
    ) 
    VALUES 
      (1, 1, 'Order'), 
      (1, 2, 'Commande'), 
      (2, 1, 'Missing Stock Movement'), 
      (
        2, 2, 'Mouvement de stock manquant'
      ), 
      (3, 1, 'Restocking'), 
      (3, 2, 'Réassort')
    INSERT INTO `PREFIX_meta_lang` (
      `id_lang`, `id_meta`, `title`, `url_rewrite`
    ) 
    VALUES 
      (
        1, 
        (
          SELECT 
            `id_meta` 
          FROM 
            `PREFIX_meta` 
          WHERE 
            `page` = 'authentication'
        ), 
        'Authentication', 
        'authentication'
      ), 
      (
        2, 
        (
          SELECT 
            `id_meta` 
          FROM 
            `PREFIX_meta` 
          WHERE 
            `page` = 'authentication'
        ), 
        'Authentification', 
        'authentification'
      ), 
      (
        3, 
        (
          SELECT 
            `id_meta` 
          FROM 
            `PREFIX_meta` 
          WHERE 
            `page` = 'authentication'
        ), 
        'Autenticación', 
        'autenticacion'
      )
    LOCK TABLES `admin_assert` WRITE
    UNLOCK TABLES
    DROP 
      TABLE IF EXISTS `admin_role`
    SELECT 
      * 
    FROM 
      -- This is another comment
      MyTable # One final comment
      
      /* This is a block comment 
      */
    WHERE 
      1 = 2;
    SELECT 
      -- This is a test
    SELECT 
      Test 
    FROM 
      Test 
    WHERE 
      (MyColumn = 1)
    )
    AND (
      (
        (SomeOtherColumn = 2); 
    WARNING: unclosed parentheses or section
    SELECT 
      * 
    LIMIT 
      1; 
    SELECT 
      a, 
      b, 
      c, 
      d 
    FROM 
      e 
    LIMIT 
      1, 2; 
    SELECT 
      1, 
      2, 
      3 
    WHERE 
      a in (1, 2, 3, 4, 5) 
      and b = 5;
    SELECT 
      count - 50 
    WHERE 
      a - 50 = b 
    WHERE 
      1 
      and -50 
    WHERE 
      -50 = a 
    WHERE 
      a = -50 
    WHERE 
      1 
      /*test*/
      -50 
    WHERE 
      1 
      and -50;
    SELECT 
      @ 
      and b;
    SELECT 
      @"weird variable name";
    SELECT 
      "no closing quote
    
    sql-formatter-1.2.17/tests/format.html000066400000000000000000000345161226454031000177300ustar00rootroot00000000000000SELECT customer_id, customer_name, COUNT(order_id) as total FROM customers INNER JOIN orders ON customers.customer_id = orders.customer_id GROUP BY customer_id, customer_name HAVING COUNT(order_id) > 5 ORDER BY COUNT(order_id) DESC; UPDATE customers SET totalorders = ordersummary.total FROM ( SELECT customer_id, count(order_id) As total FROM orders GROUP BY customer_id ) As ordersummary WHERE customers.customer_id = ordersummary.customer_id SELECT * FROM sometable UNION ALL SELECT * FROM someothertable; SET NAMES 'utf8'; CREATE TABLE `PREFIX_address` ( `id_address` int(10) unsigned NOT NULL auto_increment, `id_country` int(10) unsigned NOT NULL, `id_state` int(10) unsigned default NULL, `id_customer` int(10) unsigned NOT NULL default '0', `id_manufacturer` int(10) unsigned NOT NULL default '0', `id_supplier` int(10) unsigned NOT NULL default '0', `id_warehouse` int(10) unsigned NOT NULL default '0', `alias` varchar(32) NOT NULL, `company` varchar(64) default NULL, `lastname` varchar(32) NOT NULL, `firstname` varchar(32) NOT NULL, `address1` varchar(128) NOT NULL, `address2` varchar(128) default NULL, `postcode` varchar(12) default NULL, `city` varchar(64) NOT NULL, `other` text, `phone` varchar(16) default NULL, `phone_mobile` varchar(16) default NULL, `vat_number` varchar(32) default NULL, `dni` varchar(16) DEFAULT NULL, `date_add` datetime NOT NULL, `date_upd` datetime NOT NULL, `active` tinyint(1) unsigned NOT NULL default '1', `deleted` tinyint(1) unsigned NOT NULL default '0', PRIMARY KEY (`id_address`), KEY `address_customer` (`id_customer`), KEY `id_country` (`id_country`), KEY `id_state` (`id_state`), KEY `id_manufacturer` (`id_manufacturer`), KEY `id_supplier` (`id_supplier`), KEY `id_warehouse` (`id_warehouse`) ) ENGINE = ENGINE_TYPE DEFAULT CHARSET = utf8 CREATE TABLE `PREFIX_alias` ( `id_alias` int(10) unsigned NOT NULL auto_increment, `alias` varchar(255) NOT NULL, `search` varchar(255) NOT NULL, `active` tinyint(1) NOT NULL default '1', PRIMARY KEY (`id_alias`), UNIQUE KEY `alias` (`alias`) ) ENGINE = ENGINE_TYPE DEFAULT CHARSET = utf8 CREATE TABLE `PREFIX_carrier` ( `id_carrier` int(10) unsigned NOT NULL AUTO_INCREMENT, `id_reference` int(10) unsigned NOT NULL, `id_tax_rules_group` int(10) unsigned DEFAULT '0', `name` varchar(64) NOT NULL, `url` varchar(255) DEFAULT NULL, `active` tinyint(1) unsigned NOT NULL DEFAULT '0', `deleted` tinyint(1) unsigned NOT NULL DEFAULT '0', `shipping_handling` tinyint(1) unsigned NOT NULL DEFAULT '1', `range_behavior` tinyint(1) unsigned NOT NULL DEFAULT '0', `is_module` tinyint(1) unsigned NOT NULL DEFAULT '0', `is_free` tinyint(1) unsigned NOT NULL DEFAULT '0', `shipping_external` tinyint(1) unsigned NOT NULL DEFAULT '0', `need_range` tinyint(1) unsigned NOT NULL DEFAULT '0', `external_module_name` varchar(64) DEFAULT NULL, `shipping_method` int(2) NOT NULL DEFAULT '0', `position` int(10) unsigned NOT NULL default '0', `max_width` int(10) DEFAULT 0, `max_height` int(10) DEFAULT 0, `max_depth` int(10) DEFAULT 0, `max_weight` int(10) DEFAULT 0, `grade` int(10) DEFAULT 0, PRIMARY KEY (`id_carrier`), KEY `deleted` (`deleted`, `active`), KEY `id_tax_rules_group` (`id_tax_rules_group`) ) ENGINE = ENGINE_TYPE DEFAULT CHARSET = utf8 CREATE TABLE IF NOT EXISTS `PREFIX_specific_price_rule` ( `id_specific_price_rule` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, `id_shop` int(11) unsigned NOT NULL DEFAULT '1', `id_currency` int(10) unsigned NOT NULL, `id_country` int(10) unsigned NOT NULL, `id_group` int(10) unsigned NOT NULL, `from_quantity` mediumint(8) unsigned NOT NULL, `price` DECIMAL(20, 6), `reduction` decimal(20, 6) NOT NULL, `reduction_type` enum('amount', 'percentage') NOT NULL, `from` datetime NOT NULL, `to` datetime NOT NULL, PRIMARY KEY (`id_specific_price_rule`), KEY `id_product` ( `id_shop`, `id_currency`, `id_country`, `id_group`, `from_quantity`, `from`, `to` ) ) ENGINE = ENGINE_TYPE DEFAULT CHARSET = utf8 UPDATE `PREFIX_configuration` SET value = '6' WHERE name = 'PS_SEARCH_WEIGHT_PNAME' UPDATE `PREFIX_hook_module` SET position = 1 WHERE id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayPayment' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'cheque' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayPaymentReturn' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'cheque' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayHome' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'homeslider' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionAuthentication' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'statsdata' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionShopDataDuplication' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'homeslider' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayTop' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'blocklanguages' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionCustomerAccountAdd' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'statsdata' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayCustomerAccount' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'favoriteproducts' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayAdminStatsModules' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'statsvisits' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayAdminStatsGraphEngine' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'graphvisifire' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayAdminStatsGridEngine' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'gridhtml' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayLeftColumnProduct' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'blocksharefb' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionSearch' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'statssearch' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionCategoryAdd' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'blockcategories' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionCategoryUpdate' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'blockcategories' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionCategoryDelete' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'blockcategories' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionAdminMetaSave' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'blockcategories' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayMyAccountBlock' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'favoriteproducts' ) OR id_hook = ( SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayFooter' ) AND id_module = ( SELECT id_module FROM `PREFIX_module` WHERE name = 'blockreinsurance' ) ALTER TABLE `PREFIX_employee` ADD `bo_color` varchar(32) default NULL AFTER `stats_date_to` INSERT INTO `PREFIX_cms_category_lang` VALUES ( 1, 3, 'Inicio', '', 'home', NULL, NULL, NULL ) INSERT INTO `PREFIX_cms_category` VALUES (1, 0, 0, 1, NOW(), NOW(), 0) UPDATE `PREFIX_cms_category` SET `position` = 0 ALTER TABLE `PREFIX_customer` ADD `note` text AFTER `secure_key` ALTER TABLE `PREFIX_contact` ADD `customer_service` tinyint(1) NOT NULL DEFAULT 0 AFTER `email` INSERT INTO `PREFIX_specific_price` ( `id_product`, `id_shop`, `id_currency`, `id_country`, `id_group`, `priority`, `price`, `from_quantity`, `reduction`, `reduction_type`, `from`, `to` ) ( SELECT dq.`id_product`, 1, 1, 0, 1, 0, 0.00, dq.`quantity`, IF( dq.`id_discount_type` = 2, dq.`value`, dq.`value` / 100 ), IF ( dq.`id_discount_type` = 2, 'amount', 'percentage' ), '0000-00-00 00:00:00', '0000-00-00 00:00:00' FROM `PREFIX_discount_quantity` dq INNER JOIN `PREFIX_product` p ON (p.`id_product` = dq.`id_product`) ) DROP TABLE `PREFIX_discount_quantity` INSERT INTO `PREFIX_specific_price` ( `id_product`, `id_shop`, `id_currency`, `id_country`, `id_group`, `priority`, `price`, `from_quantity`, `reduction`, `reduction_type`, `from`, `to` ) ( SELECT p.`id_product`, 1, 0, 0, 0, 0, 0.00, 1, IF( p.`reduction_price` > 0, p.`reduction_price`, p.`reduction_percent` / 100 ), IF( p.`reduction_price` > 0, 'amount', 'percentage' ), IF ( p.`reduction_from` = p.`reduction_to`, '0000-00-00 00:00:00', p.`reduction_from` ), IF ( p.`reduction_from` = p.`reduction_to`, '0000-00-00 00:00:00', p.`reduction_to` ) FROM `PREFIX_product` p WHERE p.`reduction_price` OR p.`reduction_percent` ) ALTER TABLE `PREFIX_product` DROP `reduction_price`, DROP `reduction_percent`, DROP `reduction_from`, DROP `reduction_to` INSERT INTO `PREFIX_configuration` ( `name`, `value`, `date_add`, `date_upd` ) VALUES ( 'PS_SPECIFIC_PRICE_PRIORITIES', 'id_shop;id_currency;id_country;id_group', NOW(), NOW() ), ('PS_TAX_DISPLAY', 0, NOW(), NOW()), ( 'PS_SMARTY_FORCE_COMPILE', 1, NOW(), NOW() ), ( 'PS_DISTANCE_UNIT', 'km', NOW(), NOW() ), ( 'PS_STORES_DISPLAY_CMS', 0, NOW(), NOW() ), ( 'PS_STORES_DISPLAY_FOOTER', 0, NOW(), NOW() ), ( 'PS_STORES_SIMPLIFIED', 0, NOW(), NOW() ), ( 'PS_STATSDATA_CUSTOMER_PAGESVIEWS', 1, NOW(), NOW() ), ( 'PS_STATSDATA_PAGESVIEWS', 1, NOW(), NOW() ), ( 'PS_STATSDATA_PLUGINS', 1, NOW(), NOW() ) INSERT INTO `PREFIX_configuration` ( `name`, `value`, `date_add`, `date_upd` ) VALUES ( 'PS_CONDITIONS_CMS_ID', IFNULL( ( SELECT `id_cms` FROM `PREFIX_cms` WHERE `id_cms` = 3 ), 0 ), NOW(), NOW() ) CREATE TEMPORARY TABLE `PREFIX_configuration_tmp` (`value` text) SET @defaultOOS = ( SELECT value FROM `PREFIX_configuration` WHERE name = 'PS_ORDER_OUT_OF_STOCK' ) UPDATE `PREFIX_product` p SET `cache_default_attribute` = 0 WHERE `id_product` NOT IN ( SELECT `id_product` FROM `PREFIX_product_attribute` ) INSERT INTO `PREFIX_hook` ( `name`, `title`, `description`, `position` ) VALUES ( 'processCarrier', 'Carrier Process', NULL, 0 ) INSERT INTO `PREFIX_stock_mvt_reason_lang` ( `id_stock_mvt_reason`, `id_lang`, `name` ) VALUES (1, 1, 'Order'), (1, 2, 'Commande'), (2, 1, 'Missing Stock Movement'), ( 2, 2, 'Mouvement de stock manquant' ), (3, 1, 'Restocking'), (3, 2, 'Réassort') INSERT INTO `PREFIX_meta_lang` ( `id_lang`, `id_meta`, `title`, `url_rewrite` ) VALUES ( 1, ( SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'authentication' ), 'Authentication', 'authentication' ), ( 2, ( SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'authentication' ), 'Authentification', 'authentification' ), ( 3, ( SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'authentication' ), 'Autenticación', 'autenticacion' ) LOCK TABLES `admin_assert` WRITE UNLOCK TABLES DROP TABLE IF EXISTS `admin_role` SELECT * FROM -- This is another comment MyTable # One final comment /* This is a block comment */ WHERE 1 = 2; SELECT -- This is a test SELECT Test FROM Test WHERE (MyColumn = 1) ) AND ( ( (SomeOtherColumn = 2); SELECT * LIMIT 1; SELECT a, b, c, d FROM e LIMIT 1, 2; SELECT 1, 2, 3 WHERE a in (1, 2, 3, 4, 5) and b = 5; SELECT count - 50 WHERE a - 50 = b WHERE 1 and -50 WHERE -50 = a WHERE a = -50 WHERE 1 /*test*/ -50 WHERE 1 and -50; SELECT @ and b; SELECT @"weird variable name"; SELECT "no closing quotesql-formatter-1.2.17/tests/highlight.html000066400000000000000000002052401226454031000204010ustar00rootroot00000000000000
    SELECT customer_id, customer_name, COUNT(order_id) as total
    FROM customers INNER JOIN orders ON customers.customer_id = orders.customer_id
    GROUP BY customer_id, customer_name
    HAVING COUNT(order_id) > 5
    ORDER BY COUNT(order_id) DESC;
    UPDATE customers
            SET totalorders = ordersummary.total
            FROM (SELECT customer_id, count(order_id) As total 
    FROM orders GROUP BY customer_id) As ordersummary
            WHERE customers.customer_id = ordersummary.customer_id
    SELECT * FROM sometable
    UNION ALL
    SELECT * FROM someothertable;
    SET NAMES 'utf8';
    CREATE TABLE `PREFIX_address` (
      `id_address` int(10) unsigned NOT NULL auto_increment,
      `id_country` int(10) unsigned NOT NULL,
      `id_state` int(10) unsigned default NULL,
      `id_customer` int(10) unsigned NOT NULL default '0',
      `id_manufacturer` int(10) unsigned NOT NULL default '0',
      `id_supplier` int(10) unsigned NOT NULL default '0',
      `id_warehouse` int(10) unsigned NOT NULL default '0',
      `alias` varchar(32) NOT NULL,
      `company` varchar(64) default NULL,
      `lastname` varchar(32) NOT NULL,
      `firstname` varchar(32) NOT NULL,
      `address1` varchar(128) NOT NULL,
      `address2` varchar(128) default NULL,
      `postcode` varchar(12) default NULL,
      `city` varchar(64) NOT NULL,
      `other` text,
      `phone` varchar(16) default NULL,
      `phone_mobile` varchar(16) default NULL,
      `vat_number` varchar(32) default NULL,
      `dni` varchar(16) DEFAULT NULL,
      `date_add` datetime NOT NULL,
      `date_upd` datetime NOT NULL,
      `active` tinyint(1) unsigned NOT NULL default '1',
      `deleted` tinyint(1) unsigned NOT NULL default '0',
      PRIMARY KEY (`id_address`),
      KEY `address_customer` (`id_customer`),
      KEY `id_country` (`id_country`),
      KEY `id_state` (`id_state`),
      KEY `id_manufacturer` (`id_manufacturer`),
      KEY `id_supplier` (`id_supplier`),
      KEY `id_warehouse` (`id_warehouse`)
    ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8
    CREATE TABLE `PREFIX_alias` (
      `id_alias` int(10) unsigned NOT NULL auto_increment,
      `alias` varchar(255) NOT NULL,
      `search` varchar(255) NOT NULL,
      `active` tinyint(1) NOT NULL default '1',
      PRIMARY KEY (`id_alias`),
      UNIQUE KEY `alias` (`alias`)
    ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8
    CREATE TABLE `PREFIX_carrier` (
      `id_carrier` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `id_reference` int(10) unsigned NOT NULL,
      `id_tax_rules_group` int(10) unsigned DEFAULT '0',
      `name` varchar(64) NOT NULL,
      `url` varchar(255) DEFAULT NULL,
      `active` tinyint(1) unsigned NOT NULL DEFAULT '0',
      `deleted` tinyint(1) unsigned NOT NULL DEFAULT '0',
      `shipping_handling` tinyint(1) unsigned NOT NULL DEFAULT '1',
      `range_behavior` tinyint(1) unsigned NOT NULL DEFAULT '0',
      `is_module` tinyint(1) unsigned NOT NULL DEFAULT '0',
      `is_free` tinyint(1) unsigned NOT NULL DEFAULT '0',
      `shipping_external` tinyint(1) unsigned NOT NULL DEFAULT '0',
      `need_range` tinyint(1) unsigned NOT NULL DEFAULT '0',
      `external_module_name` varchar(64) DEFAULT NULL,
      `shipping_method` int(2) NOT NULL DEFAULT '0',
      `position` int(10) unsigned NOT NULL default '0',
      `max_width` int(10) DEFAULT 0,
      `max_height` int(10)  DEFAULT 0,
      `max_depth` int(10)  DEFAULT 0,
      `max_weight` int(10)  DEFAULT 0,
      `grade` int(10)  DEFAULT 0,
      PRIMARY KEY (`id_carrier`),
      KEY `deleted` (`deleted`,`active`),
      KEY `id_tax_rules_group` (`id_tax_rules_group`)
    ) ENGINE=ENGINE_TYPE  DEFAULT CHARSET=utf8
    CREATE TABLE IF NOT EXISTS `PREFIX_specific_price_rule` (
    	`id_specific_price_rule` int(10) unsigned NOT NULL AUTO_INCREMENT,
    	`name` VARCHAR(255) NOT NULL,
    	`id_shop` int(11) unsigned NOT NULL DEFAULT '1',
    	`id_currency` int(10) unsigned NOT NULL,
    	`id_country` int(10) unsigned NOT NULL,
    	`id_group` int(10) unsigned NOT NULL,
    	`from_quantity` mediumint(8) unsigned NOT NULL,
    	`price` DECIMAL(20,6),
    	`reduction` decimal(20,6) NOT NULL,
    	`reduction_type` enum('amount','percentage') NOT NULL,
    	`from` datetime NOT NULL,
    	`to` datetime NOT NULL,
    	PRIMARY KEY (`id_specific_price_rule`),
    	KEY `id_product` (`id_shop`,`id_currency`,`id_country`,`id_group`,`from_quantity`,`from`,`to`)
    ) ENGINE=ENGINE_TYPE  DEFAULT CHARSET=utf8
    UPDATE `PREFIX_configuration` SET value = '6' WHERE name = 'PS_SEARCH_WEIGHT_PNAME'
    UPDATE `PREFIX_hook_module` SET position = 1
    WHERE
    	id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayPayment') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'cheque')
    	OR
    	id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayPaymentReturn') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'cheque')
    	OR
    	id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayHome') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'homeslider')
    	OR
    	id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionAuthentication') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'statsdata')
    	OR
    	id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionShopDataDuplication') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'homeslider')
    	OR
    	id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayTop') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blocklanguages')
    	OR
    	id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionCustomerAccountAdd') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'statsdata')
    	OR
    	id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayCustomerAccount') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'favoriteproducts')
    	OR
    	id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayAdminStatsModules') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'statsvisits')
    	OR
    	id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayAdminStatsGraphEngine') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'graphvisifire')
    	OR
    	id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayAdminStatsGridEngine') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'gridhtml')
    	OR
    	id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayLeftColumnProduct') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blocksharefb')
    	OR
    	id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionSearch') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'statssearch')
    	OR
    	id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionCategoryAdd') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blockcategories')
    	OR
    	id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionCategoryUpdate') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blockcategories')
    	OR
    	id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionCategoryDelete') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blockcategories')
    	OR
    	id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionAdminMetaSave') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blockcategories')
    	OR
    	id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayMyAccountBlock') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'favoriteproducts')
    	OR
    	id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayFooter') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blockreinsurance')
    ALTER TABLE `PREFIX_employee` ADD `bo_color` varchar(32) default NULL AFTER `stats_date_to`
    INSERT INTO `PREFIX_cms_category_lang` VALUES(1, 3, 'Inicio', '', 'home', NULL, NULL, NULL)
    INSERT INTO `PREFIX_cms_category` VALUES(1, 0, 0, 1, NOW(), NOW(),0)
    UPDATE `PREFIX_cms_category` SET `position` = 0
    ALTER TABLE `PREFIX_customer` ADD `note` text AFTER `secure_key`
    ALTER TABLE `PREFIX_contact` ADD `customer_service` tinyint(1) NOT NULL DEFAULT 0 AFTER `email`
    INSERT INTO `PREFIX_specific_price` (`id_product`, `id_shop`, `id_currency`, `id_country`, `id_group`, `priority`, `price`, `from_quantity`, `reduction`, `reduction_type`, `from`, `to`)
    	(	SELECT dq.`id_product`, 1, 1, 0, 1, 0, 0.00, dq.`quantity`, IF(dq.`id_discount_type` = 2, dq.`value`, dq.`value` / 100), IF (dq.`id_discount_type` = 2, 'amount', 'percentage'), '0000-00-00 00:00:00', '0000-00-00 00:00:00'
    		FROM `PREFIX_discount_quantity` dq
    		INNER JOIN `PREFIX_product` p ON (p.`id_product` = dq.`id_product`)
    	)
    DROP TABLE `PREFIX_discount_quantity`
    INSERT INTO `PREFIX_specific_price` (`id_product`, `id_shop`, `id_currency`, `id_country`, `id_group`, `priority`, `price`, `from_quantity`, `reduction`, `reduction_type`, `from`, `to`) (
    	SELECT
    		p.`id_product`,
    		1,
    		0,
    		0,
    		0,
    		0,
    		0.00,
    		1,
    		IF(p.`reduction_price` > 0, p.`reduction_price`, p.`reduction_percent` / 100),
    		IF(p.`reduction_price` > 0, 'amount', 'percentage'),
    		IF (p.`reduction_from` = p.`reduction_to`, '0000-00-00 00:00:00', p.`reduction_from`),
    		IF (p.`reduction_from` = p.`reduction_to`, '0000-00-00 00:00:00', p.`reduction_to`)
    	FROM `PREFIX_product` p
    	WHERE p.`reduction_price` OR p.`reduction_percent`
    )
    ALTER TABLE `PREFIX_product`
    	DROP `reduction_price`,
    	DROP `reduction_percent`,
    	DROP `reduction_from`,
    	DROP `reduction_to`
    INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES
    ('PS_SPECIFIC_PRICE_PRIORITIES', 'id_shop;id_currency;id_country;id_group', NOW(), NOW()),
    ('PS_TAX_DISPLAY', 0, NOW(), NOW()),
    ('PS_SMARTY_FORCE_COMPILE', 1, NOW(), NOW()),
    ('PS_DISTANCE_UNIT', 'km', NOW(), NOW()),
    ('PS_STORES_DISPLAY_CMS', 0, NOW(), NOW()),
    ('PS_STORES_DISPLAY_FOOTER', 0, NOW(), NOW()),
    ('PS_STORES_SIMPLIFIED', 0, NOW(), NOW()),
    ('PS_STATSDATA_CUSTOMER_PAGESVIEWS', 1, NOW(), NOW()),
    ('PS_STATSDATA_PAGESVIEWS', 1, NOW(), NOW()),
    ('PS_STATSDATA_PLUGINS', 1, NOW(), NOW())
    INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_CONDITIONS_CMS_ID', IFNULL((SELECT `id_cms` FROM `PREFIX_cms` WHERE `id_cms` = 3), 0), NOW(), NOW())
    CREATE TEMPORARY TABLE `PREFIX_configuration_tmp` (
    	`value` text
    )
    SET @defaultOOS = (SELECT value FROM `PREFIX_configuration` WHERE name = 'PS_ORDER_OUT_OF_STOCK')
    UPDATE `PREFIX_product` p SET `cache_default_attribute` =  0 WHERE `id_product` NOT IN (SELECT `id_product` FROM `PREFIX_product_attribute`)
    INSERT INTO `PREFIX_hook` (`name`, `title`, `description`, `position`) VALUES ('processCarrier', 'Carrier Process', NULL, 0)
    INSERT INTO `PREFIX_stock_mvt_reason_lang` (`id_stock_mvt_reason`, `id_lang`, `name`) VALUES
    (1, 1, 'Order'),
    (1, 2, 'Commande'),
    (2, 1, 'Missing Stock Movement'),
    (2, 2, 'Mouvement de stock manquant'),
    (3, 1, 'Restocking'),
    (3, 2, 'Réassort')
    INSERT INTO `PREFIX_meta_lang` (`id_lang`, `id_meta`, `title`, `url_rewrite`) VALUES
    (1, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'authentication'), 'Authentication', 'authentication'),
    (2, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'authentication'), 'Authentification', 'authentification'),
    (3, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'authentication'), 'Autenticación', 'autenticacion')
    LOCK TABLES `admin_assert` WRITE
    UNLOCK TABLES
    DROP TABLE IF EXISTS `admin_role`
    SELECT * FROM
    -- This is another comment
    MyTable # One final comment
    /* This is a block comment 
    */ WHERE 1 = 2;
    SELECT -- This is a test
    SELECT Test FROM Test WHERE
    (
     MyColumn = 1 )) AND ((( SomeOtherColumn = 2);
    SELECT * LIMIT 1; SELECT a,b,c,d FROM e LIMIT 1, 2; SELECT 1,2,3 WHERE a in (1,2,3,4,5) and b=5;
    SELECT count - 50
    WHERE a-50 = b
    WHERE 1 and - 50
    WHERE -50 = a
    WHERE a = -50
    WHERE 1 /*test*/ - 50
    WHERE 1 and -50;
    SELECT @ and b;
    SELECT @"weird variable name";
    SELECT "no closing quote
    
    sql-formatter-1.2.17/tests/performance.php000066400000000000000000000024771226454031000205650ustar00rootroot00000000000000Formatted ".$num." queries using a max_cachekey_size of ".SqlFormatter::$max_cachekey_size."

    "; echo "

    Average query length of ".number_format($chars/$num,5)." characters

    "; echo "

    Took ".number_format($end-$start,5)." seconds total, ".number_format(($end-$start)/$num,5)." seconds per query, ".number_format(1000*($end-$start)/$chars,5)." seconds per 1000 characters

    "; echo "

    Used ".number_format($uend-$ustart)." bytes of memory

    "; echo "

    Cache Stats

    ".print_r(SqlFormatter::getCacheStats(),true)."
    "; sql-formatter-1.2.17/tests/sql.sql000066400000000000000000000267431226454031000170750ustar00rootroot00000000000000SELECT customer_id, customer_name, COUNT(order_id) as total FROM customers INNER JOIN orders ON customers.customer_id = orders.customer_id GROUP BY customer_id, customer_name HAVING COUNT(order_id) > 5 ORDER BY COUNT(order_id) DESC; UPDATE customers SET totalorders = ordersummary.total FROM (SELECT customer_id, count(order_id) As total FROM orders GROUP BY customer_id) As ordersummary WHERE customers.customer_id = ordersummary.customer_id SELECT * FROM sometable UNION ALL SELECT * FROM someothertable; SET NAMES 'utf8'; CREATE TABLE `PREFIX_address` ( `id_address` int(10) unsigned NOT NULL auto_increment, `id_country` int(10) unsigned NOT NULL, `id_state` int(10) unsigned default NULL, `id_customer` int(10) unsigned NOT NULL default '0', `id_manufacturer` int(10) unsigned NOT NULL default '0', `id_supplier` int(10) unsigned NOT NULL default '0', `id_warehouse` int(10) unsigned NOT NULL default '0', `alias` varchar(32) NOT NULL, `company` varchar(64) default NULL, `lastname` varchar(32) NOT NULL, `firstname` varchar(32) NOT NULL, `address1` varchar(128) NOT NULL, `address2` varchar(128) default NULL, `postcode` varchar(12) default NULL, `city` varchar(64) NOT NULL, `other` text, `phone` varchar(16) default NULL, `phone_mobile` varchar(16) default NULL, `vat_number` varchar(32) default NULL, `dni` varchar(16) DEFAULT NULL, `date_add` datetime NOT NULL, `date_upd` datetime NOT NULL, `active` tinyint(1) unsigned NOT NULL default '1', `deleted` tinyint(1) unsigned NOT NULL default '0', PRIMARY KEY (`id_address`), KEY `address_customer` (`id_customer`), KEY `id_country` (`id_country`), KEY `id_state` (`id_state`), KEY `id_manufacturer` (`id_manufacturer`), KEY `id_supplier` (`id_supplier`), KEY `id_warehouse` (`id_warehouse`) ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8 CREATE TABLE `PREFIX_alias` ( `id_alias` int(10) unsigned NOT NULL auto_increment, `alias` varchar(255) NOT NULL, `search` varchar(255) NOT NULL, `active` tinyint(1) NOT NULL default '1', PRIMARY KEY (`id_alias`), UNIQUE KEY `alias` (`alias`) ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8 CREATE TABLE `PREFIX_carrier` ( `id_carrier` int(10) unsigned NOT NULL AUTO_INCREMENT, `id_reference` int(10) unsigned NOT NULL, `id_tax_rules_group` int(10) unsigned DEFAULT '0', `name` varchar(64) NOT NULL, `url` varchar(255) DEFAULT NULL, `active` tinyint(1) unsigned NOT NULL DEFAULT '0', `deleted` tinyint(1) unsigned NOT NULL DEFAULT '0', `shipping_handling` tinyint(1) unsigned NOT NULL DEFAULT '1', `range_behavior` tinyint(1) unsigned NOT NULL DEFAULT '0', `is_module` tinyint(1) unsigned NOT NULL DEFAULT '0', `is_free` tinyint(1) unsigned NOT NULL DEFAULT '0', `shipping_external` tinyint(1) unsigned NOT NULL DEFAULT '0', `need_range` tinyint(1) unsigned NOT NULL DEFAULT '0', `external_module_name` varchar(64) DEFAULT NULL, `shipping_method` int(2) NOT NULL DEFAULT '0', `position` int(10) unsigned NOT NULL default '0', `max_width` int(10) DEFAULT 0, `max_height` int(10) DEFAULT 0, `max_depth` int(10) DEFAULT 0, `max_weight` int(10) DEFAULT 0, `grade` int(10) DEFAULT 0, PRIMARY KEY (`id_carrier`), KEY `deleted` (`deleted`,`active`), KEY `id_tax_rules_group` (`id_tax_rules_group`) ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8 CREATE TABLE IF NOT EXISTS `PREFIX_specific_price_rule` ( `id_specific_price_rule` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, `id_shop` int(11) unsigned NOT NULL DEFAULT '1', `id_currency` int(10) unsigned NOT NULL, `id_country` int(10) unsigned NOT NULL, `id_group` int(10) unsigned NOT NULL, `from_quantity` mediumint(8) unsigned NOT NULL, `price` DECIMAL(20,6), `reduction` decimal(20,6) NOT NULL, `reduction_type` enum('amount','percentage') NOT NULL, `from` datetime NOT NULL, `to` datetime NOT NULL, PRIMARY KEY (`id_specific_price_rule`), KEY `id_product` (`id_shop`,`id_currency`,`id_country`,`id_group`,`from_quantity`,`from`,`to`) ) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8 UPDATE `PREFIX_configuration` SET value = '6' WHERE name = 'PS_SEARCH_WEIGHT_PNAME' UPDATE `PREFIX_hook_module` SET position = 1 WHERE id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayPayment') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'cheque') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayPaymentReturn') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'cheque') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayHome') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'homeslider') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionAuthentication') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'statsdata') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionShopDataDuplication') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'homeslider') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayTop') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blocklanguages') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionCustomerAccountAdd') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'statsdata') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayCustomerAccount') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'favoriteproducts') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayAdminStatsModules') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'statsvisits') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayAdminStatsGraphEngine') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'graphvisifire') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayAdminStatsGridEngine') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'gridhtml') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayLeftColumnProduct') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blocksharefb') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionSearch') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'statssearch') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionCategoryAdd') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blockcategories') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionCategoryUpdate') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blockcategories') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionCategoryDelete') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blockcategories') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'actionAdminMetaSave') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blockcategories') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayMyAccountBlock') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'favoriteproducts') OR id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayFooter') AND id_module = (SELECT id_module FROM `PREFIX_module` WHERE name = 'blockreinsurance') ALTER TABLE `PREFIX_employee` ADD `bo_color` varchar(32) default NULL AFTER `stats_date_to` INSERT INTO `PREFIX_cms_category_lang` VALUES(1, 3, 'Inicio', '', 'home', NULL, NULL, NULL) INSERT INTO `PREFIX_cms_category` VALUES(1, 0, 0, 1, NOW(), NOW(),0) UPDATE `PREFIX_cms_category` SET `position` = 0 ALTER TABLE `PREFIX_customer` ADD `note` text AFTER `secure_key` ALTER TABLE `PREFIX_contact` ADD `customer_service` tinyint(1) NOT NULL DEFAULT 0 AFTER `email` INSERT INTO `PREFIX_specific_price` (`id_product`, `id_shop`, `id_currency`, `id_country`, `id_group`, `priority`, `price`, `from_quantity`, `reduction`, `reduction_type`, `from`, `to`) ( SELECT dq.`id_product`, 1, 1, 0, 1, 0, 0.00, dq.`quantity`, IF(dq.`id_discount_type` = 2, dq.`value`, dq.`value` / 100), IF (dq.`id_discount_type` = 2, 'amount', 'percentage'), '0000-00-00 00:00:00', '0000-00-00 00:00:00' FROM `PREFIX_discount_quantity` dq INNER JOIN `PREFIX_product` p ON (p.`id_product` = dq.`id_product`) ) DROP TABLE `PREFIX_discount_quantity` INSERT INTO `PREFIX_specific_price` (`id_product`, `id_shop`, `id_currency`, `id_country`, `id_group`, `priority`, `price`, `from_quantity`, `reduction`, `reduction_type`, `from`, `to`) ( SELECT p.`id_product`, 1, 0, 0, 0, 0, 0.00, 1, IF(p.`reduction_price` > 0, p.`reduction_price`, p.`reduction_percent` / 100), IF(p.`reduction_price` > 0, 'amount', 'percentage'), IF (p.`reduction_from` = p.`reduction_to`, '0000-00-00 00:00:00', p.`reduction_from`), IF (p.`reduction_from` = p.`reduction_to`, '0000-00-00 00:00:00', p.`reduction_to`) FROM `PREFIX_product` p WHERE p.`reduction_price` OR p.`reduction_percent` ) ALTER TABLE `PREFIX_product` DROP `reduction_price`, DROP `reduction_percent`, DROP `reduction_from`, DROP `reduction_to` INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_SPECIFIC_PRICE_PRIORITIES', 'id_shop;id_currency;id_country;id_group', NOW(), NOW()), ('PS_TAX_DISPLAY', 0, NOW(), NOW()), ('PS_SMARTY_FORCE_COMPILE', 1, NOW(), NOW()), ('PS_DISTANCE_UNIT', 'km', NOW(), NOW()), ('PS_STORES_DISPLAY_CMS', 0, NOW(), NOW()), ('PS_STORES_DISPLAY_FOOTER', 0, NOW(), NOW()), ('PS_STORES_SIMPLIFIED', 0, NOW(), NOW()), ('PS_STATSDATA_CUSTOMER_PAGESVIEWS', 1, NOW(), NOW()), ('PS_STATSDATA_PAGESVIEWS', 1, NOW(), NOW()), ('PS_STATSDATA_PLUGINS', 1, NOW(), NOW()) INSERT INTO `PREFIX_configuration` (`name`, `value`, `date_add`, `date_upd`) VALUES ('PS_CONDITIONS_CMS_ID', IFNULL((SELECT `id_cms` FROM `PREFIX_cms` WHERE `id_cms` = 3), 0), NOW(), NOW()) CREATE TEMPORARY TABLE `PREFIX_configuration_tmp` ( `value` text ) SET @defaultOOS = (SELECT value FROM `PREFIX_configuration` WHERE name = 'PS_ORDER_OUT_OF_STOCK') UPDATE `PREFIX_product` p SET `cache_default_attribute` = 0 WHERE `id_product` NOT IN (SELECT `id_product` FROM `PREFIX_product_attribute`) INSERT INTO `PREFIX_hook` (`name`, `title`, `description`, `position`) VALUES ('processCarrier', 'Carrier Process', NULL, 0) INSERT INTO `PREFIX_stock_mvt_reason_lang` (`id_stock_mvt_reason`, `id_lang`, `name`) VALUES (1, 1, 'Order'), (1, 2, 'Commande'), (2, 1, 'Missing Stock Movement'), (2, 2, 'Mouvement de stock manquant'), (3, 1, 'Restocking'), (3, 2, 'Réassort') INSERT INTO `PREFIX_meta_lang` (`id_lang`, `id_meta`, `title`, `url_rewrite`) VALUES (1, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'authentication'), 'Authentication', 'authentication'), (2, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'authentication'), 'Authentification', 'authentification'), (3, (SELECT `id_meta` FROM `PREFIX_meta` WHERE `page` = 'authentication'), 'Autenticación', 'autenticacion') LOCK TABLES `admin_assert` WRITE UNLOCK TABLES DROP TABLE IF EXISTS `admin_role` SELECT * FROM -- This is another comment MyTable # One final comment /* This is a block comment */ WHERE 1 = 2; SELECT -- This is a test SELECT Test FROM Test WHERE ( MyColumn = 1 )) AND ((( SomeOtherColumn = 2); SELECT * LIMIT 1; SELECT a,b,c,d FROM e LIMIT 1, 2; SELECT 1,2,3 WHERE a in (1,2,3,4,5) and b=5; SELECT count - 50 WHERE a-50 = b WHERE 1 and - 50 WHERE -50 = a WHERE a = -50 WHERE 1 /*test*/ - 50 WHERE 1 and -50; SELECT @ and b; SELECT @"weird variable name"; SELECT "no closing quote