sequel 4.11.0 → 4.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/CHANGELOG +32 -0
 - data/Rakefile +1 -5
 - data/doc/opening_databases.rdoc +5 -1
 - data/doc/release_notes/4.12.0.txt +105 -0
 - data/lib/sequel/adapters/jdbc.rb +1 -0
 - data/lib/sequel/adapters/oracle.rb +1 -0
 - data/lib/sequel/adapters/postgres.rb +17 -8
 - data/lib/sequel/adapters/shared/cubrid.rb +2 -1
 - data/lib/sequel/adapters/shared/db2.rb +1 -0
 - data/lib/sequel/adapters/shared/mssql.rb +1 -0
 - data/lib/sequel/adapters/shared/postgres.rb +23 -2
 - data/lib/sequel/adapters/shared/sqlanywhere.rb +1 -0
 - data/lib/sequel/adapters/sqlite.rb +11 -5
 - data/lib/sequel/database/query.rb +14 -1
 - data/lib/sequel/dataset/prepared_statements.rb +2 -1
 - data/lib/sequel/dataset/query.rb +48 -37
 - data/lib/sequel/dataset/sql.rb +0 -39
 - data/lib/sequel/extensions/pg_interval.rb +1 -1
 - data/lib/sequel/extensions/pg_static_cache_updater.rb +11 -5
 - data/lib/sequel/model/associations.rb +2 -2
 - data/lib/sequel/plugins/auto_validations.rb +16 -4
 - data/lib/sequel/plugins/hook_class_methods.rb +1 -1
 - data/lib/sequel/plugins/nested_attributes.rb +72 -59
 - data/lib/sequel/plugins/prepared_statements.rb +16 -5
 - data/lib/sequel/plugins/prepared_statements_associations.rb +14 -0
 - data/lib/sequel/sql.rb +2 -43
 - data/lib/sequel/version.rb +1 -1
 - data/spec/adapters/postgres_spec.rb +49 -20
 - data/spec/bin_spec.rb +2 -2
 - data/spec/core/dataset_spec.rb +18 -6
 - data/spec/core/schema_spec.rb +2 -1
 - data/spec/extensions/auto_validations_spec.rb +23 -2
 - data/spec/extensions/nested_attributes_spec.rb +32 -1
 - data/spec/extensions/pg_static_cache_updater_spec.rb +12 -0
 - data/spec/extensions/prepared_statements_associations_spec.rb +17 -17
 - data/spec/extensions/prepared_statements_spec.rb +11 -8
 - data/spec/integration/plugin_test.rb +43 -0
 - data/spec/integration/schema_test.rb +7 -0
 - data/spec/model/eager_loading_spec.rb +9 -0
 - metadata +4 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: b15d571f0ccc175749541cfee443b953dcd145fd
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 9dec9dd2f6816432f511c0153737646e44da31a1
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: ec94d8b6fcd34fecdb4d4c3cc4f2b4fb0277c8d7289baebde098b8b84cc99ab0bfd0ab28effa316df0a0fbba1a7bf2cc3bc0fbbfc682e68f6d50326652719306
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 919e8651ded7808d66e95788af7993c4b13136487bed14b6e12db2150bca22ab166eef6e0eeb5350b2e2aebdb6f72c36f47ef7dfaef4e3eea2170c396f15f02c
         
     | 
    
        data/CHANGELOG
    CHANGED
    
    | 
         @@ -1,3 +1,35 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            === 4.12.0 (2014-07-01)
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            * Support :readonly Database option in sqlite adapter (ippeiukai, jeremyevans) (#832)
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            * Automatically setup max_length validations for string columns in the auto_validations plugin (jeremyevans)
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            * Add :max_length entry to column schema hashes for string types (jeremyevans)
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            * Add :before_thread_exit option to Database#listen_for_static_cache_updates in pg_static_cache_updater extension (jeremyevans)
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            * Add Database#values on PostgreSQL to create a dataset that uses VALUES instead of SELECT (jeremyevans)
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            * Add Model#set_nested_attributes to nested_attributes, allowing setting nested attributes options per-call (jeremyevans)
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            * Use explicit columns when using automatically prepared SELECT statements in the prepared statement plugins (jeremyevans)
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            * Make Dataset#insert_select on PostgreSQL respect existing RETURNING clause (jeremyevans)
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            * Fix eager loading limited associations via a UNION when an association block is used (jeremyevans)
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            * Associate reciprocal object before saving associated object when creating new objects in nested_attributes (chanks, jeremyevans) (#831)
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            * Handle intervals containing more than 100 hours in the pg_interval extension's parser (will) (#827)
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            * Remove methods/class deprecated in 4.11.0 (jeremyevans)
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            * Allow Dataset#natural_join/cross_join and related methods to take a options hash passed to join_table (jeremyevans)
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
            * Add :reset_implicit_qualifier option to Dataset#join_table, to set false to not reset the implicit qualifier (jeremyevans)
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            * Support :notice_receiver Database option when postgres adapter is used with pg driver (jeltz, jeremyevans) (#825)
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
       1 
33 
     | 
    
         
             
            === 4.11.0 (2014-06-03)
         
     | 
| 
       2 
34 
     | 
    
         | 
| 
       3 
35 
     | 
    
         
             
            * Add :model_map option to class_table_inheritance plugin so class names don't need to be stored in the database (jeremyevans)
         
     | 
    
        data/Rakefile
    CHANGED
    
    | 
         @@ -33,10 +33,6 @@ RDOC_DEFAULT_OPTS = ["--line-numbers", "--inline-source", '--title', 'Sequel: Th 
     | 
|
| 
       33 
33 
     | 
    
         | 
| 
       34 
34 
     | 
    
         
             
            begin
         
     | 
| 
       35 
35 
     | 
    
         
             
              # Sequel uses hanna-nouveau for the website RDoc.
         
     | 
| 
       36 
     | 
    
         
            -
              # Due to bugs in older versions of RDoc, and the
         
     | 
| 
       37 
     | 
    
         
            -
              # fact that hanna-nouveau does not support RDoc 4,
         
     | 
| 
       38 
     | 
    
         
            -
              # a specific version of rdoc is required.
         
     | 
| 
       39 
     | 
    
         
            -
              gem 'rdoc', '= 3.12.2'
         
     | 
| 
       40 
36 
     | 
    
         
             
              gem 'hanna-nouveau'
         
     | 
| 
       41 
37 
     | 
    
         
             
              RDOC_DEFAULT_OPTS.concat(['-f', 'hanna'])
         
     | 
| 
       42 
38 
     | 
    
         
             
            rescue Gem::LoadError
         
     | 
| 
         @@ -68,7 +64,7 @@ if rdoc_task_class 
     | 
|
| 
       68 
64 
     | 
    
         
             
              rdoc_task_class.new(:website_rdoc_main) do |rdoc|
         
     | 
| 
       69 
65 
     | 
    
         
             
                rdoc.rdoc_dir = "www/public/rdoc"
         
     | 
| 
       70 
66 
     | 
    
         
             
                rdoc.options += RDOC_OPTS + %w'--no-ignore-invalid'
         
     | 
| 
       71 
     | 
    
         
            -
                rdoc.rdoc_files.add %w"README.rdoc CHANGELOG MIT-LICENSE lib/*.rb lib/sequel/*.rb lib/sequel/{connection_pool,dataset,database,model}/*.rb doc/*.rdoc doc/release_notes/*.txt lib/sequel/extensions/migration.rb 
     | 
| 
      
 67 
     | 
    
         
            +
                rdoc.rdoc_files.add %w"README.rdoc CHANGELOG MIT-LICENSE lib/*.rb lib/sequel/*.rb lib/sequel/{connection_pool,dataset,database,model}/*.rb doc/*.rdoc doc/release_notes/*.txt lib/sequel/extensions/migration.rb"
         
     | 
| 
       72 
68 
     | 
    
         
             
              end
         
     | 
| 
       73 
69 
     | 
    
         | 
| 
       74 
70 
     | 
    
         
             
              rdoc_task_class.new(:website_rdoc_adapters) do |rdoc|
         
     | 
    
        data/doc/opening_databases.rdoc
    CHANGED
    
    | 
         @@ -373,9 +373,12 @@ The following additional options are supported: 
     | 
|
| 
       373 
373 
     | 
    
         
             
                                            conversion is done, so an error is raised if you attempt to retrieve an infinite
         
     | 
| 
       374 
374 
     | 
    
         
             
                                            timestamp/date.  You can set this to :nil to convert to nil, :string to leave
         
     | 
| 
       375 
375 
     | 
    
         
             
                                            as a string, or :float to convert to an infinite float.
         
     | 
| 
       376 
     | 
    
         
            -
            :encoding :: Set the client_encoding to the given string
         
     | 
| 
       377 
376 
     | 
    
         
             
            :connect_timeout :: Set the number of seconds to wait for a connection (default 20, only respected
         
     | 
| 
       378 
377 
     | 
    
         
             
                                if using the pg library).
         
     | 
| 
      
 378 
     | 
    
         
            +
            :encoding :: Set the client_encoding to the given string
         
     | 
| 
      
 379 
     | 
    
         
            +
            :notice_receiver :: A proc that be called with the PGresult objects that have notice or warning messages.
         
     | 
| 
      
 380 
     | 
    
         
            +
                                The default notice receiver just prints the messages to stderr, but this can be used
         
     | 
| 
      
 381 
     | 
    
         
            +
                                to handle notice/warning messages differently.  Only respected if using the pg library).
         
     | 
| 
       379 
382 
     | 
    
         
             
            :sslmode :: Set to 'disable', 'allow', 'prefer', 'require' to choose how to treat SSL (only
         
     | 
| 
       380 
383 
     | 
    
         
             
                        respected if using the pg library)
         
     | 
| 
       381 
384 
     | 
    
         
             
            :use_iso_date_format :: This can be set to false to not force the ISO date format.  Sequel forces
         
     | 
| 
         @@ -417,6 +420,7 @@ Examples: 
     | 
|
| 
       417 
420 
     | 
    
         | 
| 
       418 
421 
     | 
    
         
             
            The following additional options are supported:
         
     | 
| 
       419 
422 
     | 
    
         | 
| 
      
 423 
     | 
    
         
            +
            :readonly :: open database in read-only mode
         
     | 
| 
       420 
424 
     | 
    
         
             
            :timeout :: the busy timeout to use in milliseconds (default: 5000).
         
     | 
| 
       421 
425 
     | 
    
         | 
| 
       422 
426 
     | 
    
         
             
            === swift
         
     | 
| 
         @@ -0,0 +1,105 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            = New Features
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            * Database#schema now includes :max_length entries for string
         
     | 
| 
      
 4 
     | 
    
         
            +
              columns, specifying the size of the string field.  The
         
     | 
| 
      
 5 
     | 
    
         
            +
              auto_validations plugin now uses this information to
         
     | 
| 
      
 6 
     | 
    
         
            +
              automatically set up max_length validations on those fields.
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            * The Dataset join methods now support a :reset_implicit_qualifier
         
     | 
| 
      
 9 
     | 
    
         
            +
              option.  If set to false, this makes the join not reset the
         
     | 
| 
      
 10 
     | 
    
         
            +
              implicit qualifier, so that the next join will not consider this
         
     | 
| 
      
 11 
     | 
    
         
            +
              table as the last table joined.  Example:
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                DB[:a].join(:b, :c=>:d).
         
     | 
| 
      
 14 
     | 
    
         
            +
                  join(:e, :f=>:g)
         
     | 
| 
      
 15 
     | 
    
         
            +
                # SELECT * FROM a
         
     | 
| 
      
 16 
     | 
    
         
            +
                # INNER JOIN b ON (b.c = a.d)
         
     | 
| 
      
 17 
     | 
    
         
            +
                # INNER JOIN e ON (e.f = b.g)
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                DB[:a].join(:b, {:c=>:d}, :reset_implicit_qualifier=>false).
         
     | 
| 
      
 20 
     | 
    
         
            +
                  join(:e, :f=>:g)
         
     | 
| 
      
 21 
     | 
    
         
            +
                # SELECT * FROM a
         
     | 
| 
      
 22 
     | 
    
         
            +
                # INNER JOIN b ON (b.c = a.d)
         
     | 
| 
      
 23 
     | 
    
         
            +
                # INNER JOIN e ON (e.f = a.g)
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            * The Dataset cross and natural join methods now accept an options
         
     | 
| 
      
 26 
     | 
    
         
            +
              hash. Example:
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                DB[:a].cross_join(:b, :table_alias=>:c)
         
     | 
| 
      
 29 
     | 
    
         
            +
                # SELECT * FROM a CROSS JOIN b AS c
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            * Model#set_nested_attributes has been added to the nested_attributes
         
     | 
| 
      
 32 
     | 
    
         
            +
              plugin, which allows you to to set the nested_attributes options to
         
     | 
| 
      
 33 
     | 
    
         
            +
              use per-call.  This is very helpful if you have multiple forms that
         
     | 
| 
      
 34 
     | 
    
         
            +
              handle associated objects, but with different input fields used
         
     | 
| 
      
 35 
     | 
    
         
            +
              for the associated objects depending on the form.  Example:
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                album.set_nested_attributes(:tracks,
         
     | 
| 
      
 38 
     | 
    
         
            +
                  params[:track_attributes],
         
     | 
| 
      
 39 
     | 
    
         
            +
                  :fields=>[:a, :b, :c])
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            * Database#values has been added on PostgreSQL, which creates a
         
     | 
| 
      
 42 
     | 
    
         
            +
              dataset that uses VALUES instead of SELECT.  Just as PostgreSQL
         
     | 
| 
      
 43 
     | 
    
         
            +
              allows, you can also use orders, limits, and offsets with this
         
     | 
| 
      
 44 
     | 
    
         
            +
              dataset.
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
            * A :notice_receiver option is now supported in the postgres adapter
         
     | 
| 
      
 47 
     | 
    
         
            +
              if the pg driver is used.  This should be a proc, which will be
         
     | 
| 
      
 48 
     | 
    
         
            +
              passed to the pg connection's set_notice_receiver method.
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
            * A Database :readonly option is now supported in the sqlite adapter,
         
     | 
| 
      
 51 
     | 
    
         
            +
              which opens the database in a read-only mode, causing an error
         
     | 
| 
      
 52 
     | 
    
         
            +
              if a query is issued that would modify the database.
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
            * A :before_thread_exit option has been added to
         
     | 
| 
      
 55 
     | 
    
         
            +
              Database#listen_for_static_cache_updates in the
         
     | 
| 
      
 56 
     | 
    
         
            +
              pg_static_cache_updater extension, allowing you to run code before
         
     | 
| 
      
 57 
     | 
    
         
            +
              the created thread exits.
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
            = Other Improvements
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
            * Eager loading limited associations using a UNION now works
         
     | 
| 
      
 62 
     | 
    
         
            +
              correctly when an association block is used.  This fixes a
         
     | 
| 
      
 63 
     | 
    
         
            +
              regression that first occurred in 4.10.0, when the union
         
     | 
| 
      
 64 
     | 
    
         
            +
              eager loader became the default eager loader.
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
            * When creating a new associated object in the nested_attributes
         
     | 
| 
      
 67 
     | 
    
         
            +
              plugin, where the reciprocal association is a many_to_one
         
     | 
| 
      
 68 
     | 
    
         
            +
              association, set the cached reciprocal object in the new
         
     | 
| 
      
 69 
     | 
    
         
            +
              associated object before saving it.
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
              This fixes issues when validations in the associated object
         
     | 
| 
      
 72 
     | 
    
         
            +
              require access to the current object, which may not yet be
         
     | 
| 
      
 73 
     | 
    
         
            +
              saved in the database.
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
            * The prepared_statements and prepared_statements_associations
         
     | 
| 
      
 76 
     | 
    
         
            +
              plugins now automatically use explicit column references when
         
     | 
| 
      
 77 
     | 
    
         
            +
              preparing statements.  This fixes issues on PostgreSQL when a
         
     | 
| 
      
 78 
     | 
    
         
            +
              column is added to a table while a prepared statement exists
         
     | 
| 
      
 79 
     | 
    
         
            +
              that selects * from the table.  Previously, all further attempts
         
     | 
| 
      
 80 
     | 
    
         
            +
              to use the prepared statement will fail.
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
              This allows you to run migrations that add columns to tables
         
     | 
| 
      
 83 
     | 
    
         
            +
              while concurrently running an application that uses the
         
     | 
| 
      
 84 
     | 
    
         
            +
              prepared statements plugins.  Note that many other schema
         
     | 
| 
      
 85 
     | 
    
         
            +
              modifications can cause issues when running migrations
         
     | 
| 
      
 86 
     | 
    
         
            +
              while concurrently running an application, but most of those
         
     | 
| 
      
 87 
     | 
    
         
            +
              are not specific to usage of prepared statements.
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
            * Dataset#insert_select on PostgreSQL now respects an existing
         
     | 
| 
      
 90 
     | 
    
         
            +
              RETURNING clause, and won't override it to use RETURNING *.
         
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
      
 92 
     | 
    
         
            +
              A similar fix was applied to the generalized prepared statements
         
     | 
| 
      
 93 
     | 
    
         
            +
              support as well.
         
     | 
| 
      
 94 
     | 
    
         
            +
             
     | 
| 
      
 95 
     | 
    
         
            +
            * The interval parser in the pg_interval extension now supports
         
     | 
| 
      
 96 
     | 
    
         
            +
              intervals with 2-10 digits for hours.  Previously, it only
         
     | 
| 
      
 97 
     | 
    
         
            +
              supported using 2 digits for hours.
         
     | 
| 
      
 98 
     | 
    
         
            +
             
     | 
| 
      
 99 
     | 
    
         
            +
            = Backwards Compatibility
         
     | 
| 
      
 100 
     | 
    
         
            +
             
     | 
| 
      
 101 
     | 
    
         
            +
            * The methods and classes deprecated in 4.11.0 have been removed.
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
            * The nested_attributes internal API has changed significantly. If
         
     | 
| 
      
 104 
     | 
    
         
            +
              you were calling any private nested_attributes methods, you'll
         
     | 
| 
      
 105 
     | 
    
         
            +
              probably need to update your code.
         
     | 
    
        data/lib/sequel/adapters/jdbc.rb
    CHANGED
    
    | 
         @@ -729,6 +729,7 @@ module Sequel 
     | 
|
| 
       729 
729 
     | 
    
         
             
                    metadata(:getColumns, nil, schema, table, nil) do |h|
         
     | 
| 
       730 
730 
     | 
    
         
             
                      next if schema_parse_table_skip?(h, schema)
         
     | 
| 
       731 
731 
     | 
    
         
             
                      s = {:type=>schema_column_type(h[:type_name]), :db_type=>h[:type_name], :default=>(h[:column_def] == '' ? nil : h[:column_def]), :allow_null=>(h[:nullable] != 0), :primary_key=>pks.include?(h[:column_name]), :column_size=>h[:column_size], :scale=>h[:decimal_digits]}
         
     | 
| 
      
 732 
     | 
    
         
            +
                      s[:max_length] = s[:column_size] if s[:type] == :string
         
     | 
| 
       732 
733 
     | 
    
         
             
                      if s[:db_type] =~ DECIMAL_TYPE_RE && s[:scale] == 0
         
     | 
| 
       733 
734 
     | 
    
         
             
                        s[:type] = :integer
         
     | 
| 
       734 
735 
     | 
    
         
             
                      end
         
     | 
| 
         @@ -198,12 +198,13 @@ module Sequel 
     | 
|
| 
       198 
198 
     | 
    
         
             
                  # Connects to the database.  In addition to the standard database
         
     | 
| 
       199 
199 
     | 
    
         
             
                  # options, using the :encoding or :charset option changes the
         
     | 
| 
       200 
200 
     | 
    
         
             
                  # client encoding for the connection, :connect_timeout is a
         
     | 
| 
       201 
     | 
    
         
            -
                  # connection timeout in seconds,  
     | 
| 
       202 
     | 
    
         
            -
                  # sslmode 
     | 
| 
       203 
     | 
    
         
            -
                  #  
     | 
| 
      
 201 
     | 
    
         
            +
                  # connection timeout in seconds, :sslmode sets whether postgres's
         
     | 
| 
      
 202 
     | 
    
         
            +
                  # sslmode, and :notice_receiver handles server notices in a proc.
         
     | 
| 
      
 203 
     | 
    
         
            +
                  # :connect_timeout, :ssl_mode, and :notice_receiver are only supported
         
     | 
| 
      
 204 
     | 
    
         
            +
                  # if the pg driver is used.
         
     | 
| 
       204 
205 
     | 
    
         
             
                  def connect(server)
         
     | 
| 
       205 
206 
     | 
    
         
             
                    opts = server_opts(server)
         
     | 
| 
       206 
     | 
    
         
            -
                     
     | 
| 
      
 207 
     | 
    
         
            +
                    if SEQUEL_POSTGRES_USES_PG
         
     | 
| 
       207 
208 
     | 
    
         
             
                      connection_params = {
         
     | 
| 
       208 
209 
     | 
    
         
             
                        :host => opts[:host],
         
     | 
| 
       209 
210 
     | 
    
         
             
                        :port => opts[:port] || 5432,
         
     | 
| 
         @@ -213,9 +214,15 @@ module Sequel 
     | 
|
| 
       213 
214 
     | 
    
         
             
                        :connect_timeout => opts[:connect_timeout] || 20,
         
     | 
| 
       214 
215 
     | 
    
         
             
                        :sslmode => opts[:sslmode]
         
     | 
| 
       215 
216 
     | 
    
         
             
                      }.delete_if { |key, value| blank_object?(value) }
         
     | 
| 
       216 
     | 
    
         
            -
                      Adapter.connect(connection_params)
         
     | 
| 
      
 217 
     | 
    
         
            +
                      conn = Adapter.connect(connection_params)
         
     | 
| 
      
 218 
     | 
    
         
            +
             
     | 
| 
      
 219 
     | 
    
         
            +
                      conn.instance_variable_set(:@prepared_statements, {})
         
     | 
| 
      
 220 
     | 
    
         
            +
             
     | 
| 
      
 221 
     | 
    
         
            +
                      if receiver = opts[:notice_receiver]
         
     | 
| 
      
 222 
     | 
    
         
            +
                        conn.set_notice_receiver(&receiver)
         
     | 
| 
      
 223 
     | 
    
         
            +
                      end
         
     | 
| 
       217 
224 
     | 
    
         
             
                    else
         
     | 
| 
       218 
     | 
    
         
            -
                      Adapter.connect(
         
     | 
| 
      
 225 
     | 
    
         
            +
                      conn = Adapter.connect(
         
     | 
| 
       219 
226 
     | 
    
         
             
                        (opts[:host] unless blank_object?(opts[:host])),
         
     | 
| 
       220 
227 
     | 
    
         
             
                        opts[:port] || 5432,
         
     | 
| 
       221 
228 
     | 
    
         
             
                        nil, '',
         
     | 
| 
         @@ -224,6 +231,9 @@ module Sequel 
     | 
|
| 
       224 
231 
     | 
    
         
             
                        opts[:password]
         
     | 
| 
       225 
232 
     | 
    
         
             
                      )
         
     | 
| 
       226 
233 
     | 
    
         
             
                    end
         
     | 
| 
      
 234 
     | 
    
         
            +
             
     | 
| 
      
 235 
     | 
    
         
            +
                    conn.instance_variable_set(:@db, self)
         
     | 
| 
      
 236 
     | 
    
         
            +
             
     | 
| 
       227 
237 
     | 
    
         
             
                    if encoding = opts[:encoding] || opts[:charset]
         
     | 
| 
       228 
238 
     | 
    
         
             
                      if conn.respond_to?(:set_client_encoding)
         
     | 
| 
       229 
239 
     | 
    
         
             
                        conn.set_client_encoding(encoding)
         
     | 
| 
         @@ -231,8 +241,7 @@ module Sequel 
     | 
|
| 
       231 
241 
     | 
    
         
             
                        conn.async_exec("set client_encoding to '#{encoding}'")
         
     | 
| 
       232 
242 
     | 
    
         
             
                      end
         
     | 
| 
       233 
243 
     | 
    
         
             
                    end
         
     | 
| 
       234 
     | 
    
         
            -
             
     | 
| 
       235 
     | 
    
         
            -
                    conn.instance_variable_set(:@prepared_statements, {}) if SEQUEL_POSTGRES_USES_PG
         
     | 
| 
      
 244 
     | 
    
         
            +
             
     | 
| 
       236 
245 
     | 
    
         
             
                    connection_configuration_sqls.each{|sql| conn.execute(sql)}
         
     | 
| 
       237 
246 
     | 
    
         
             
                    conn
         
     | 
| 
       238 
247 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -51,12 +51,13 @@ module Sequel 
     | 
|
| 
       51 
51 
     | 
    
         
             
                      from(:db_attribute).
         
     | 
| 
       52 
52 
     | 
    
         
             
                      where(:class_name=>m2.call(table_name)).
         
     | 
| 
       53 
53 
     | 
    
         
             
                      order(:def_order).
         
     | 
| 
       54 
     | 
    
         
            -
                      select(:attr_name, :data_type___db_type, :default_value___default, :is_nullable___allow_null).
         
     | 
| 
      
 54 
     | 
    
         
            +
                      select(:attr_name, :data_type___db_type, :default_value___default, :is_nullable___allow_null, :prec).
         
     | 
| 
       55 
55 
     | 
    
         
             
                      map do |row|
         
     | 
| 
       56 
56 
     | 
    
         
             
                        name = m.call(row.delete(:attr_name))
         
     | 
| 
       57 
57 
     | 
    
         
             
                        row[:allow_null] = row[:allow_null] == 'YES'
         
     | 
| 
       58 
58 
     | 
    
         
             
                        row[:primary_key] = pks.include?(name)
         
     | 
| 
       59 
59 
     | 
    
         
             
                        row[:type] = schema_column_type(row[:db_type])
         
     | 
| 
      
 60 
     | 
    
         
            +
                        row[:max_length] = row[:prec] if row[:type] == :string
         
     | 
| 
       60 
61 
     | 
    
         
             
                        [name, row]
         
     | 
| 
       61 
62 
     | 
    
         
             
                      end
         
     | 
| 
       62 
63 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -42,6 +42,7 @@ module Sequel 
     | 
|
| 
       42 
42 
     | 
    
         
             
                        column[:allow_null]  = column.delete(:nulls) == 'Y'
         
     | 
| 
       43 
43 
     | 
    
         
             
                        column[:primary_key] = column.delete(:identity) == 'Y' || !column[:keyseq].nil?
         
     | 
| 
       44 
44 
     | 
    
         
             
                        column[:type]        = schema_column_type(column[:db_type])
         
     | 
| 
      
 45 
     | 
    
         
            +
                        column[:max_length]  = column[:longlength] if column[:type] == :string
         
     | 
| 
       45 
46 
     | 
    
         
             
                        [ m.call(column.delete(:name)), column]
         
     | 
| 
       46 
47 
     | 
    
         
             
                      end
         
     | 
| 
       47 
48 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -524,6 +524,17 @@ module Sequel 
     | 
|
| 
       524 
524 
     | 
    
         
             
                    @supported_types.fetch(type){@supported_types[type] = (from(:pg_type).filter(:typtype=>'b', :typname=>type.to_s).count > 0)}
         
     | 
| 
       525 
525 
     | 
    
         
             
                  end
         
     | 
| 
       526 
526 
     | 
    
         | 
| 
      
 527 
     | 
    
         
            +
                  # Creates a dataset that uses the VALUES clause:
         
     | 
| 
      
 528 
     | 
    
         
            +
                  #
         
     | 
| 
      
 529 
     | 
    
         
            +
                  #   DB.values([[1, 2], [3, 4]])
         
     | 
| 
      
 530 
     | 
    
         
            +
                  #   VALUES ((1, 2), (3, 4))
         
     | 
| 
      
 531 
     | 
    
         
            +
                  #
         
     | 
| 
      
 532 
     | 
    
         
            +
                  #   DB.values([[1, 2], [3, 4]]).order(:column2).limit(1, 1)
         
     | 
| 
      
 533 
     | 
    
         
            +
                  #   VALUES ((1, 2), (3, 4)) ORDER BY column2 LIMIT 1 OFFSET 1
         
     | 
| 
      
 534 
     | 
    
         
            +
                  def values(v)
         
     | 
| 
      
 535 
     | 
    
         
            +
                    @default_dataset.clone(:values=>v)
         
     | 
| 
      
 536 
     | 
    
         
            +
                  end
         
     | 
| 
      
 537 
     | 
    
         
            +
             
     | 
| 
       527 
538 
     | 
    
         
             
                  # Array of symbols specifying view names in the current database.
         
     | 
| 
       528 
539 
     | 
    
         
             
                  #
         
     | 
| 
       529 
540 
     | 
    
         
             
                  # Options:
         
     | 
| 
         @@ -1147,12 +1158,13 @@ module Sequel 
     | 
|
| 
       1147 
1158 
     | 
    
         
             
                  CRLF = "\r\n".freeze
         
     | 
| 
       1148 
1159 
     | 
    
         
             
                  BLOB_RE = /[\000-\037\047\134\177-\377]/n.freeze
         
     | 
| 
       1149 
1160 
     | 
    
         
             
                  WINDOW = " WINDOW ".freeze
         
     | 
| 
      
 1161 
     | 
    
         
            +
                  SELECT_VALUES = "VALUES ".freeze
         
     | 
| 
       1150 
1162 
     | 
    
         
             
                  EMPTY_STRING = ''.freeze
         
     | 
| 
       1151 
1163 
     | 
    
         
             
                  LOCK_MODES = ['ACCESS SHARE', 'ROW SHARE', 'ROW EXCLUSIVE', 'SHARE UPDATE EXCLUSIVE', 'SHARE', 'SHARE ROW EXCLUSIVE', 'EXCLUSIVE', 'ACCESS EXCLUSIVE'].each{|s| s.freeze}
         
     | 
| 
       1152 
1164 
     | 
    
         | 
| 
       1153 
1165 
     | 
    
         
             
                  Dataset.def_sql_method(self, :delete, [['if server_version >= 90100', %w'with delete from using where returning'], ['else', %w'delete from using where returning']])
         
     | 
| 
       1154 
1166 
     | 
    
         
             
                  Dataset.def_sql_method(self, :insert, [['if server_version >= 90100', %w'with insert into columns values returning'], ['else', %w'insert into columns values returning']])
         
     | 
| 
       1155 
     | 
    
         
            -
                  Dataset.def_sql_method(self, :select, [['if server_version >= 80400', %w'with select distinct columns from join where group having window compounds order limit lock'], ['else', %w'select distinct columns from join where group having compounds order limit lock']])
         
     | 
| 
      
 1167 
     | 
    
         
            +
                  Dataset.def_sql_method(self, :select, [['if opts[:values]', %w'values order limit'], ['elsif server_version >= 80400', %w'with select distinct columns from join where group having window compounds order limit lock'], ['else', %w'select distinct columns from join where group having compounds order limit lock']])
         
     | 
| 
       1156 
1168 
     | 
    
         
             
                  Dataset.def_sql_method(self, :update, [['if server_version >= 90100', %w'with update table set from where returning'], ['else', %w'update table set from where returning']])
         
     | 
| 
       1157 
1169 
     | 
    
         | 
| 
       1158 
1170 
     | 
    
         
             
                  # Shared methods for prepared statements when used with PostgreSQL databases.
         
     | 
| 
         @@ -1285,7 +1297,10 @@ module Sequel 
     | 
|
| 
       1285 
1297 
     | 
    
         
             
                  # Insert a record returning the record inserted.  Always returns nil without
         
     | 
| 
       1286 
1298 
     | 
    
         
             
                  # inserting a query if disable_insert_returning is used.
         
     | 
| 
       1287 
1299 
     | 
    
         
             
                  def insert_select(*values)
         
     | 
| 
       1288 
     | 
    
         
            -
                     
     | 
| 
      
 1300 
     | 
    
         
            +
                    unless @opts[:disable_insert_returning]
         
     | 
| 
      
 1301 
     | 
    
         
            +
                      ds = opts[:returning] ? self : returning
         
     | 
| 
      
 1302 
     | 
    
         
            +
                      ds.insert(*values){|r| return r}
         
     | 
| 
      
 1303 
     | 
    
         
            +
                    end
         
     | 
| 
       1289 
1304 
     | 
    
         
             
                  end
         
     | 
| 
       1290 
1305 
     | 
    
         | 
| 
       1291 
1306 
     | 
    
         
             
                  # Locks all tables in the dataset's FROM clause (but not in JOINs) with
         
     | 
| 
         @@ -1510,6 +1525,12 @@ module Sequel 
     | 
|
| 
       1510 
1525 
     | 
    
         
             
                    @opts[:lock] == :share ? (sql << FOR_SHARE) : super
         
     | 
| 
       1511 
1526 
     | 
    
         
             
                  end
         
     | 
| 
       1512 
1527 
     | 
    
         | 
| 
      
 1528 
     | 
    
         
            +
                  # Support VALUES clause instead of the SELECT clause to return rows.
         
     | 
| 
      
 1529 
     | 
    
         
            +
                  def select_values_sql(sql)
         
     | 
| 
      
 1530 
     | 
    
         
            +
                    sql << SELECT_VALUES
         
     | 
| 
      
 1531 
     | 
    
         
            +
                    expression_list_append(sql, opts[:values])
         
     | 
| 
      
 1532 
     | 
    
         
            +
                  end
         
     | 
| 
      
 1533 
     | 
    
         
            +
             
     | 
| 
       1513 
1534 
     | 
    
         
             
                  # SQL fragment for named window specifications
         
     | 
| 
       1514 
1535 
     | 
    
         
             
                  def select_window_sql(sql)
         
     | 
| 
       1515 
1536 
     | 
    
         
             
                    if ws = @opts[:window]
         
     | 
| 
         @@ -91,14 +91,20 @@ module Sequel 
     | 
|
| 
       91 
91 
     | 
    
         
             
                  # The conversion procs to use for this database
         
     | 
| 
       92 
92 
     | 
    
         
             
                  attr_reader :conversion_procs
         
     | 
| 
       93 
93 
     | 
    
         | 
| 
       94 
     | 
    
         
            -
                  # Connect to the database. 
     | 
| 
       95 
     | 
    
         
            -
                  #  
     | 
| 
       96 
     | 
    
         
            -
                  # 
     | 
| 
       97 
     | 
    
         
            -
                  #  
     | 
| 
      
 94 
     | 
    
         
            +
                  # Connect to the database. Since SQLite is a file based database,
         
     | 
| 
      
 95 
     | 
    
         
            +
                  # available options are limited:
         
     | 
| 
      
 96 
     | 
    
         
            +
                  #
         
     | 
| 
      
 97 
     | 
    
         
            +
                  # :database :: database name (filename or ':memory:' or file: URI)
         
     | 
| 
      
 98 
     | 
    
         
            +
                  # :readonly :: open database in read-only mode; useful for reading
         
     | 
| 
      
 99 
     | 
    
         
            +
                  #              static data that you do not want to modify
         
     | 
| 
      
 100 
     | 
    
         
            +
                  # :timeout :: how long to wait for the database to be available if it
         
     | 
| 
      
 101 
     | 
    
         
            +
                  #             is locked, given in milliseconds (default is 5000)
         
     | 
| 
       98 
102 
     | 
    
         
             
                  def connect(server)
         
     | 
| 
       99 
103 
     | 
    
         
             
                    opts = server_opts(server)
         
     | 
| 
       100 
104 
     | 
    
         
             
                    opts[:database] = ':memory:' if blank_object?(opts[:database])
         
     | 
| 
       101 
     | 
    
         
            -
                     
     | 
| 
      
 105 
     | 
    
         
            +
                    sqlite3_opts = {}
         
     | 
| 
      
 106 
     | 
    
         
            +
                    sqlite3_opts[:readonly] = typecast_value_boolean(opts[:readonly]) if opts.has_key?(:readonly)
         
     | 
| 
      
 107 
     | 
    
         
            +
                    db = ::SQLite3::Database.new(opts[:database].to_s, sqlite3_opts)
         
     | 
| 
       102 
108 
     | 
    
         
             
                    db.busy_timeout(opts.fetch(:timeout, 5000))
         
     | 
| 
       103 
109 
     | 
    
         | 
| 
       104 
110 
     | 
    
         
             
                    connection_pragmas.each{|s| log_yield(s){db.execute_batch(s)}}
         
     | 
| 
         @@ -157,7 +157,12 @@ module Sequel 
     | 
|
| 
       157 
157 
     | 
    
         | 
| 
       158 
158 
     | 
    
         
             
                  cols = schema_parse_table(table_name, opts)
         
     | 
| 
       159 
159 
     | 
    
         
             
                  raise(Error, 'schema parsing returned no columns, table probably doesn\'t exist') if cols.nil? || cols.empty?
         
     | 
| 
       160 
     | 
    
         
            -
                  cols.each 
     | 
| 
      
 160 
     | 
    
         
            +
                  cols.each do |_,c|
         
     | 
| 
      
 161 
     | 
    
         
            +
                    c[:ruby_default] = column_schema_to_ruby_default(c[:default], c[:type])
         
     | 
| 
      
 162 
     | 
    
         
            +
                    if !c[:max_length] && c[:type] == :string && (max_length = column_schema_max_length(c[:db_type]))
         
     | 
| 
      
 163 
     | 
    
         
            +
                      c[:max_length] = max_length
         
     | 
| 
      
 164 
     | 
    
         
            +
                    end
         
     | 
| 
      
 165 
     | 
    
         
            +
                  end
         
     | 
| 
       161 
166 
     | 
    
         
             
                  Sequel.synchronize{@schemas[quoted_name] = cols} if cache_schema
         
     | 
| 
       162 
167 
     | 
    
         
             
                  cols
         
     | 
| 
       163 
168 
     | 
    
         
             
                end
         
     | 
| 
         @@ -251,6 +256,14 @@ module Sequel 
     | 
|
| 
       251 
256 
     | 
    
         
             
                  column_schema_default_to_ruby_value(default, type) rescue nil
         
     | 
| 
       252 
257 
     | 
    
         
             
                end
         
     | 
| 
       253 
258 
     | 
    
         | 
| 
      
 259 
     | 
    
         
            +
                # Look at the db_type and guess the maximum length of the column.
         
     | 
| 
      
 260 
     | 
    
         
            +
                # This assumes types such as varchar(255).
         
     | 
| 
      
 261 
     | 
    
         
            +
                def column_schema_max_length(db_type)
         
     | 
| 
      
 262 
     | 
    
         
            +
                  if db_type =~ /\((\d+)\)/
         
     | 
| 
      
 263 
     | 
    
         
            +
                    $1.to_i
         
     | 
| 
      
 264 
     | 
    
         
            +
                  end
         
     | 
| 
      
 265 
     | 
    
         
            +
                end
         
     | 
| 
      
 266 
     | 
    
         
            +
             
     | 
| 
       254 
267 
     | 
    
         
             
                # Return a Method object for the dataset's output_identifier_method.
         
     | 
| 
       255 
268 
     | 
    
         
             
                # Used in metadata parsing to make sure the returned information is in the
         
     | 
| 
       256 
269 
     | 
    
         
             
                # correct format.
         
     | 
| 
         @@ -86,7 +86,8 @@ module Sequel 
     | 
|
| 
       86 
86 
     | 
    
         
             
                    when :first
         
     | 
| 
       87 
87 
     | 
    
         
             
                      clone(:limit=>1).select_sql
         
     | 
| 
       88 
88 
     | 
    
         
             
                    when :insert_select
         
     | 
| 
       89 
     | 
    
         
            -
                      returning 
     | 
| 
      
 89 
     | 
    
         
            +
                      ds = opts[:returning] ? self : returning
         
     | 
| 
      
 90 
     | 
    
         
            +
                      ds.insert_sql(*@prepared_modify_values)
         
     | 
| 
       90 
91 
     | 
    
         
             
                    when :insert
         
     | 
| 
       91 
92 
     | 
    
         
             
                      insert_sql(*@prepared_modify_values)
         
     | 
| 
       92 
93 
     | 
    
         
             
                    when :update
         
     | 
    
        data/lib/sequel/dataset/query.rb
    CHANGED
    
    | 
         @@ -23,10 +23,9 @@ module Sequel 
     | 
|
| 
       23 
23 
     | 
    
         
             
                # block from the method call.
         
     | 
| 
       24 
24 
     | 
    
         
             
                CONDITIONED_JOIN_TYPES = [:inner, :full_outer, :right_outer, :left_outer, :full, :right, :left]
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
       26 
     | 
    
         
            -
                # These symbols have _join methods created (e.g. natural_join) 
     | 
| 
       27 
     | 
    
         
            -
                #  
     | 
| 
       28 
     | 
    
         
            -
                #  
     | 
| 
       29 
     | 
    
         
            -
                # if called with a block.
         
     | 
| 
      
 26 
     | 
    
         
            +
                # These symbols have _join methods created (e.g. natural_join).
         
     | 
| 
      
 27 
     | 
    
         
            +
                # They accept a table argument and options hash which is passed to join_table,
         
     | 
| 
      
 28 
     | 
    
         
            +
                # and they raise an error if called with a block.
         
     | 
| 
       30 
29 
     | 
    
         
             
                UNCONDITIONED_JOIN_TYPES = [:natural, :natural_left, :natural_right, :natural_full, :cross]
         
     | 
| 
       31 
30 
     | 
    
         | 
| 
       32 
31 
     | 
    
         
             
                # All methods that return modified datasets with a joined table added.
         
     | 
| 
         @@ -387,37 +386,42 @@ module Sequel 
     | 
|
| 
       387 
386 
     | 
    
         
             
                #
         
     | 
| 
       388 
387 
     | 
    
         
             
                # Takes the following arguments:
         
     | 
| 
       389 
388 
     | 
    
         
             
                #
         
     | 
| 
       390 
     | 
    
         
            -
                #  
     | 
| 
       391 
     | 
    
         
            -
                #  
     | 
| 
       392 
     | 
    
         
            -
                # 
     | 
| 
       393 
     | 
    
         
            -
                # 
     | 
| 
       394 
     | 
    
         
            -
                #  
     | 
| 
       395 
     | 
    
         
            -
                # 
     | 
| 
       396 
     | 
    
         
            -
                # 
     | 
| 
       397 
     | 
    
         
            -
                # 
     | 
| 
       398 
     | 
    
         
            -
                # 
     | 
| 
       399 
     | 
    
         
            -
                # 
     | 
| 
       400 
     | 
    
         
            -
                # 
     | 
| 
       401 
     | 
    
         
            -
                # 
     | 
| 
       402 
     | 
    
         
            -
                # 
     | 
| 
       403 
     | 
    
         
            -
                # 
     | 
| 
       404 
     | 
    
         
            -
                # 
     | 
| 
       405 
     | 
    
         
            -
                # 
     | 
| 
       406 
     | 
    
         
            -
                # 
     | 
| 
       407 
     | 
    
         
            -
                # 
     | 
| 
       408 
     | 
    
         
            -
                #  
     | 
| 
       409 
     | 
    
         
            -
                # 
     | 
| 
       410 
     | 
    
         
            -
                # 
     | 
| 
       411 
     | 
    
         
            -
                # 
     | 
| 
       412 
     | 
    
         
            -
                # 
     | 
| 
       413 
     | 
    
         
            -
                # 
     | 
| 
       414 
     | 
    
         
            -
                # 
     | 
| 
       415 
     | 
    
         
            -
                # 
     | 
| 
       416 
     | 
    
         
            -
                # 
     | 
| 
       417 
     | 
    
         
            -
                #  
     | 
| 
       418 
     | 
    
         
            -
                # 
     | 
| 
       419 
     | 
    
         
            -
                # 
     | 
| 
       420 
     | 
    
         
            -
                # 
     | 
| 
      
 389 
     | 
    
         
            +
                # type :: The type of join to do (e.g. :inner)
         
     | 
| 
      
 390 
     | 
    
         
            +
                # table :: table to join into the current dataset.  Generally one of the following types:
         
     | 
| 
      
 391 
     | 
    
         
            +
                #          String, Symbol :: identifier used as table or view name
         
     | 
| 
      
 392 
     | 
    
         
            +
                #          Dataset :: a subselect is performed with an alias of tN for some value of N
         
     | 
| 
      
 393 
     | 
    
         
            +
                #          SQL::Function :: set returning function
         
     | 
| 
      
 394 
     | 
    
         
            +
                #          SQL::AliasedExpression :: already aliased expression.  Uses given alias unless
         
     | 
| 
      
 395 
     | 
    
         
            +
                #                                    overridden by the :table_alias option.
         
     | 
| 
      
 396 
     | 
    
         
            +
                # expr :: conditions used when joining, depends on type:
         
     | 
| 
      
 397 
     | 
    
         
            +
                #         Hash, Array of pairs :: Assumes key (1st arg) is column of joined table (unless already
         
     | 
| 
      
 398 
     | 
    
         
            +
                #                                 qualified), and value (2nd arg) is column of the last joined or
         
     | 
| 
      
 399 
     | 
    
         
            +
                #                                 primary table (or the :implicit_qualifier option).
         
     | 
| 
      
 400 
     | 
    
         
            +
                #                                 To specify multiple conditions on a single joined table column,
         
     | 
| 
      
 401 
     | 
    
         
            +
                #                                 you must use an array.  Uses a JOIN with an ON clause.
         
     | 
| 
      
 402 
     | 
    
         
            +
                #         Array :: If all members of the array are symbols, considers them as columns and 
         
     | 
| 
      
 403 
     | 
    
         
            +
                #                  uses a JOIN with a USING clause.  Most databases will remove duplicate columns from
         
     | 
| 
      
 404 
     | 
    
         
            +
                #                  the result set if this is used.
         
     | 
| 
      
 405 
     | 
    
         
            +
                #         nil :: If a block is not given, doesn't use ON or USING, so the JOIN should be a NATURAL
         
     | 
| 
      
 406 
     | 
    
         
            +
                #                or CROSS join. If a block is given, uses an ON clause based on the block, see below.
         
     | 
| 
      
 407 
     | 
    
         
            +
                #         otherwise :: Treats the argument as a filter expression, so strings are considered literal, symbols
         
     | 
| 
      
 408 
     | 
    
         
            +
                #                      specify boolean columns, and Sequel expressions can be used. Uses a JOIN with an ON clause.
         
     | 
| 
      
 409 
     | 
    
         
            +
                # options :: a hash of options, with the following keys supported:
         
     | 
| 
      
 410 
     | 
    
         
            +
                #            :table_alias :: Override the table alias used when joining.  In general you shouldn't use this
         
     | 
| 
      
 411 
     | 
    
         
            +
                #                            option, you should provide the appropriate SQL::AliasedExpression as the table
         
     | 
| 
      
 412 
     | 
    
         
            +
                #                            argument.
         
     | 
| 
      
 413 
     | 
    
         
            +
                #            :implicit_qualifier :: The name to use for qualifying implicit conditions.  By default,
         
     | 
| 
      
 414 
     | 
    
         
            +
                #                                   the last joined or primary table is used.
         
     | 
| 
      
 415 
     | 
    
         
            +
                #            :reset_implicit_qualifier :: Can set to false to ignore this join when future joins determine qualifier
         
     | 
| 
      
 416 
     | 
    
         
            +
                #                                         for implicit conditions.
         
     | 
| 
      
 417 
     | 
    
         
            +
                #            :qualify :: Can be set to false to not do any implicit qualification.  Can be set
         
     | 
| 
      
 418 
     | 
    
         
            +
                #                        to :deep to use the Qualifier AST Transformer, which will attempt to qualify
         
     | 
| 
      
 419 
     | 
    
         
            +
                #                        subexpressions of the expression tree.  Can be set to :symbol to only qualify
         
     | 
| 
      
 420 
     | 
    
         
            +
                #                        symbols. Defaults to the value of default_join_table_qualification.
         
     | 
| 
      
 421 
     | 
    
         
            +
                # block :: The block argument should only be given if a JOIN with an ON clause is used,
         
     | 
| 
      
 422 
     | 
    
         
            +
                #          in which case it yields the table alias/name for the table currently being joined,
         
     | 
| 
      
 423 
     | 
    
         
            +
                #          the table alias/name for the last joined (or first table), and an array of previous
         
     | 
| 
      
 424 
     | 
    
         
            +
                #          SQL::JoinClause. Unlike +where+, this block is not treated as a virtual row block.
         
     | 
| 
       421 
425 
     | 
    
         
             
                #
         
     | 
| 
       422 
426 
     | 
    
         
             
                # Examples:
         
     | 
| 
       423 
427 
     | 
    
         
             
                #
         
     | 
| 
         @@ -505,7 +509,8 @@ module Sequel 
     | 
|
| 
       505 
509 
     | 
    
         
             
                    SQL::JoinOnClause.new(expr, type, table_expr)
         
     | 
| 
       506 
510 
     | 
    
         
             
                  end
         
     | 
| 
       507 
511 
     | 
    
         | 
| 
       508 
     | 
    
         
            -
                  opts = {:join => (@opts[:join] || []) + [join] 
     | 
| 
      
 512 
     | 
    
         
            +
                  opts = {:join => (@opts[:join] || []) + [join]}
         
     | 
| 
      
 513 
     | 
    
         
            +
                  opts[:last_joined_table] = table_name unless options[:reset_implicit_qualifier] == false
         
     | 
| 
       509 
514 
     | 
    
         
             
                  opts[:num_dataset_sources] = table_alias_num if table_alias_num
         
     | 
| 
       510 
515 
     | 
    
         
             
                  clone(opts)
         
     | 
| 
       511 
516 
     | 
    
         
             
                end
         
     | 
| 
         @@ -514,7 +519,13 @@ module Sequel 
     | 
|
| 
       514 
519 
     | 
    
         
             
                  class_eval("def #{jtype}_join(*args, &block); join_table(:#{jtype}, *args, &block) end", __FILE__, __LINE__)
         
     | 
| 
       515 
520 
     | 
    
         
             
                end
         
     | 
| 
       516 
521 
     | 
    
         
             
                UNCONDITIONED_JOIN_TYPES.each do |jtype|
         
     | 
| 
       517 
     | 
    
         
            -
                  class_eval( 
     | 
| 
      
 522 
     | 
    
         
            +
                  class_eval(<<-END, __FILE__, __LINE__+1)
         
     | 
| 
      
 523 
     | 
    
         
            +
                    def #{jtype}_join(table, opts=Sequel::OPTS)
         
     | 
| 
      
 524 
     | 
    
         
            +
                      raise(Sequel::Error, '#{jtype}_join does not accept join table blocks') if block_given?
         
     | 
| 
      
 525 
     | 
    
         
            +
                      raise(Sequel::Error, '#{jtype}_join 2nd argument should be an options hash, not conditions') unless opts.is_a?(Hash)
         
     | 
| 
      
 526 
     | 
    
         
            +
                      join_table(:#{jtype}, table, nil, opts)
         
     | 
| 
      
 527 
     | 
    
         
            +
                    end
         
     | 
| 
      
 528 
     | 
    
         
            +
                  END
         
     | 
| 
       518 
529 
     | 
    
         
             
                end
         
     | 
| 
       519 
530 
     | 
    
         | 
| 
       520 
531 
     | 
    
         
             
                # Marks this dataset as a lateral dataset.  If used in another dataset's FROM
         
     |