Uploaded image for project: 'Groovy'
  1. Groovy
  2. GROOVY-5371

Sql DataSet fails to work with non-literals in queries (fix error message/doco)

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Critical
    • Resolution: Fixed
    • Affects Version/s: 2.0-beta-3
    • Fix Version/s: 2.0-beta-3, 1.8.7
    • Component/s: None
    • Labels:
      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

            Activity

              People

              • Assignee:
                paulk Paul King
                Reporter:
                russel Russel Winder
              • Votes:
                0 Vote for this issue
                Watchers:
                2 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: