Details
-
Bug
-
Status: Closed
-
Critical
-
Resolution: Fixed
-
2.0-beta-3
-
None
-
None
Description
All the examples of using findAll in the Sql DataSet class use literals for the search values of queries. Using free variables causes failure as Groovy does not implement lexical closure automatically. However this can be realized using the Closure delegate field. I therefore believe that the following example fails because the Sql.SqlWhereVisitor fails to lookup variables but assumes that all query values are literals.
import groovy.sql.DataSet import groovy.sql.Sql @Grapes ( [ @Grab ( 'org.xerial:sqlite-jdbc:3.7.2' ), @GrabConfig ( systemClassLoader = true ) ] ) def database final words = [ ] try { database = Sql.newInstance ( 'jdbc:sqlite:database.db' , 'org.sqlite.JDBC') final wordsTable = new DataSet ( database , 'words' ) ( 0 ..< 4 ).each { i -> final query = { item -> item.id == i } query.delegate = { i : i } query.resolveStrategy = Closure.DELEGATE_FIRST words << wordsTable.findAll ( query ).firstRow ( ).word } } finally { database?.close ( ) } println words.join ( '' )
Attachments
Issue Links
- relates to
-
GROOVY-5373 Sql DataSet fails to work with non-literals in queries (enhancement required)
- Open