diff --git a/.travis.yml b/.travis.yml index c7fc59c0..3be5a067 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,15 @@ -sudo: true +sudo: false addons: postgresql: "9.3" + apt: + packages: + - pkg-config + - libcairo2-dev + - libjpeg8-dev + - libgif-dev before_install: - - sudo apt-get update - - sudo apt-get install -y postgresql-plpython-9.3 pkg-config libcairo2-dev libjpeg8-dev libgif-dev - npm install -g npm@2 - createdb template_postgis - createuser publicuser diff --git a/NEWS.md b/NEWS.md index 4afbaec7..8fa300d8 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,8 +1,16 @@ # Changelog +## 2.26.4 + +Released 2016-mm-dd + + ## 2.26.3 -Released 2016-mm-dd +Released 2016-03-03 + +Improvements: + - Optimize overviews queries for efficient spatial filtering in PostgreSQL ## 2.26.2 diff --git a/lib/cartodb/utils/overviews_query_rewriter.js b/lib/cartodb/utils/overviews_query_rewriter.js index 0b6c592a..622c2018 100644 --- a/lib/cartodb/utils/overviews_query_rewriter.js +++ b/lib/cartodb/utils/overviews_query_rewriter.js @@ -74,14 +74,9 @@ function overviews_view_name(table) { } // replace a table name in a query by anoter name -function replace_table_in_query(sql, old_table_name, new_table_name) { +function replace_table_in_query(sql, old_table_name, replacement) { var old_table = TableNameParser.parse(old_table_name); - var new_table = TableNameParser.parse(new_table_name); var old_table_ident = TableNameParser.table_identifier(old_table); - var new_table_ident = TableNameParser.table_identifier(new_table); - - // text that will be substituted by the table name pattern - var replacement = new_table_ident; // regular expression prefix (beginning) to match a table name function pattern_prefix(schema, identifier) { @@ -127,12 +122,13 @@ function replace_table_in_query(sql, old_table_name, new_table_name) { function overviews_query(query, overviews, zoom_level_expression) { var replaced_query = query; var sql = "WITH\n _vovw_scale AS ( SELECT " + zoom_level_expression + " AS _vovw_z )"; + var replacement; for ( var table in overviews ) { if (overviews.hasOwnProperty(table)) { var table_overviews = overviews[table]; var table_view = overviews_view_name(table); - replaced_query = replace_table_in_query(replaced_query, table, table_view); - sql += ",\n " + table_view + " AS (\n" + overviews_view_for_table(table, table_overviews) + "\n )"; + replacement = "(\n" + overviews_view_for_table(table, table_overviews) + "\n ) AS " + table_view; + replaced_query = replace_table_in_query(replaced_query, table, replacement); } } if ( replaced_query !== query ) { @@ -173,7 +169,7 @@ OverviewsQueryRewriter.prototype.query = function(query, data) { OverviewsQueryRewriter.prototype.is_supported_query = function(sql) { return !!sql.match( - /^\s*SELECT\s+[\*\.a-z0-9_,\s]+?\s+FROM\s+((\"[^"]+\"|[a-z0-9_]+)\.)?(\"[^"]+\"|[a-z0-9_]+)\s*;?\s*$/i + /^\s*SELECT\s+[\*a-z0-9_,\s]+?\s+FROM\s+((\"[^"]+\"|[a-z0-9_]+)\.)?(\"[^"]+\"|[a-z0-9_]+)\s*;?\s*$/i ); }; diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index c3147734..373ce17c 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "windshaft-cartodb", - "version": "2.26.3", + "version": "2.26.4", "dependencies": { "body-parser": { "version": "1.14.2", @@ -84,14 +84,14 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" }, "mime-types": { - "version": "2.1.10", + "version": "2.1.9", "from": "mime-types@>=2.1.9 <2.2.0", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.10.tgz", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", "dependencies": { "mime-db": { - "version": "1.22.0", - "from": "mime-db@>=1.22.0 <1.23.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.22.0.tgz" + "version": "1.21.0", + "from": "mime-db@>=1.21.0 <1.22.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz" } } } @@ -192,14 +192,14 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", "dependencies": { "mime-types": { - "version": "2.1.10", + "version": "2.1.9", "from": "mime-types@>=2.1.6 <2.2.0", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.10.tgz", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", "dependencies": { "mime-db": { - "version": "1.22.0", - "from": "mime-db@>=1.22.0 <1.23.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.22.0.tgz" + "version": "1.21.0", + "from": "mime-db@>=1.21.0 <1.22.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz" } } }, @@ -372,7 +372,7 @@ }, "type-is": { "version": "1.6.11", - "from": "type-is@>=1.6.10 <1.7.0", + "from": "type-is@>=1.6.6 <1.7.0", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.11.tgz", "dependencies": { "media-typer": { @@ -381,14 +381,14 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" }, "mime-types": { - "version": "2.1.10", + "version": "2.1.9", "from": "mime-types@>=2.1.6 <2.2.0", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.10.tgz", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", "dependencies": { "mime-db": { - "version": "1.22.0", - "from": "mime-db@>=1.22.0 <1.23.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.22.0.tgz" + "version": "1.21.0", + "from": "mime-db@>=1.21.0 <1.22.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz" } } } @@ -525,9 +525,9 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.62.0.tgz", "dependencies": { "bl": { - "version": "1.0.3", + "version": "1.0.2", "from": "bl@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.2.tgz", "dependencies": { "readable-stream": { "version": "2.0.5", @@ -590,7 +590,7 @@ "dependencies": { "async": { "version": "1.5.2", - "from": "async@>=1.0.0 <2.0.0", + "from": "async@>=1.4.0 <2.0.0", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz" } } @@ -601,14 +601,14 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" }, "mime-types": { - "version": "2.1.10", - "from": "mime-types@>=2.1.9 <2.2.0", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.10.tgz", + "version": "2.1.9", + "from": "mime-types@>=2.1.2 <2.2.0", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", "dependencies": { "mime-db": { - "version": "1.22.0", - "from": "mime-db@>=1.22.0 <1.23.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.22.0.tgz" + "version": "1.21.0", + "from": "mime-db@>=1.21.0 <1.22.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz" } } }, @@ -729,21 +729,14 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", "dependencies": { "ansi-styles": { - "version": "2.2.0", + "version": "2.1.0", "from": "ansi-styles@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.0.tgz", - "dependencies": { - "color-convert": { - "version": "1.0.0", - "from": "color-convert@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.0.0.tgz" - } - } + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz" }, "escape-string-regexp": { - "version": "1.0.5", + "version": "1.0.4", "from": "escape-string-regexp@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.4.tgz" }, "has-ansi": { "version": "2.0.0", @@ -758,9 +751,9 @@ } }, "strip-ansi": { - "version": "3.0.1", + "version": "3.0.0", "from": "strip-ansi@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", "dependencies": { "ansi-regex": { "version": "2.0.0", @@ -789,9 +782,9 @@ } }, "is-my-json-valid": { - "version": "2.13.1", + "version": "2.12.4", "from": "is-my-json-valid@>=2.12.0 <3.0.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.4.tgz", "dependencies": { "generate-function": { "version": "2.0.0", @@ -3737,6 +3730,7 @@ "turbo-cartocss": { "version": "0.4.0", "from": "turbo-cartocss@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/turbo-cartocss/-/turbo-cartocss-0.4.0.tgz", "dependencies": { "browser-request": { "version": "0.3.3", @@ -3824,9 +3818,9 @@ } }, "postcss": { - "version": "5.0.16", + "version": "5.0.19", "from": "postcss@>=5.0.13 <6.0.0", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.0.16.tgz", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.0.19.tgz", "dependencies": { "supports-color": { "version": "3.1.2", @@ -3873,9 +3867,28 @@ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz" }, "aws4": { - "version": "1.2.1", + "version": "1.3.2", "from": "aws4@>=1.2.1 <2.0.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.2.1.tgz" + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.3.2.tgz", + "dependencies": { + "lru-cache": { + "version": "4.0.0", + "from": "lru-cache@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.0.tgz", + "dependencies": { + "pseudomap": { + "version": "1.0.2", + "from": "pseudomap@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" + }, + "yallist": { + "version": "2.0.0", + "from": "yallist@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz" + } + } + } + } }, "bl": { "version": "1.0.3", diff --git a/package.json b/package.json index c4dd8148..60eb890e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "windshaft-cartodb", - "version": "2.26.3", + "version": "2.26.4", "description": "A map tile server for CartoDB", "keywords": [ "cartodb" diff --git a/test/support/prepare_db.sh b/test/support/prepare_db.sh index 10b34830..f573e819 100755 --- a/test/support/prepare_db.sh +++ b/test/support/prepare_db.sh @@ -78,8 +78,10 @@ if test x"$PREPARE_PGSQL" = xyes; then sed "s/:TESTPASS/${TESTPASS}/" | psql -v ON_ERROR_STOP=1 ${TEST_DB} || exit 1 - psql -c "CREATE LANGUAGE plpythonu;" ${TEST_DB} - for i in CDB_QueryStatements CDB_QueryTables CDB_CartodbfyTable CDB_TableMetadata CDB_ForeignTable CDB_UserTables CDB_ColumnNames CDB_ZoomFromScale CDB_Overviews + cat sql/_CDB_QueryStatements.sql | psql -v ON_ERROR_STOP=1 ${TEST_DB} || exit 1 + + SQL_SCRIPTS='CDB_QueryTables CDB_CartodbfyTable CDB_TableMetadata CDB_ForeignTable CDB_UserTables CDB_ColumnNames CDB_ZoomFromScale CDB_Overviews' + for i in ${SQL_SCRIPTS} do curl -L -s https://github.com/CartoDB/cartodb-postgresql/raw/master/scripts-available/$i.sql -o sql/$i.sql cat sql/$i.sql | sed -e 's/cartodb\./public./g' -e "s/''cartodb''/''public''/g" \ diff --git a/test/support/sql/_CDB_QueryStatements.sql b/test/support/sql/_CDB_QueryStatements.sql new file mode 100644 index 00000000..27627280 --- /dev/null +++ b/test/support/sql/_CDB_QueryStatements.sql @@ -0,0 +1,16 @@ +-- DUMMY IMPLEMENTATION +-- Ref: https://github.com/CartoDB/cartodb-postgresql/blob/master/scripts-available/CDB_QueryStatements.sql +-- Originally implemented in plpython for performance reasons + +-- Return an array of statements found in the given query text +-- +-- Regexp curtesy of Hubert Lubaczewski (depesz) +-- +CREATE OR REPLACE FUNCTION CDB_QueryStatements(query text) +RETURNS SETOF TEXT AS $$ + with matches as ( + select regexp_matches($1, $regexp$((?:[^'"$;]+|"[^"]*"|'[^']*'|(\$[^$]*\$).*?\2)+)$regexp$, 'g') as m + ) + select btrim(m[1]) from matches +$$ +LANGUAGE SQL IMMUTABLE STRICT; diff --git a/test/unit/cartodb/overviews_query_rewriter.js b/test/unit/cartodb/overviews_query_rewriter.js index 9adbe031..b58b55b0 100644 --- a/test/unit/cartodb/overviews_query_rewriter.js +++ b/test/unit/cartodb/overviews_query_rewriter.js @@ -57,15 +57,15 @@ describe('Overviews query rewriter', function() { } }; var overviews_sql = overviewsQueryRewriter.query(sql, data); + var expected_sql = "\ WITH\ - _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z ),\ - _vovw_table1 AS (\ + _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z )\ + SELECT * FROM (\ SELECT * FROM table1_ov0, _vovw_scale WHERE _vovw_z = 0\ UNION ALL\ SELECT * FROM table1, _vovw_scale WHERE _vovw_z > 0\ - )\ - SELECT * FROM _vovw_table1\ + ) AS _vovw_table1\ "; assertSameSql(overviews_sql, expected_sql); done(); @@ -83,13 +83,12 @@ describe('Overviews query rewriter', function() { var overviews_sql = overviewsQueryRewriter.query(sql, data); var expected_sql = "\ WITH\ - _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z ),\ - _vovw_table1 AS (\ + _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z )\ + SELECT * FROM (\ SELECT * FROM table1_ov2, _vovw_scale WHERE _vovw_z <= 2\ UNION ALL\ SELECT * FROM table1, _vovw_scale WHERE _vovw_z > 2\ - )\ - SELECT * FROM _vovw_table1\ + ) AS _vovw_table1\ "; assertSameSql(overviews_sql, expected_sql); done(); @@ -110,8 +109,8 @@ describe('Overviews query rewriter', function() { var overviews_sql = overviewsQueryRewriter.query(sql, data); var expected_sql = "\ WITH\ - _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z ),\ - _vovw_table1 AS (\ + _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z )\ + SELECT * FROM (\ SELECT * FROM table1_ov0, _vovw_scale WHERE _vovw_z = 0\ UNION ALL\ SELECT * FROM table1_ov1, _vovw_scale WHERE _vovw_z = 1\ @@ -121,8 +120,7 @@ describe('Overviews query rewriter', function() { SELECT * FROM table1_ov3, _vovw_scale WHERE _vovw_z = 3\ UNION ALL\ SELECT * FROM table1, _vovw_scale WHERE _vovw_z > 3\ - )\ - SELECT * FROM _vovw_table1\ + ) AS _vovw_table1\ "; assertSameSql(overviews_sql, expected_sql); done(); @@ -142,8 +140,8 @@ describe('Overviews query rewriter', function() { var overviews_sql = overviewsQueryRewriter.query(sql, data); var expected_sql = "\ WITH\ - _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z ),\ - _vovw_table1 AS (\ + _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z )\ + SELECT * FROM (\ SELECT * FROM table1_ov0, _vovw_scale WHERE _vovw_z = 0\ UNION ALL\ SELECT * FROM table1_ov1, _vovw_scale WHERE _vovw_z = 1\ @@ -151,8 +149,7 @@ describe('Overviews query rewriter', function() { SELECT * FROM table1_ov6, _vovw_scale WHERE _vovw_z > 1 AND _vovw_z <= 6\ UNION ALL\ SELECT * FROM table1, _vovw_scale WHERE _vovw_z > 6\ - )\ - SELECT * FROM _vovw_table1\ + ) AS _vovw_table1\ "; assertSameSql(overviews_sql, expected_sql); done(); @@ -170,13 +167,12 @@ describe('Overviews query rewriter', function() { var overviews_sql = overviewsQueryRewriter.query(sql, data); var expected_sql = "\ WITH\ - _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z ),\ - _vovw_table1 AS (\ + _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z )\ + SELECT * FROM (\ SELECT * FROM public.table1_ov2, _vovw_scale WHERE _vovw_z <= 2\ UNION ALL\ SELECT * FROM public.table1, _vovw_scale WHERE _vovw_z > 2\ - )\ - SELECT * FROM _vovw_table1\ + ) AS _vovw_table1\ "; assertSameSql(overviews_sql, expected_sql); done(); @@ -194,13 +190,12 @@ describe('Overviews query rewriter', function() { var overviews_sql = overviewsQueryRewriter.query(sql, data); var expected_sql = "\ WITH\ - _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z ),\ - _vovw_table1 AS (\ + _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z )\ + SELECT * FROM (\ SELECT * FROM public.table1_ov2, _vovw_scale WHERE _vovw_z <= 2\ UNION ALL\ SELECT * FROM public.table1, _vovw_scale WHERE _vovw_z > 2\ - )\ - SELECT * FROM _vovw_table1\ + ) AS _vovw_table1\ "; assertSameSql(overviews_sql, expected_sql); @@ -219,13 +214,12 @@ describe('Overviews query rewriter', function() { var overviews_sql = overviewsQueryRewriter.query(sql, data); var expected_sql = "\ WITH\ - _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z ),\ - \"_vovw_table 1\" AS (\ + _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z )\ + SELECT * FROM (\ SELECT * FROM public.\"table 1_ov2\", _vovw_scale WHERE _vovw_z <= 2\ UNION ALL\ SELECT * FROM public.\"table 1\", _vovw_scale WHERE _vovw_z > 2\ - )\ - SELECT * FROM \"_vovw_table 1\"\ + ) AS \"_vovw_table 1\"\ "; assertSameSql(overviews_sql, expected_sql); done(); @@ -243,13 +237,12 @@ describe('Overviews query rewriter', function() { var overviews_sql = overviewsQueryRewriter.query(sql, data); var expected_sql = "\ WITH\ - _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z ),\ - _vovw_table1 AS (\ + _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z )\ + SELECT * FROM (\ SELECT * FROM \"user-1\".table1_ov2, _vovw_scale WHERE _vovw_z <= 2\ UNION ALL\ SELECT * FROM \"user-1\".table1, _vovw_scale WHERE _vovw_z > 2\ - )\ - SELECT * FROM _vovw_table1\ + ) AS _vovw_table1\ "; assertSameSql(overviews_sql, expected_sql); done(); @@ -269,13 +262,12 @@ describe('Overviews query rewriter', function() { var overviews_sql = overviewsQueryRewriter.query(sql, data); var expected_sql = "\ WITH\ - _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z ),\ - \"_vovw_table 1\" AS (\ + _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z )\ + SELECT * FROM (\ SELECT * FROM \"user-1\".\"table 1_ov2\", _vovw_scale WHERE _vovw_z <= 2\ UNION ALL\ SELECT * FROM \"user-1\".\"table 1\", _vovw_scale WHERE _vovw_z > 2\ - )\ - SELECT * FROM \"_vovw_table 1\"\ + ) AS \"_vovw_table 1\"\ "; assertSameSql(overviews_sql, expected_sql); done(); @@ -294,44 +286,19 @@ describe('Overviews query rewriter', function() { var overviews_sql = overviewsQueryRewriter.query(sql, data); var expected_sql = "\ WITH\ - _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z ),\ - _vovw_table1 AS (\ + _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z )\ + SELECT column1, column2, column3 FROM (\ SELECT * FROM table1_ov2, _vovw_scale WHERE _vovw_z <= 2\ UNION ALL\ SELECT * FROM table1, _vovw_scale WHERE _vovw_z > 2\ - )\ - SELECT column1, column2, column3 FROM _vovw_table1\ - "; - assertSameSql(overviews_sql, expected_sql); - done(); - }); - - it('generates query using overviews for queries with selected columns and all columns', function(done){ - var sql = "SELECT table1.*, column1, column2, column3 FROM table1"; - var data = { - overviews: { - table1: { - 2: { table: 'table1_ov2' } - } - } - }; - var overviews_sql = overviewsQueryRewriter.query(sql, data); - var expected_sql = "\ - WITH\ - _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z ),\ - _vovw_table1 AS (\ - SELECT * FROM table1_ov2, _vovw_scale WHERE _vovw_z <= 2\ - UNION ALL\ - SELECT * FROM table1, _vovw_scale WHERE _vovw_z > 2\ - )\ - SELECT _vovw_table1.*, column1, column2, column3 FROM _vovw_table1\ + ) AS _vovw_table1\ "; assertSameSql(overviews_sql, expected_sql); done(); }); it('generates query using overviews for queries with a semicolon', function(done){ - var sql = "SELECT table1.*, column1, column2, column3 FROM table1;"; + var sql = "SELECT column1, column2, column3 FROM table1;"; var data = { overviews: { table1: { @@ -340,22 +307,22 @@ describe('Overviews query rewriter', function() { } }; var overviews_sql = overviewsQueryRewriter.query(sql, data); + var expected_sql = "\ WITH\ - _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z ),\ - _vovw_table1 AS (\ + _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z )\ + SELECT column1, column2, column3 FROM (\ SELECT * FROM table1_ov2, _vovw_scale WHERE _vovw_z <= 2\ UNION ALL\ SELECT * FROM table1, _vovw_scale WHERE _vovw_z > 2\ - )\ - SELECT _vovw_table1.*, column1, column2, column3 FROM _vovw_table1;\ + ) AS _vovw_table1;\ "; assertSameSql(overviews_sql, expected_sql); done(); }); it('generates query using overviews for queries with extra whitespace', function(done){ - var sql = " SELECT table1.* , column1,column2, column3 FROM table1 "; + var sql = " SELECT column1,column2, column3 FROM table1 "; var data = { overviews: { table1: { @@ -366,13 +333,12 @@ describe('Overviews query rewriter', function() { var overviews_sql = overviewsQueryRewriter.query(sql, data); var expected_sql = "\ WITH\ - _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z ),\ - _vovw_table1 AS (\ + _vovw_scale AS ( SELECT ZoomLevel() AS _vovw_z )\ + SELECT column1,column2, column3 FROM (\ SELECT * FROM table1_ov2, _vovw_scale WHERE _vovw_z <= 2\ UNION ALL\ SELECT * FROM table1, _vovw_scale WHERE _vovw_z > 2\ - )\ - SELECT _vovw_table1.* , column1,column2, column3 FROM _vovw_table1\ + ) AS _vovw_table1\ "; assertSameSql(overviews_sql, expected_sql); done(); @@ -422,6 +388,10 @@ describe('Overviews query rewriter', function() { overviews_sql = overviewsQueryRewriter.query(sql, data); assert.equal(overviews_sql, sql); + sql = "SELECT table1.*, column1, column2, column3 FROM table1"; + overviews_sql = overviewsQueryRewriter.query(sql, data); + assert.equal(overviews_sql, sql); + done(); });