Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | A fix for queries that used correlated, compound sub-queries in the HAVING clause. Also update fuzz.test some more. (CVS 4001) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
da0c1ab4deedd2b952a43b3af6962a94 |
User & Date: | danielk1977 2007-05-15 07:00:34.000 |
Context
2007-05-15
| ||
07:14 | Fix some test script errors in fuzz.test. (CVS 4002) (check-in: 51eeae7b7a user: danielk1977 tags: trunk) | |
07:00 | A fix for queries that used correlated, compound sub-queries in the HAVING clause. Also update fuzz.test some more. (CVS 4001) (check-in: da0c1ab4de user: danielk1977 tags: trunk) | |
03:56 | Fix problems in ALTER TABLE that occur when column or table names are invalid UTF encodings. (CVS 4000) (check-in: 9ff382f458 user: drh tags: trunk) | |
Changes
Changes to src/expr.c.
︙ | ︙ | |||
8 9 10 11 12 13 14 | ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** This file contains routines used for analyzing expressions and ** for generating VDBE code that evaluates expressions in SQLite. ** | | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** This file contains routines used for analyzing expressions and ** for generating VDBE code that evaluates expressions in SQLite. ** ** $Id: expr.c,v 1.294 2007/05/15 07:00:34 danielk1977 Exp $ */ #include "sqliteInt.h" #include <ctype.h> /* ** Return the 'affinity' of the expression pExpr if any. ** |
︙ | ︙ | |||
800 801 802 803 804 805 806 807 808 809 810 811 812 813 | */ static int walkSelectExpr(Select *p, int (*xFunc)(void *, Expr*), void *pArg){ walkExprList(p->pEList, xFunc, pArg); walkExprTree(p->pWhere, xFunc, pArg); walkExprList(p->pGroupBy, xFunc, pArg); walkExprTree(p->pHaving, xFunc, pArg); walkExprList(p->pOrderBy, xFunc, pArg); return 0; } /* ** This routine is designed as an xFunc for walkExprTree(). ** | > > > | 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 | */ static int walkSelectExpr(Select *p, int (*xFunc)(void *, Expr*), void *pArg){ walkExprList(p->pEList, xFunc, pArg); walkExprTree(p->pWhere, xFunc, pArg); walkExprList(p->pGroupBy, xFunc, pArg); walkExprTree(p->pHaving, xFunc, pArg); walkExprList(p->pOrderBy, xFunc, pArg); if( p->pPrior ){ walkSelectExpr(p->pPrior, xFunc, pArg); } return 0; } /* ** This routine is designed as an xFunc for walkExprTree(). ** |
︙ | ︙ |
Changes to test/fuzz.test.
︙ | ︙ | |||
15 16 17 18 19 20 21 | # # The tests in this file are really about testing fuzzily generated # SQL parse-trees. The majority of the fuzzily generated SQL is # valid as far as the parser is concerned. # # The most complicated trees are for SELECT statements. # | | | > | > | 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | # # The tests in this file are really about testing fuzzily generated # SQL parse-trees. The majority of the fuzzily generated SQL is # valid as far as the parser is concerned. # # The most complicated trees are for SELECT statements. # # $Id: fuzz.test,v 1.11 2007/05/15 07:00:34 danielk1977 Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl set ::REPEATS 5000 if {[info exists $::ISQUICK]} { if {$::ISQUICK} { set ::REPEATS 20 } } proc fuzz {TemplateList} { set n [llength $TemplateList] set i [expr {int(rand()*$n)}] set r [uplevel 1 subst -novar [list [lindex $TemplateList $i]]] string map {"\n" " "} $r |
︙ | ︙ | |||
175 176 177 178 179 180 181 | # If this is already greater than 3, do not generate a complicated # SELECT statement. This tends to cause parser stack overflow (too # boring to bother with). # if {$::SelectDepth < 4} { lappend TemplateList \ {[SelectKw] [ResultSet $nRes $::ColumnList] FROM ([Select])} \ | | | | | | | | 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 | # If this is already greater than 3, do not generate a complicated # SELECT statement. This tends to cause parser stack overflow (too # boring to bother with). # if {$::SelectDepth < 4} { lappend TemplateList \ {[SelectKw] [ResultSet $nRes $::ColumnList] FROM ([Select])} \ {[SelectKw] [ResultSet $nRes] FROM ([Select])} \ {[SelectKw] [ResultSet $nRes $::ColumnList] FROM [Table]} \ { [SelectKw] [ResultSet $nRes $::ColumnList] FROM ([Select]) GROUP BY [Expr] HAVING [Expr] } \ if {0 == $nRes} { lappend TemplateList \ {[SelectKw] * FROM ([Select])} \ {[SelectKw] * FROM [Table]} \ {[SelectKw] * FROM [Table] WHERE [Expr $::ColumnList]} \ { [SelectKw] * FROM [Table],[Table] AS t2 WHERE [Expr $::ColumnList] } { [SelectKw] * FROM [Table] LEFT OUTER JOIN [Table] AS t2 |
︙ | ︙ | |||
316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 | set TemplateList { {INTEGER PRIMARY KEY} {VARCHAR [Check]} {PRIMARY KEY} } fuzz $TemplateList } proc CreateTable {} { set TemplateList { {CREATE TABLE [Identifier]([Identifier] [Coltype], [Identifier] [Coltype])} {CREATE TEMP TABLE [Identifier]([Identifier] [Coltype])} } fuzz $TemplateList } ######################################################################## set ::log [open fuzzy.log w] | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 | set TemplateList { {INTEGER PRIMARY KEY} {VARCHAR [Check]} {PRIMARY KEY} } fuzz $TemplateList } proc DropTable {} { set TemplateList { {DROP TABLE IF EXISTS [Identifier]} } fuzz $TemplateList } proc CreateView {} { set TemplateList { {CREATE VIEW [Identifier] AS [Select]} } fuzz $TemplateList } proc DropView {} { set TemplateList { {DROP VIEW IF EXISTS [Identifier]} } fuzz $TemplateList } proc CreateTable {} { set TemplateList { {CREATE TABLE [Identifier]([Identifier] [Coltype], [Identifier] [Coltype])} {CREATE TEMP TABLE [Identifier]([Identifier] [Coltype])} } fuzz $TemplateList } proc CreateOrDropTableOrView {} { set TemplateList { {[CreateTable]} {[DropTable]} {[CreateView]} {[DropView]} } fuzz $TemplateList } ######################################################################## set ::log [open fuzzy.log w] |
︙ | ︙ | |||
491 492 493 494 495 496 497 498 499 500 501 502 503 504 | # the ORDER BY list than the result-set list. The temporary b-tree # used for sorting was being misconfigured in this case. # execsql { SELECT 'abcd' UNION SELECT 'efgh' ORDER BY 1 ASC, 1 ASC; } } {abcd efgh} #---------------------------------------------------------------- # Test some fuzzily generated expressions. # do_fuzzy_test fuzz-2 -template { SELECT [Expr] } do_test fuzz-3.1 { | > > > > > > > > > > > > > > > > > > > > | 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 | # the ORDER BY list than the result-set list. The temporary b-tree # used for sorting was being misconfigured in this case. # execsql { SELECT 'abcd' UNION SELECT 'efgh' ORDER BY 1 ASC, 1 ASC; } } {abcd efgh} do_test fuzz-1.14.1 { execsql { CREATE TABLE abc(a, b, c); INSERT INTO abc VALUES(123, 456, 789); } # The [a] reference in the sub-select was causing a problem. Because # the internal walkSelectExpr() function was not considering compound # SELECT operators. execsql { SELECT 1 FROM abc GROUP BY c HAVING EXISTS (SELECT a UNION SELECT 123); } } {1} do_test fuzz-1.14.2 { execsql { DROP TABLE abc; } } {} #---------------------------------------------------------------- # Test some fuzzily generated expressions. # do_fuzzy_test fuzz-2 -template { SELECT [Expr] } do_test fuzz-3.1 { |
︙ | ︙ | |||
561 562 563 564 565 566 567 | do_test fuzz-7.1 {execsql BEGIN} {} do_fuzzy_test fuzz-7.2 -template {[Statement]} -errorlist $E integrity_check fuzz-7.3.integrity do_test fuzz-7.4 {execsql COMMIT} {} integrity_check fuzz-7.5.integrity #---------------------------------------------------------------- | | > | < | 613 614 615 616 617 618 619 620 621 622 623 624 625 626 | do_test fuzz-7.1 {execsql BEGIN} {} do_fuzzy_test fuzz-7.2 -template {[Statement]} -errorlist $E integrity_check fuzz-7.3.integrity do_test fuzz-7.4 {execsql COMMIT} {} integrity_check fuzz-7.5.integrity #---------------------------------------------------------------- # Many CREATE and DROP TABLE statements: # set E [list table duplicate {no such col} {ambiguous column name}] do_fuzzy_test fuzz-8.1 -template {[CreateOrDropTableOrView]} -errorlist $E close $::log finish_test |