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

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

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Critical
    • Resolution: Fixed
    • 2.0-beta-3
    • 2.0-beta-3, 1.8.7
    • 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

          Activity

            People

              paulk Paul King
              russel Dr. Russel Winder
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: