serrano-vk 0.1.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 +7 -0
- data/EXAMPLES.md +271 -0
- data/README.md +170 -0
- data/bin/serrano +6 -0
- data/examples/demo_crud/Gemfile +9 -0
- data/examples/demo_crud/Gemfile.lock +31 -0
- data/examples/demo_crud/app/controllers/articles_controller.rb +92 -0
- data/examples/demo_crud/app/controllers/categories_controller.rb +92 -0
- data/examples/demo_crud/app/entities/article.rb +17 -0
- data/examples/demo_crud/app/entities/category.rb +17 -0
- data/examples/demo_crud/app/entities/concerns/validatable.rb +136 -0
- data/examples/demo_crud/app/repositories/article_repository.rb +42 -0
- data/examples/demo_crud/app/repositories/category_repository.rb +42 -0
- data/examples/demo_crud/app/services/articles/create.rb +29 -0
- data/examples/demo_crud/app/services/articles/destroy.rb +20 -0
- data/examples/demo_crud/app/services/articles/index.rb +17 -0
- data/examples/demo_crud/app/services/articles/show.rb +20 -0
- data/examples/demo_crud/app/services/articles/update.rb +26 -0
- data/examples/demo_crud/app/services/categories/create.rb +27 -0
- data/examples/demo_crud/app/services/categories/destroy.rb +20 -0
- data/examples/demo_crud/app/services/categories/index.rb +17 -0
- data/examples/demo_crud/app/services/categories/show.rb +20 -0
- data/examples/demo_crud/app/services/categories/update.rb +26 -0
- data/examples/demo_crud/config/db.rb +3 -0
- data/examples/demo_crud/config.ru +19 -0
- data/examples/demo_crud/db/development.sqlite3 +0 -0
- data/examples/demo_crud/db/migrations/20260307212844_create_articles.rb +14 -0
- data/examples/demo_crud/db/migrations/20260307212845_create_categories.rb +12 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/bin/rackup +29 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/bin/rackup.bat +2 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/bin/sequel +29 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/bin/sequel.bat +2 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/bin/serrano +29 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/bin/serrano.bat +2 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/cache/bigdecimal-4.0.1.gem +0 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/cache/rack-3.2.5.gem +0 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/cache/rackup-2.3.1.gem +0 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/cache/sequel-5.102.0.gem +0 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/cache/sqlite3-2.9.1-x64-mingw-ucrt.gem +0 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/cache/webrick-1.9.2.gem +0 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/extensions/x64-mingw-ucrt/3.4.0/bigdecimal-4.0.1/bigdecimal.so +0 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/extensions/x64-mingw-ucrt/3.4.0/bigdecimal-4.0.1/gem.build_complete +0 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/extensions/x64-mingw-ucrt/3.4.0/bigdecimal-4.0.1/gem_make.out +43 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/extensions/x64-mingw-ucrt/3.4.0/bigdecimal-4.0.1/mkmf.log +669 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/LICENSE +56 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/bigdecimal.gemspec +57 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/ext/bigdecimal/Makefile +278 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/ext/bigdecimal/bigdecimal.c +6206 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/ext/bigdecimal/bigdecimal.h +292 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/ext/bigdecimal/bits.h +144 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/ext/bigdecimal/extconf.rb +60 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/ext/bigdecimal/feature.h +68 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/ext/bigdecimal/missing/dtoa.c +3462 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/ext/bigdecimal/missing.c +28 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/ext/bigdecimal/missing.h +104 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/ext/bigdecimal/static_assert.h +54 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/lib/bigdecimal/jacobian.rb +92 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/lib/bigdecimal/ludcmp.rb +91 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/lib/bigdecimal/math.rb +948 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/lib/bigdecimal/newton.rb +82 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/lib/bigdecimal/util.rb +186 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/lib/bigdecimal.rb +360 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/lib/bigdecimal.so +0 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/sample/linear.rb +74 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/sample/nlsolve.rb +40 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/sample/pi.rb +21 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/CHANGELOG.md +1314 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/CONTRIBUTING.md +144 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/MIT-LICENSE +20 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/README.md +384 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/SPEC.rdoc +258 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/auth/abstract/handler.rb +41 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/auth/abstract/request.rb +51 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/auth/basic.rb +58 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/bad_request.rb +8 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/body_proxy.rb +63 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/builder.rb +296 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/cascade.rb +67 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/common_logger.rb +89 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/conditional_get.rb +87 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/config.rb +22 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/constants.rb +68 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/content_length.rb +34 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/content_type.rb +33 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/deflater.rb +158 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/directory.rb +208 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/etag.rb +71 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/events.rb +172 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/files.rb +216 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/head.rb +25 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/headers.rb +238 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/lint.rb +964 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/lock.rb +29 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/media_type.rb +52 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/method_override.rb +56 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/mime.rb +694 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/mock.rb +3 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/mock_request.rb +161 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/mock_response.rb +156 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/multipart/generator.rb +99 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/multipart/parser.rb +580 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/multipart/uploaded_file.rb +82 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/multipart.rb +77 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/null_logger.rb +48 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/query_parser.rb +261 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/recursive.rb +66 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/reloader.rb +112 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/request.rb +790 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/response.rb +403 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/rewindable_input.rb +116 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/runtime.rb +35 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/sendfile.rb +197 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/show_exceptions.rb +409 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/show_status.rb +121 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/static.rb +188 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/tempfile_reaper.rb +33 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/urlmap.rb +99 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/utils.rb +622 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/version.rb +17 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack.rb +64 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/bin/rackup +5 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/handler/cgi.rb +61 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/handler/webrick.rb +196 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/handler.rb +113 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/lobster.rb +81 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/server.rb +462 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/stream.rb +199 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/version.rb +8 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup.rb +21 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/license.md +80 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/readme.md +82 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/releases.md +28 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/security.md +3 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/MIT-LICENSE +19 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/bin/sequel +280 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/ado/access.rb +335 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/ado/mssql.rb +62 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/ado.rb +283 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/amalgalite.rb +184 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/ibmdb.rb +423 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/db2.rb +83 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/derby.rb +318 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/h2.rb +290 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/hsqldb.rb +228 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/jtds.rb +39 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/mssql.rb +30 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/mysql.rb +89 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/oracle.rb +146 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/postgresql.rb +239 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/sqlanywhere.rb +87 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/sqlite.rb +133 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/sqlserver.rb +92 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/transactions.rb +95 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc.rb +850 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/mock.rb +381 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/mysql.rb +380 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/mysql2.rb +307 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/odbc/db2.rb +11 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/odbc/mssql.rb +57 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/odbc/oracle.rb +11 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/odbc.rb +150 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/oracle.rb +427 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/postgres.rb +863 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/postgresql.rb +3 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/shared/access.rb +301 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/shared/db2.rb +509 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/shared/mssql.rb +1238 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/shared/mysql.rb +1175 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/shared/oracle.rb +732 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/shared/postgres.rb +3022 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/shared/sqlanywhere.rb +470 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/shared/sqlite.rb +1073 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/sqlanywhere.rb +192 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/sqlite.rb +475 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/tinytds.rb +259 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/trilogy.rb +116 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/utils/columns_limit_1.rb +22 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +74 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +93 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/utils/replace.rb +35 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/utils/split_alter_table.rb +46 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/utils/stored_procedures.rb +61 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/ast_transformer.rb +132 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/connection_pool/sharded_single.rb +113 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/connection_pool/sharded_threaded.rb +392 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/connection_pool/sharded_timed_queue.rb +399 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/connection_pool/single.rb +57 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/connection_pool/threaded.rb +307 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/connection_pool/timed_queue.rb +288 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/connection_pool.rb +175 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/core.rb +476 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/database/connecting.rb +349 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/database/dataset.rb +89 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/database/dataset_defaults.rb +93 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/database/features.rb +150 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/database/logging.rb +91 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/database/misc.rb +663 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/database/query.rb +436 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/database/schema_generator.rb +720 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/database/schema_methods.rb +1157 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/database/transactions.rb +552 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/database.rb +37 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/dataset/actions.rb +1412 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/dataset/dataset_module.rb +46 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/dataset/deprecated_singleton_class_methods.rb +42 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/dataset/features.rb +284 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/dataset/graph.rb +297 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/dataset/misc.rb +381 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/dataset/placeholder_literalizer.rb +230 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/dataset/prepared_statements.rb +474 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/dataset/query.rb +1571 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/dataset/sql.rb +1863 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/dataset.rb +60 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/deprecated.rb +70 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/exceptions.rb +130 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/_model_pg_row.rb +31 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/_pretty_table.rb +85 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/arbitrary_servers.rb +114 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/async_thread_pool.rb +446 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/auto_cast_date_and_time.rb +94 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/auto_literal_strings.rb +74 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/blank.rb +57 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/caller_logging.rb +80 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/columns_introspection.rb +88 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/connection_checkout_event_callback.rb +151 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/connection_expiration.rb +105 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/connection_validator.rb +133 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/constraint_validations.rb +510 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/core_extensions.rb +222 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/core_refinements.rb +244 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/current_datetime_timestamp.rb +59 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/dataset_run.rb +41 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/dataset_source_alias.rb +95 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/date_arithmetic.rb +254 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/date_parse_input_handler.rb +67 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/datetime_parse_to_time.rb +41 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/duplicate_columns_handler.rb +95 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/empty_array_consider_nulls.rb +46 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/error_sql.rb +76 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/escaped_like.rb +100 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/eval_inspect.rb +185 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/freeze_datasets.rb +3 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/from_block.rb +3 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/graph_each.rb +88 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/identifier_mangling.rb +180 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/implicit_subquery.rb +48 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/index_caching.rb +113 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/inflector.rb +258 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/integer64.rb +32 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/is_distinct_from.rb +141 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/looser_typecasting.rb +50 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/migration.rb +867 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +84 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/named_timezones.rb +184 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/no_auto_literal_strings.rb +4 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/null_dataset.rb +109 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pagination.rb +140 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_array.rb +556 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_array_ops.rb +377 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_auto_parameterize.rb +516 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_auto_parameterize_duplicate_query_detection.rb +191 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_auto_parameterize_in_array.rb +194 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_enum.rb +199 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_extended_date_support.rb +261 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_extended_integer_support.rb +116 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_hstore.rb +353 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_hstore_ops.rb +418 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_inet.rb +136 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_inet_ops.rb +204 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_interval.rb +224 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_json.rb +644 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_json_ops.rb +1460 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_loose_count.rb +39 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_multirange.rb +367 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_range.rb +572 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_range_ops.rb +195 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_row.rb +585 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_row_ops.rb +217 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_schema_caching.rb +90 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_static_cache_updater.rb +144 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_timestamptz.rb +52 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pretty_table.rb +40 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/provenance.rb +108 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/query.rb +85 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/query_blocker.rb +172 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/round_timestamps.rb +49 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/s.rb +60 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/schema_caching.rb +103 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/schema_dumper.rb +550 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/select_remove.rb +52 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/server_block.rb +179 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/server_logging.rb +61 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/set_literalizer.rb +39 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/split_array_nil.rb +80 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/sql_comments.rb +203 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/sql_expr.rb +23 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/sql_log_normalizer.rb +108 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/sqlite_json_ops.rb +313 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/stdio_logger.rb +48 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/string_agg.rb +194 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/string_date_time.rb +48 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/symbol_aref.rb +55 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/symbol_as.rb +23 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/temporarily_release_connection.rb +178 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/thread_local_timezones.rb +59 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/to_dot.rb +169 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/transaction_connection_validator.rb +78 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/virtual_row_method_block.rb +45 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/model/associations.rb +4066 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/model/base.rb +2360 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/model/dataset_module.rb +36 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/model/default_inflections.rb +47 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/model/errors.rb +67 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/model/exceptions.rb +67 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/model/inflections.rb +151 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/model/plugins.rb +165 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/model.rb +85 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/accessed_columns.rb +63 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/active_model.rb +124 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/after_initialize.rb +39 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/association_dependencies.rb +106 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/association_pks.rb +316 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/association_proxies.rb +131 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/async_thread_pool.rb +39 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/auto_restrict_eager_graph.rb +62 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/auto_validations.rb +302 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/before_after_save.rb +8 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/blacklist_security.rb +104 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/boolean_readers.rb +59 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/boolean_subsets.rb +64 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/caching.rb +164 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/class_table_inheritance.rb +439 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/class_table_inheritance_constraint_validations.rb +82 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/column_conflicts.rb +108 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/column_encryption.rb +749 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/column_select.rb +61 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/columns_updated.rb +42 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/composition.rb +205 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/constraint_validations.rb +259 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/csv_serializer.rb +196 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/dataset_associations.rb +152 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/def_dataset_method.rb +90 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/defaults_setter.rb +158 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/delay_add_association.rb +53 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/deprecated_associations.rb +151 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/detect_unnecessary_association_options.rb +164 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/dirty.rb +276 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/eager_each.rb +88 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/enum.rb +124 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/error_splitter.rb +61 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/finder.rb +248 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/forbid_lazy_load.rb +229 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/force_encoding.rb +78 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/hook_class_methods.rb +110 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/input_transformer.rb +89 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/insert_conflict.rb +76 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/insert_returning_select.rb +81 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/inspect_pk.rb +44 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/instance_filters.rb +138 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/instance_hooks.rb +115 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/inverted_subsets.rb +60 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/json_serializer.rb +445 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/lazy_attributes.rb +126 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/list.rb +208 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/many_through_many.rb +437 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/modification_detection.rb +102 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/mssql_optimistic_locking.rb +65 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/nested_attributes.rb +340 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/optimistic_locking.rb +54 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/optimistic_locking_base.rb +55 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/paged_operations.rb +184 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/pg_array_associations.rb +580 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/pg_auto_constraint_validations.rb +361 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/pg_auto_validate_enums.rb +88 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/pg_eager_any_typed_array.rb +95 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/pg_row.rb +79 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/pg_xmin_optimistic_locking.rb +109 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/prepared_statements.rb +196 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/primary_key_lookup_check_values.rb +154 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/rcte_tree.rb +343 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/require_valid_schema.rb +67 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/serialization.rb +242 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/serialization_modification_detection.rb +87 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/sharding.rb +126 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/single_statement_dataset_destroy.rb +49 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/single_table_inheritance.rb +271 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/singular_table_names.rb +33 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/skip_create_refresh.rb +37 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/split_values.rb +81 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/sql_comments.rb +194 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/static_cache.rb +315 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/static_cache_cache.rb +94 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/string_stripper.rb +59 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/subclasses.rb +96 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/subset_conditions.rb +128 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/subset_static_cache.rb +278 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/table_select.rb +50 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/tactical_eager_loading.rb +216 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/throw_failures.rb +110 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/timestamps.rb +109 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/touch.rb +153 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/tree.rb +188 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/typecast_on_load.rb +90 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/unlimited_update.rb +27 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/unused_associations.rb +529 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/update_or_create.rb +64 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/update_primary_key.rb +72 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/update_refresh.rb +88 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/uuid.rb +70 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/validate_associated.rb +85 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/validation_class_methods.rb +460 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/validation_contexts.rb +49 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/validation_helpers.rb +351 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/validation_helpers_generic_type_messages.rb +73 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/whitelist_security.rb +122 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/xml_serializer.rb +411 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/sql.rb +2061 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/timezones.rb +254 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/version.rb +25 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel.rb +3 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/CHANGELOG.md +1014 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/CONTRIBUTING.md +60 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/FAQ.md +399 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/INSTALLATION.md +267 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/LICENSE +23 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/README.md +198 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/dependencies.yml +13 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/aggregator.c +270 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/aggregator.h +10 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/backup.c +190 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/backup.h +15 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/database.c +1006 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/database.h +28 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/exception.c +122 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/exception.h +12 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/extconf.rb +297 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/sqlite3.c +225 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/sqlite3_ruby.h +48 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/statement.c +739 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/statement.h +17 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/timespec.h +20 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/3.2/sqlite3_native.so +0 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/3.3/sqlite3_native.so +0 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/3.4/sqlite3_native.so +0 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/4.0/sqlite3_native.so +0 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/constants.rb +198 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/database.rb +798 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/errors.rb +88 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/fork_safety.rb +66 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/pragmas.rb +648 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/resultset.rb +96 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/statement.rb +190 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/value.rb +54 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/version.rb +4 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/version_info.rb +17 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3.rb +19 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/Gemfile +10 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/LICENSE.txt +22 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/README.md +63 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/Rakefile +10 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/accesslog.rb +157 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/cgi.rb +313 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/compat.rb +36 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/config.rb +158 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/cookie.rb +172 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/htmlutils.rb +30 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpauth/authenticator.rb +117 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpauth/basicauth.rb +116 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpauth/digestauth.rb +395 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpauth/htdigest.rb +132 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpauth/htgroup.rb +97 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpauth/htpasswd.rb +158 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpauth/userdb.rb +53 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpauth.rb +96 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpproxy.rb +354 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httprequest.rb +668 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpresponse.rb +588 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/https.rb +152 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpserver.rb +294 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpservlet/abstract.rb +152 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpservlet/cgi_runner.rb +47 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpservlet/cgihandler.rb +126 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpservlet/erbhandler.rb +88 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpservlet/filehandler.rb +552 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpservlet/prochandler.rb +48 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpservlet.rb +23 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpstatus.rb +194 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httputils.rb +543 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpversion.rb +76 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/log.rb +156 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/server.rb +380 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/ssl.rb +219 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/utils.rb +265 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/version.rb +18 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick.rb +232 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/accesslog.rbs +24 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/cgi.rbs +92 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/compat.rbs +18 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/config.rbs +17 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/cookie.rbs +37 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/htmlutils.rbs +5 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpauth/authenticator.rbs +55 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpauth/basicauth.rbs +29 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpauth/digestauth.rbs +85 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpauth/htdigest.rbs +31 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpauth/htgroup.rbs +21 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpauth/htpasswd.rbs +31 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpauth/userdb.rbs +13 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpauth.rbs +13 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpproxy.rbs +61 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httprequest.rbs +167 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpresponse.rbs +117 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/https.rbs +49 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpserver.rbs +71 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpservlet/abstract.rbs +36 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpservlet/cgi_runner.rbs +3 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpservlet/cgihandler.rbs +23 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpservlet/erbhandler.rbs +17 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpservlet/filehandler.rbs +76 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpservlet/prochandler.rbs +21 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpservlet.rbs +4 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpstatus.rbs +255 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httputils.rbs +116 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpversion.rbs +17 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/log.rbs +93 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/manifest.yaml +8 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/server.rbs +57 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/ssl.rbs +19 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/utils.rbs +122 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/version.rbs +3 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/webrick.gemspec +105 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/specifications/bigdecimal-4.0.1.gemspec +25 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/specifications/rack-3.2.5.gemspec +31 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/specifications/rackup-2.3.1.gemspec +26 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/specifications/sequel-5.102.0.gemspec +36 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/specifications/sqlite3-2.9.1-x64-mingw-ucrt.gemspec +25 -0
- data/examples/demo_crud/vendor/bundle/ruby/3.4.0/specifications/webrick-1.9.2.gemspec +22 -0
- data/lib/serrano/application.rb +36 -0
- data/lib/serrano/cli/base.rb +92 -0
- data/lib/serrano/cli/generate.rb +285 -0
- data/lib/serrano/cli/templates/controller.rb.tt +92 -0
- data/lib/serrano/cli/templates/entity.rb.tt +43 -0
- data/lib/serrano/cli/templates/entity_validatable.rb.tt +136 -0
- data/lib/serrano/cli/templates/migration.rb.tt +19 -0
- data/lib/serrano/cli/templates/new_default_config.ru.tt +6 -0
- data/lib/serrano/cli/templates/new_default_db.rb.tt +3 -0
- data/lib/serrano/cli/templates/new_default_gemfile.tt +6 -0
- data/lib/serrano/cli/templates/new_minimal_config.ru.tt +5 -0
- data/lib/serrano/cli/templates/new_minimal_gemfile.tt +4 -0
- data/lib/serrano/cli/templates/new_project_config.ru.tt +8 -0
- data/lib/serrano/cli/templates/new_project_db.rb.tt +3 -0
- data/lib/serrano/cli/templates/new_project_gemfile.tt +8 -0
- data/lib/serrano/cli/templates/repository.rb.tt +42 -0
- data/lib/serrano/cli/templates/service_create.rb.tt +40 -0
- data/lib/serrano/cli/templates/service_destroy.rb.tt +20 -0
- data/lib/serrano/cli/templates/service_generic.rb.tt +15 -0
- data/lib/serrano/cli/templates/service_index.rb.tt +17 -0
- data/lib/serrano/cli/templates/service_show.rb.tt +20 -0
- data/lib/serrano/cli/templates/service_update.rb.tt +41 -0
- data/lib/serrano/dispatcher.rb +53 -0
- data/lib/serrano/request.rb +78 -0
- data/lib/serrano/response.rb +33 -0
- data/lib/serrano/router.rb +80 -0
- data/lib/serrano/version.rb +5 -0
- data/lib/serrano.rb +11 -0
- metadata +768 -0
data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/dataset/sql.rb
ADDED
|
@@ -0,0 +1,1863 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
3
|
+
module Sequel
|
|
4
|
+
class Dataset
|
|
5
|
+
# ---------------------
|
|
6
|
+
# :section: 3 - User Methods relating to SQL Creation
|
|
7
|
+
# These are methods you can call to see what SQL will be generated by the dataset.
|
|
8
|
+
# ---------------------
|
|
9
|
+
|
|
10
|
+
# Returns an EXISTS clause for the dataset as an SQL::PlaceholderLiteralString.
|
|
11
|
+
#
|
|
12
|
+
# DB.select(1).where(DB[:items].exists)
|
|
13
|
+
# # SELECT 1 WHERE (EXISTS (SELECT * FROM items))
|
|
14
|
+
def exists
|
|
15
|
+
SQL::PlaceholderLiteralString.new(EXISTS, [self], true)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Returns an INSERT SQL query string. See +insert+.
|
|
19
|
+
#
|
|
20
|
+
# DB[:items].insert_sql(a: 1)
|
|
21
|
+
# # => "INSERT INTO items (a) VALUES (1)"
|
|
22
|
+
def insert_sql(*values)
|
|
23
|
+
return static_sql(@opts[:sql]) if @opts[:sql]
|
|
24
|
+
|
|
25
|
+
check_insert_allowed!
|
|
26
|
+
|
|
27
|
+
columns, values = _parse_insert_sql_args(values)
|
|
28
|
+
if values.is_a?(Array) && values.empty? && !insert_supports_empty_values?
|
|
29
|
+
columns, values = insert_empty_columns_values
|
|
30
|
+
elsif values.is_a?(Dataset) && hoist_cte?(values) && supports_cte?(:insert)
|
|
31
|
+
ds, values = hoist_cte(values)
|
|
32
|
+
return ds.clone(:columns=>columns, :values=>values).send(:_insert_sql)
|
|
33
|
+
end
|
|
34
|
+
clone(:columns=>columns, :values=>values).send(:_insert_sql)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Append a literal representation of a value to the given SQL string.
|
|
38
|
+
#
|
|
39
|
+
# If an unsupported object is given, an +Error+ is raised.
|
|
40
|
+
def literal_append(sql, v)
|
|
41
|
+
case v
|
|
42
|
+
when Symbol
|
|
43
|
+
if skip_symbol_cache?
|
|
44
|
+
literal_symbol_append(sql, v)
|
|
45
|
+
else
|
|
46
|
+
unless l = db.literal_symbol(v)
|
|
47
|
+
l = String.new
|
|
48
|
+
literal_symbol_append(l, v)
|
|
49
|
+
db.literal_symbol_set(v, l)
|
|
50
|
+
end
|
|
51
|
+
sql << l
|
|
52
|
+
end
|
|
53
|
+
when String
|
|
54
|
+
case v
|
|
55
|
+
when LiteralString
|
|
56
|
+
sql << v
|
|
57
|
+
when SQL::Blob
|
|
58
|
+
literal_blob_append(sql, v)
|
|
59
|
+
else
|
|
60
|
+
literal_string_append(sql, v)
|
|
61
|
+
end
|
|
62
|
+
when Integer
|
|
63
|
+
sql << literal_integer(v)
|
|
64
|
+
when Hash
|
|
65
|
+
literal_hash_append(sql, v)
|
|
66
|
+
when SQL::Expression
|
|
67
|
+
literal_expression_append(sql, v)
|
|
68
|
+
when Float
|
|
69
|
+
sql << literal_float(v)
|
|
70
|
+
when BigDecimal
|
|
71
|
+
sql << literal_big_decimal(v)
|
|
72
|
+
when NilClass
|
|
73
|
+
sql << literal_nil
|
|
74
|
+
when TrueClass
|
|
75
|
+
sql << literal_true
|
|
76
|
+
when FalseClass
|
|
77
|
+
sql << literal_false
|
|
78
|
+
when Array
|
|
79
|
+
literal_array_append(sql, v)
|
|
80
|
+
when Time
|
|
81
|
+
v.is_a?(SQLTime) ? literal_sqltime_append(sql, v) : literal_time_append(sql, v)
|
|
82
|
+
when DateTime
|
|
83
|
+
literal_datetime_append(sql, v)
|
|
84
|
+
when Date
|
|
85
|
+
literal_date_append(sql, v)
|
|
86
|
+
when Dataset
|
|
87
|
+
literal_dataset_append(sql, v)
|
|
88
|
+
when Set
|
|
89
|
+
literal_set_append(sql, v)
|
|
90
|
+
else
|
|
91
|
+
literal_other_append(sql, v)
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# The SQL to use for the MERGE statement.
|
|
96
|
+
def merge_sql
|
|
97
|
+
raise Error, "This database doesn't support MERGE" unless supports_merge?
|
|
98
|
+
if sql = opts[:sql]
|
|
99
|
+
return static_sql(sql)
|
|
100
|
+
end
|
|
101
|
+
if sql = cache_get(:_merge_sql)
|
|
102
|
+
return sql
|
|
103
|
+
end
|
|
104
|
+
source, join_condition = @opts[:merge_using]
|
|
105
|
+
raise Error, "No USING clause for MERGE" unless source
|
|
106
|
+
sql = @opts[:append_sql] || sql_string_origin
|
|
107
|
+
|
|
108
|
+
select_with_sql(sql)
|
|
109
|
+
sql << "MERGE INTO "
|
|
110
|
+
source_list_append(sql, @opts[:from])
|
|
111
|
+
sql << " USING "
|
|
112
|
+
identifier_append(sql, source)
|
|
113
|
+
sql << " ON "
|
|
114
|
+
literal_append(sql, join_condition)
|
|
115
|
+
_merge_when_sql(sql)
|
|
116
|
+
cache_set(:_merge_sql, sql) if cache_sql?
|
|
117
|
+
sql
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Literalize a date or time value, as a SQL string value with no
|
|
121
|
+
# typecasting. If +raw+ is true, remove the surrounding single
|
|
122
|
+
# quotes. This is designed for usage by bound argument code that
|
|
123
|
+
# can work even if the auto_cast_date_and_time extension is
|
|
124
|
+
# used (either manually or implicitly in the related adapter).
|
|
125
|
+
def literal_date_or_time(dt, raw=false)
|
|
126
|
+
value = case dt
|
|
127
|
+
when SQLTime
|
|
128
|
+
literal_sqltime(dt)
|
|
129
|
+
when Time
|
|
130
|
+
literal_time(dt)
|
|
131
|
+
when DateTime
|
|
132
|
+
literal_datetime(dt)
|
|
133
|
+
when Date
|
|
134
|
+
literal_date(dt)
|
|
135
|
+
else
|
|
136
|
+
raise TypeError, "unsupported type: #{dt.inspect}"
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
if raw
|
|
140
|
+
value.sub!(/\A'/, '')
|
|
141
|
+
value.sub!(/'\z/, '')
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
value
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Returns an array of insert statements for inserting multiple records.
|
|
148
|
+
# This method is used by +multi_insert+ to format insert statements and
|
|
149
|
+
# expects a keys array and and an array of value arrays.
|
|
150
|
+
def multi_insert_sql(columns, values)
|
|
151
|
+
case multi_insert_sql_strategy
|
|
152
|
+
when :values
|
|
153
|
+
sql = LiteralString.new('VALUES ')
|
|
154
|
+
expression_list_append(sql, values.map{|r| Array(r)})
|
|
155
|
+
[insert_sql(columns, sql)]
|
|
156
|
+
when :union
|
|
157
|
+
c = false
|
|
158
|
+
sql = LiteralString.new
|
|
159
|
+
u = ' UNION ALL SELECT '
|
|
160
|
+
f = empty_from_sql
|
|
161
|
+
values.each do |v|
|
|
162
|
+
if c
|
|
163
|
+
sql << u
|
|
164
|
+
else
|
|
165
|
+
sql << 'SELECT '
|
|
166
|
+
c = true
|
|
167
|
+
end
|
|
168
|
+
expression_list_append(sql, v)
|
|
169
|
+
sql << f if f
|
|
170
|
+
end
|
|
171
|
+
[insert_sql(columns, sql)]
|
|
172
|
+
else
|
|
173
|
+
values.map{|r| insert_sql(columns, r)}
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# Same as +select_sql+, not aliased directly to make subclassing simpler.
|
|
178
|
+
def sql
|
|
179
|
+
select_sql
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
# Returns a TRUNCATE SQL query string. See +truncate+
|
|
183
|
+
#
|
|
184
|
+
# DB[:items].truncate_sql # => 'TRUNCATE items'
|
|
185
|
+
def truncate_sql
|
|
186
|
+
if opts[:sql]
|
|
187
|
+
static_sql(opts[:sql])
|
|
188
|
+
else
|
|
189
|
+
check_truncation_allowed!
|
|
190
|
+
check_not_limited!(:truncate)
|
|
191
|
+
raise(InvalidOperation, "Can't truncate filtered datasets") if opts[:where] || opts[:having]
|
|
192
|
+
t = String.new
|
|
193
|
+
source_list_append(t, opts[:from])
|
|
194
|
+
_truncate_sql(t)
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
# Formats an UPDATE statement using the given values. See +update+.
|
|
199
|
+
#
|
|
200
|
+
# DB[:items].update_sql(price: 100, category: 'software')
|
|
201
|
+
# # => "UPDATE items SET price = 100, category = 'software'
|
|
202
|
+
#
|
|
203
|
+
# Raises an +Error+ if the dataset is grouped or includes more
|
|
204
|
+
# than one table.
|
|
205
|
+
def update_sql(values = OPTS)
|
|
206
|
+
return static_sql(opts[:sql]) if opts[:sql]
|
|
207
|
+
check_update_allowed!
|
|
208
|
+
check_not_limited!(:update)
|
|
209
|
+
|
|
210
|
+
case values
|
|
211
|
+
when LiteralString
|
|
212
|
+
# nothing
|
|
213
|
+
when String
|
|
214
|
+
raise Error, "plain string passed to Dataset#update is not supported, use Sequel.lit to use a literal string"
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
clone(:values=>values).send(:_update_sql)
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
# ---------------------
|
|
221
|
+
# :section: 9 - Internal Methods relating to SQL Creation
|
|
222
|
+
# These methods, while public, are not designed to be used directly by the end user.
|
|
223
|
+
# ---------------------
|
|
224
|
+
|
|
225
|
+
# Given a type (e.g. select) and an array of clauses,
|
|
226
|
+
# return an array of methods to call to build the SQL string.
|
|
227
|
+
def self.clause_methods(type, clauses)
|
|
228
|
+
clauses.map{|clause| :"#{type}_#{clause}_sql"}.freeze
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
# Define a dataset literalization method for the given type in the given module,
|
|
232
|
+
# using the given clauses.
|
|
233
|
+
#
|
|
234
|
+
# Arguments:
|
|
235
|
+
# mod :: Module in which to define method
|
|
236
|
+
# type :: Type of SQL literalization method to create, either :select, :insert, :update, or :delete
|
|
237
|
+
# clauses :: array of clauses that make up the SQL query for the type. This can either be a single
|
|
238
|
+
# array of symbols/strings, or it can be an array of pairs, with the first element in
|
|
239
|
+
# each pair being an if/elsif/else code fragment, and the second element in each pair
|
|
240
|
+
# being an array of symbol/strings for the appropriate branch.
|
|
241
|
+
def self.def_sql_method(mod, type, clauses)
|
|
242
|
+
priv = type == :update || type == :insert
|
|
243
|
+
cacheable = type == :select || type == :delete
|
|
244
|
+
|
|
245
|
+
lines = []
|
|
246
|
+
lines << 'private' if priv
|
|
247
|
+
lines << "def #{'_' if priv}#{type}_sql"
|
|
248
|
+
lines << 'if sql = opts[:sql]; return static_sql(sql) end' unless priv
|
|
249
|
+
lines << "if sql = cache_get(:_#{type}_sql); return sql end" if cacheable
|
|
250
|
+
lines << 'check_delete_allowed!' << 'check_not_limited!(:delete)' if type == :delete
|
|
251
|
+
lines << 'sql = @opts[:append_sql] || sql_string_origin'
|
|
252
|
+
|
|
253
|
+
if clauses.all?{|c| c.is_a?(Array)}
|
|
254
|
+
clauses.each do |i, cs|
|
|
255
|
+
lines << i
|
|
256
|
+
lines.concat(clause_methods(type, cs).map{|x| "#{x}(sql)"})
|
|
257
|
+
end
|
|
258
|
+
lines << 'end'
|
|
259
|
+
else
|
|
260
|
+
lines.concat(clause_methods(type, clauses).map{|x| "#{x}(sql)"})
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
lines << "cache_set(:_#{type}_sql, sql) if cache_sql?" if cacheable
|
|
264
|
+
lines << 'sql'
|
|
265
|
+
lines << 'end'
|
|
266
|
+
|
|
267
|
+
mod.class_eval lines.join("\n"), __FILE__, __LINE__
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
def_sql_method(self, :delete, %w'delete from where')
|
|
271
|
+
def_sql_method(self, :insert, %w'insert into columns values')
|
|
272
|
+
def_sql_method(self, :select, %w'with select distinct columns from join where group having compounds order limit lock')
|
|
273
|
+
def_sql_method(self, :update, %w'update table set where')
|
|
274
|
+
|
|
275
|
+
WILDCARD = LiteralString.new('*').freeze
|
|
276
|
+
COUNT_OF_ALL_AS_COUNT = SQL::Function.new(:count, WILDCARD).as(:count)
|
|
277
|
+
DEFAULT = LiteralString.new('DEFAULT').freeze
|
|
278
|
+
|
|
279
|
+
EXISTS = ['EXISTS '.freeze].freeze
|
|
280
|
+
BITWISE_METHOD_MAP = {:& =>:BITAND, :| => :BITOR, :^ => :BITXOR}.freeze
|
|
281
|
+
COUNT_FROM_SELF_OPTS = [:distinct, :group, :sql, :limit, :offset, :compounds].freeze
|
|
282
|
+
IS_LITERALS = {nil=>'NULL'.freeze, true=>'TRUE'.freeze, false=>'FALSE'.freeze}.freeze
|
|
283
|
+
QUALIFY_KEYS = [:select, :where, :having, :order, :group].freeze
|
|
284
|
+
|
|
285
|
+
IS_OPERATORS = ::Sequel::SQL::ComplexExpression::IS_OPERATORS
|
|
286
|
+
LIKE_OPERATORS = ::Sequel::SQL::ComplexExpression::LIKE_OPERATORS
|
|
287
|
+
N_ARITY_OPERATORS = ::Sequel::SQL::ComplexExpression::N_ARITY_OPERATORS
|
|
288
|
+
TWO_ARITY_OPERATORS = ::Sequel::SQL::ComplexExpression::TWO_ARITY_OPERATORS
|
|
289
|
+
REGEXP_OPERATORS = ::Sequel::SQL::ComplexExpression::REGEXP_OPERATORS
|
|
290
|
+
|
|
291
|
+
[:literal, :quote_identifier, :quote_schema_table].each do |meth|
|
|
292
|
+
class_eval(<<-END, __FILE__, __LINE__ + 1)
|
|
293
|
+
def #{meth}(*args, &block)
|
|
294
|
+
s = ''.dup
|
|
295
|
+
#{meth}_append(s, *args, &block)
|
|
296
|
+
s
|
|
297
|
+
end
|
|
298
|
+
END
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
# Append literalization of aliased expression to SQL string.
|
|
302
|
+
def aliased_expression_sql_append(sql, ae)
|
|
303
|
+
literal_append(sql, ae.expression)
|
|
304
|
+
as_sql_append(sql, ae.alias, ae.columns)
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
# Append literalization of array to SQL string.
|
|
308
|
+
def array_sql_append(sql, a)
|
|
309
|
+
if a.empty?
|
|
310
|
+
sql << '(NULL)'
|
|
311
|
+
else
|
|
312
|
+
sql << '('
|
|
313
|
+
expression_list_append(sql, a)
|
|
314
|
+
sql << ')'
|
|
315
|
+
end
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
# Append literalization of boolean constant to SQL string.
|
|
319
|
+
def boolean_constant_sql_append(sql, constant)
|
|
320
|
+
if (constant == true || constant == false) && !supports_where_true?
|
|
321
|
+
sql << (constant == true ? '(1 = 1)' : '(1 = 0)')
|
|
322
|
+
else
|
|
323
|
+
literal_append(sql, constant)
|
|
324
|
+
end
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
# Append literalization of case expression to SQL string.
|
|
328
|
+
def case_expression_sql_append(sql, ce)
|
|
329
|
+
sql << '(CASE'
|
|
330
|
+
if ce.expression?
|
|
331
|
+
sql << ' '
|
|
332
|
+
literal_append(sql, ce.expression)
|
|
333
|
+
end
|
|
334
|
+
w = " WHEN "
|
|
335
|
+
t = " THEN "
|
|
336
|
+
ce.conditions.each do |c,r|
|
|
337
|
+
sql << w
|
|
338
|
+
literal_append(sql, c)
|
|
339
|
+
sql << t
|
|
340
|
+
literal_append(sql, r)
|
|
341
|
+
end
|
|
342
|
+
sql << " ELSE "
|
|
343
|
+
literal_append(sql, ce.default)
|
|
344
|
+
sql << " END)"
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
# Append literalization of cast expression to SQL string.
|
|
348
|
+
def cast_sql_append(sql, expr, type)
|
|
349
|
+
sql << 'CAST('
|
|
350
|
+
literal_append(sql, expr)
|
|
351
|
+
sql << ' AS ' << db.cast_type_literal(type).to_s
|
|
352
|
+
sql << ')'
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
# Append literalization of column all selection to SQL string.
|
|
356
|
+
def column_all_sql_append(sql, ca)
|
|
357
|
+
qualified_identifier_sql_append(sql, ca.table, WILDCARD)
|
|
358
|
+
end
|
|
359
|
+
|
|
360
|
+
# Append literalization of complex expression to SQL string.
|
|
361
|
+
def complex_expression_sql_append(sql, op, args)
|
|
362
|
+
case op
|
|
363
|
+
when *IS_OPERATORS
|
|
364
|
+
r = args[1]
|
|
365
|
+
if r.nil? || supports_is_true?
|
|
366
|
+
raise(InvalidOperation, 'Invalid argument used for IS operator') unless val = IS_LITERALS[r]
|
|
367
|
+
sql << '('
|
|
368
|
+
literal_append(sql, args[0])
|
|
369
|
+
sql << ' ' << op.to_s << ' '
|
|
370
|
+
sql << val << ')'
|
|
371
|
+
elsif op == :IS
|
|
372
|
+
complex_expression_sql_append(sql, :"=", args)
|
|
373
|
+
else
|
|
374
|
+
complex_expression_sql_append(sql, :OR, [SQL::BooleanExpression.new(:"!=", *args), SQL::BooleanExpression.new(:IS, args[0], nil)])
|
|
375
|
+
end
|
|
376
|
+
when :IN, :"NOT IN"
|
|
377
|
+
cols = args[0]
|
|
378
|
+
vals = args[1]
|
|
379
|
+
col_array = true if cols.is_a?(Array)
|
|
380
|
+
if vals.is_a?(Array) || vals.is_a?(Set)
|
|
381
|
+
val_array = true
|
|
382
|
+
empty_val_array = vals.empty?
|
|
383
|
+
end
|
|
384
|
+
if empty_val_array
|
|
385
|
+
literal_append(sql, empty_array_value(op, cols))
|
|
386
|
+
elsif col_array
|
|
387
|
+
if !supports_multiple_column_in?
|
|
388
|
+
if val_array
|
|
389
|
+
expr = SQL::BooleanExpression.new(:OR, *vals.to_a.map{|vs| SQL::BooleanExpression.from_value_pairs(cols.to_a.zip(vs).map{|c, v| [c, v]})})
|
|
390
|
+
literal_append(sql, op == :IN ? expr : ~expr)
|
|
391
|
+
else
|
|
392
|
+
old_vals = vals
|
|
393
|
+
vals = vals.naked if vals.is_a?(Sequel::Dataset)
|
|
394
|
+
vals = vals.to_a
|
|
395
|
+
val_cols = old_vals.columns
|
|
396
|
+
complex_expression_sql_append(sql, op, [cols, vals.map!{|x| x.values_at(*val_cols)}])
|
|
397
|
+
end
|
|
398
|
+
else
|
|
399
|
+
# If the columns and values are both arrays, use array_sql instead of
|
|
400
|
+
# literal so that if values is an array of two element arrays, it
|
|
401
|
+
# will be treated as a value list instead of a condition specifier.
|
|
402
|
+
sql << '('
|
|
403
|
+
literal_append(sql, cols)
|
|
404
|
+
sql << ' ' << op.to_s << ' '
|
|
405
|
+
if val_array
|
|
406
|
+
array_sql_append(sql, vals)
|
|
407
|
+
else
|
|
408
|
+
literal_append(sql, vals)
|
|
409
|
+
end
|
|
410
|
+
sql << ')'
|
|
411
|
+
end
|
|
412
|
+
else
|
|
413
|
+
sql << '('
|
|
414
|
+
literal_append(sql, cols)
|
|
415
|
+
sql << ' ' << op.to_s << ' '
|
|
416
|
+
literal_append(sql, vals)
|
|
417
|
+
sql << ')'
|
|
418
|
+
end
|
|
419
|
+
when :LIKE, :'NOT LIKE'
|
|
420
|
+
sql << '('
|
|
421
|
+
literal_append(sql, args[0])
|
|
422
|
+
sql << ' ' << op.to_s << ' '
|
|
423
|
+
literal_append(sql, args[1])
|
|
424
|
+
if requires_like_escape?
|
|
425
|
+
sql << " ESCAPE "
|
|
426
|
+
literal_append(sql, "\\")
|
|
427
|
+
end
|
|
428
|
+
sql << ')'
|
|
429
|
+
when :ILIKE, :'NOT ILIKE'
|
|
430
|
+
complex_expression_sql_append(sql, (op == :ILIKE ? :LIKE : :"NOT LIKE"), args.map{|v| Sequel.function(:UPPER, v)})
|
|
431
|
+
when :**
|
|
432
|
+
function_sql_append(sql, Sequel.function(:power, *args))
|
|
433
|
+
when *TWO_ARITY_OPERATORS
|
|
434
|
+
if REGEXP_OPERATORS.include?(op) && !supports_regexp?
|
|
435
|
+
raise InvalidOperation, "Pattern matching via regular expressions is not supported on #{db.database_type}"
|
|
436
|
+
end
|
|
437
|
+
sql << '('
|
|
438
|
+
literal_append(sql, args[0])
|
|
439
|
+
sql << ' ' << op.to_s << ' '
|
|
440
|
+
literal_append(sql, args[1])
|
|
441
|
+
sql << ')'
|
|
442
|
+
when *N_ARITY_OPERATORS
|
|
443
|
+
sql << '('
|
|
444
|
+
c = false
|
|
445
|
+
op_str = " #{op} "
|
|
446
|
+
args.each do |a|
|
|
447
|
+
sql << op_str if c
|
|
448
|
+
literal_append(sql, a)
|
|
449
|
+
c ||= true
|
|
450
|
+
end
|
|
451
|
+
sql << ')'
|
|
452
|
+
when :NOT
|
|
453
|
+
sql << 'NOT '
|
|
454
|
+
literal_append(sql, args[0])
|
|
455
|
+
when :NOOP
|
|
456
|
+
literal_append(sql, args[0])
|
|
457
|
+
when :'B~'
|
|
458
|
+
sql << '~'
|
|
459
|
+
literal_append(sql, args[0])
|
|
460
|
+
when :extract
|
|
461
|
+
sql << 'extract(' << args[0].to_s << ' FROM '
|
|
462
|
+
literal_append(sql, args[1])
|
|
463
|
+
sql << ')'
|
|
464
|
+
else
|
|
465
|
+
raise(InvalidOperation, "invalid operator #{op}")
|
|
466
|
+
end
|
|
467
|
+
end
|
|
468
|
+
|
|
469
|
+
# Append literalization of constant to SQL string.
|
|
470
|
+
def constant_sql_append(sql, constant)
|
|
471
|
+
sql << constant.to_s
|
|
472
|
+
end
|
|
473
|
+
|
|
474
|
+
# Append literalization of delayed evaluation to SQL string,
|
|
475
|
+
# causing the delayed evaluation proc to be evaluated.
|
|
476
|
+
def delayed_evaluation_sql_append(sql, delay)
|
|
477
|
+
# Delayed evaluations are used specifically so the SQL
|
|
478
|
+
# can differ in subsequent calls, so we definitely don't
|
|
479
|
+
# want to cache the sql in this case.
|
|
480
|
+
disable_sql_caching!
|
|
481
|
+
|
|
482
|
+
if recorder = @opts[:placeholder_literalizer]
|
|
483
|
+
recorder.use(sql, lambda{delay.call(self)}, nil)
|
|
484
|
+
else
|
|
485
|
+
literal_append(sql, delay.call(self))
|
|
486
|
+
end
|
|
487
|
+
end
|
|
488
|
+
|
|
489
|
+
# Append literalization of function call to SQL string.
|
|
490
|
+
def function_sql_append(sql, f)
|
|
491
|
+
name = f.name
|
|
492
|
+
opts = f.opts
|
|
493
|
+
|
|
494
|
+
if opts[:emulate]
|
|
495
|
+
if emulate_function?(name)
|
|
496
|
+
emulate_function_sql_append(sql, f)
|
|
497
|
+
return
|
|
498
|
+
end
|
|
499
|
+
|
|
500
|
+
name = native_function_name(name)
|
|
501
|
+
end
|
|
502
|
+
|
|
503
|
+
sql << 'LATERAL ' if opts[:lateral]
|
|
504
|
+
|
|
505
|
+
case name
|
|
506
|
+
when SQL::Identifier
|
|
507
|
+
if supports_quoted_function_names? && opts[:quoted]
|
|
508
|
+
literal_append(sql, name)
|
|
509
|
+
else
|
|
510
|
+
sql << name.value.to_s
|
|
511
|
+
end
|
|
512
|
+
when SQL::QualifiedIdentifier
|
|
513
|
+
if supports_quoted_function_names? && opts[:quoted] != false
|
|
514
|
+
literal_append(sql, name)
|
|
515
|
+
else
|
|
516
|
+
sql << split_qualifiers(name).join('.')
|
|
517
|
+
end
|
|
518
|
+
else
|
|
519
|
+
if supports_quoted_function_names? && opts[:quoted]
|
|
520
|
+
quote_identifier_append(sql, name)
|
|
521
|
+
else
|
|
522
|
+
sql << name.to_s
|
|
523
|
+
end
|
|
524
|
+
end
|
|
525
|
+
|
|
526
|
+
sql << '('
|
|
527
|
+
if filter = opts[:filter]
|
|
528
|
+
filter = filter_expr(filter, &opts[:filter_block])
|
|
529
|
+
end
|
|
530
|
+
if opts[:*]
|
|
531
|
+
if filter && !supports_filtered_aggregates?
|
|
532
|
+
literal_append(sql, Sequel.case({filter=>1}, nil))
|
|
533
|
+
filter = nil
|
|
534
|
+
else
|
|
535
|
+
sql << '*'
|
|
536
|
+
end
|
|
537
|
+
else
|
|
538
|
+
sql << "DISTINCT " if opts[:distinct]
|
|
539
|
+
if filter && !supports_filtered_aggregates?
|
|
540
|
+
expression_list_append(sql, f.args.map{|arg| Sequel.case({filter=>arg}, nil)})
|
|
541
|
+
filter = nil
|
|
542
|
+
else
|
|
543
|
+
expression_list_append(sql, f.args)
|
|
544
|
+
end
|
|
545
|
+
if order = opts[:order]
|
|
546
|
+
sql << " ORDER BY "
|
|
547
|
+
expression_list_append(sql, order)
|
|
548
|
+
end
|
|
549
|
+
end
|
|
550
|
+
sql << ')'
|
|
551
|
+
|
|
552
|
+
if group = opts[:within_group]
|
|
553
|
+
sql << " WITHIN GROUP (ORDER BY "
|
|
554
|
+
expression_list_append(sql, group)
|
|
555
|
+
sql << ')'
|
|
556
|
+
end
|
|
557
|
+
|
|
558
|
+
if filter
|
|
559
|
+
sql << " FILTER (WHERE "
|
|
560
|
+
literal_append(sql, filter)
|
|
561
|
+
sql << ')'
|
|
562
|
+
end
|
|
563
|
+
|
|
564
|
+
if window = opts[:over]
|
|
565
|
+
sql << ' OVER '
|
|
566
|
+
window_sql_append(sql, window.opts)
|
|
567
|
+
end
|
|
568
|
+
|
|
569
|
+
if opts[:with_ordinality]
|
|
570
|
+
sql << " WITH ORDINALITY"
|
|
571
|
+
end
|
|
572
|
+
end
|
|
573
|
+
|
|
574
|
+
# Append literalization of JOIN clause without ON or USING to SQL string.
|
|
575
|
+
def join_clause_sql_append(sql, jc)
|
|
576
|
+
table = jc.table
|
|
577
|
+
table_alias = jc.table_alias
|
|
578
|
+
table_alias = nil if table == table_alias && !jc.column_aliases
|
|
579
|
+
sql << ' ' << join_type_sql(jc.join_type) << ' '
|
|
580
|
+
identifier_append(sql, table)
|
|
581
|
+
as_sql_append(sql, table_alias, jc.column_aliases) if table_alias
|
|
582
|
+
end
|
|
583
|
+
|
|
584
|
+
# Append literalization of JOIN ON clause to SQL string.
|
|
585
|
+
def join_on_clause_sql_append(sql, jc)
|
|
586
|
+
join_clause_sql_append(sql, jc)
|
|
587
|
+
sql << ' ON '
|
|
588
|
+
literal_append(sql, filter_expr(jc.on))
|
|
589
|
+
end
|
|
590
|
+
|
|
591
|
+
# Append literalization of JOIN USING clause to SQL string.
|
|
592
|
+
def join_using_clause_sql_append(sql, jc)
|
|
593
|
+
join_clause_sql_append(sql, jc)
|
|
594
|
+
join_using_clause_using_sql_append(sql, jc.using)
|
|
595
|
+
end
|
|
596
|
+
|
|
597
|
+
# Append literalization of negative boolean constant to SQL string.
|
|
598
|
+
def negative_boolean_constant_sql_append(sql, constant)
|
|
599
|
+
sql << 'NOT '
|
|
600
|
+
boolean_constant_sql_append(sql, constant)
|
|
601
|
+
end
|
|
602
|
+
|
|
603
|
+
# Append literalization of ordered expression to SQL string.
|
|
604
|
+
def ordered_expression_sql_append(sql, oe)
|
|
605
|
+
if emulate = requires_emulating_nulls_first?
|
|
606
|
+
case oe.nulls
|
|
607
|
+
when :first
|
|
608
|
+
null_order = 0
|
|
609
|
+
when :last
|
|
610
|
+
null_order = 2
|
|
611
|
+
end
|
|
612
|
+
|
|
613
|
+
if null_order
|
|
614
|
+
literal_append(sql, Sequel.case({{oe.expression=>nil}=>null_order}, 1))
|
|
615
|
+
sql << ", "
|
|
616
|
+
end
|
|
617
|
+
end
|
|
618
|
+
|
|
619
|
+
literal_append(sql, oe.expression)
|
|
620
|
+
sql << (oe.descending ? ' DESC' : ' ASC')
|
|
621
|
+
|
|
622
|
+
unless emulate
|
|
623
|
+
case oe.nulls
|
|
624
|
+
when :first
|
|
625
|
+
sql << " NULLS FIRST"
|
|
626
|
+
when :last
|
|
627
|
+
sql << " NULLS LAST"
|
|
628
|
+
end
|
|
629
|
+
end
|
|
630
|
+
end
|
|
631
|
+
|
|
632
|
+
# Append literalization of placeholder literal string to SQL string.
|
|
633
|
+
def placeholder_literal_string_sql_append(sql, pls)
|
|
634
|
+
args = pls.args
|
|
635
|
+
str = pls.str
|
|
636
|
+
sql << '(' if pls.parens
|
|
637
|
+
if args.is_a?(Hash)
|
|
638
|
+
if args.empty?
|
|
639
|
+
sql << str
|
|
640
|
+
else
|
|
641
|
+
re = /:(#{Regexp.union(args.keys.map(&:to_s))})\b/
|
|
642
|
+
until str.empty?
|
|
643
|
+
previous, q, str = str.partition(re)
|
|
644
|
+
sql << previous
|
|
645
|
+
literal_append(sql, args[$1.to_sym]) unless q.empty?
|
|
646
|
+
end
|
|
647
|
+
end
|
|
648
|
+
elsif str.is_a?(Array)
|
|
649
|
+
len = args.length
|
|
650
|
+
str.each_with_index do |s, i|
|
|
651
|
+
sql << s
|
|
652
|
+
literal_append(sql, args[i]) unless i == len
|
|
653
|
+
end
|
|
654
|
+
unless str.length == args.length || str.length == args.length + 1
|
|
655
|
+
raise Error, "Mismatched number of placeholders (#{str.length}) and placeholder arguments (#{args.length}) when using placeholder array"
|
|
656
|
+
end
|
|
657
|
+
else
|
|
658
|
+
i = -1
|
|
659
|
+
match_len = args.length - 1
|
|
660
|
+
while true
|
|
661
|
+
previous, q, str = str.partition('?')
|
|
662
|
+
sql << previous
|
|
663
|
+
literal_append(sql, args.at(i+=1)) unless q.empty?
|
|
664
|
+
if str.empty?
|
|
665
|
+
unless i == match_len
|
|
666
|
+
raise Error, "Mismatched number of placeholders (#{i+1}) and placeholder arguments (#{args.length}) when using placeholder string"
|
|
667
|
+
end
|
|
668
|
+
break
|
|
669
|
+
end
|
|
670
|
+
end
|
|
671
|
+
end
|
|
672
|
+
sql << ')' if pls.parens
|
|
673
|
+
end
|
|
674
|
+
|
|
675
|
+
# Append literalization of qualified identifier to SQL string.
|
|
676
|
+
# If 3 arguments are given, the 2nd should be the table/qualifier and the third should be
|
|
677
|
+
# column/qualified. If 2 arguments are given, the 2nd should be an SQL::QualifiedIdentifier.
|
|
678
|
+
def qualified_identifier_sql_append(sql, table, column=(c = table.column; table = table.table; c))
|
|
679
|
+
identifier_append(sql, table)
|
|
680
|
+
sql << '.'
|
|
681
|
+
identifier_append(sql, column)
|
|
682
|
+
end
|
|
683
|
+
|
|
684
|
+
# Append literalization of unqualified identifier to SQL string.
|
|
685
|
+
# Adds quoting to identifiers (columns and tables). If identifiers are not
|
|
686
|
+
# being quoted, returns name as a string. If identifiers are being quoted
|
|
687
|
+
# quote the name with quoted_identifier.
|
|
688
|
+
def quote_identifier_append(sql, name)
|
|
689
|
+
name = name.value if name.is_a?(SQL::Identifier)
|
|
690
|
+
if name.is_a?(LiteralString)
|
|
691
|
+
sql << name
|
|
692
|
+
else
|
|
693
|
+
name = input_identifier(name)
|
|
694
|
+
if quote_identifiers?
|
|
695
|
+
quoted_identifier_append(sql, name)
|
|
696
|
+
else
|
|
697
|
+
sql << name
|
|
698
|
+
end
|
|
699
|
+
end
|
|
700
|
+
end
|
|
701
|
+
|
|
702
|
+
# Append literalization of identifier or unqualified identifier to SQL string.
|
|
703
|
+
def quote_schema_table_append(sql, table)
|
|
704
|
+
qualifiers = split_qualifiers(table)
|
|
705
|
+
table = qualifiers.pop
|
|
706
|
+
|
|
707
|
+
qualifiers.each do |q|
|
|
708
|
+
quote_identifier_append(sql, q)
|
|
709
|
+
sql << '.'
|
|
710
|
+
end
|
|
711
|
+
|
|
712
|
+
quote_identifier_append(sql, table)
|
|
713
|
+
end
|
|
714
|
+
|
|
715
|
+
# Append literalization of quoted identifier to SQL string.
|
|
716
|
+
# This method quotes the given name with the SQL standard double quote.
|
|
717
|
+
# should be overridden by subclasses to provide quoting not matching the
|
|
718
|
+
# SQL standard, such as backtick (used by MySQL and SQLite).
|
|
719
|
+
def quoted_identifier_append(sql, name)
|
|
720
|
+
sql << '"' << name.to_s.gsub('"', '""') << '"'
|
|
721
|
+
end
|
|
722
|
+
|
|
723
|
+
# Split the schema information from the table, returning two strings,
|
|
724
|
+
# one for the schema and one for the table. The returned schema may
|
|
725
|
+
# be nil, but the table will always have a string value.
|
|
726
|
+
#
|
|
727
|
+
# Note that this function does not handle tables with more than one
|
|
728
|
+
# level of qualification (e.g. database.schema.table on Microsoft
|
|
729
|
+
# SQL Server).
|
|
730
|
+
def schema_and_table(table_name, sch=nil)
|
|
731
|
+
sch = sch.to_s if sch
|
|
732
|
+
case table_name
|
|
733
|
+
when Symbol
|
|
734
|
+
s, t, _ = split_symbol(table_name)
|
|
735
|
+
[s||sch, t]
|
|
736
|
+
when SQL::QualifiedIdentifier
|
|
737
|
+
[table_name.table.to_s, table_name.column.to_s]
|
|
738
|
+
when SQL::Identifier
|
|
739
|
+
[sch, table_name.value.to_s]
|
|
740
|
+
when String
|
|
741
|
+
[sch, table_name]
|
|
742
|
+
else
|
|
743
|
+
raise Error, 'table_name should be a Symbol, SQL::QualifiedIdentifier, SQL::Identifier, or String'
|
|
744
|
+
end
|
|
745
|
+
end
|
|
746
|
+
|
|
747
|
+
# Splits table_name into an array of strings.
|
|
748
|
+
#
|
|
749
|
+
# ds.split_qualifiers(:s) # ['s']
|
|
750
|
+
# ds.split_qualifiers(Sequel[:t][:s]) # ['t', 's']
|
|
751
|
+
# ds.split_qualifiers(Sequel[:d][:t][:s]) # ['d', 't', 's']
|
|
752
|
+
# ds.split_qualifiers(Sequel.qualify(Sequel[:h][:d], Sequel[:t][:s])) # ['h', 'd', 't', 's']
|
|
753
|
+
def split_qualifiers(table_name, *args)
|
|
754
|
+
case table_name
|
|
755
|
+
when SQL::QualifiedIdentifier
|
|
756
|
+
split_qualifiers(table_name.table, nil) + split_qualifiers(table_name.column, nil)
|
|
757
|
+
else
|
|
758
|
+
sch, table = schema_and_table(table_name, *args)
|
|
759
|
+
sch ? [sch, table] : [table]
|
|
760
|
+
end
|
|
761
|
+
end
|
|
762
|
+
|
|
763
|
+
# Append literalization of subscripts (SQL array accesses) to SQL string.
|
|
764
|
+
def subscript_sql_append(sql, s)
|
|
765
|
+
case s.expression
|
|
766
|
+
when Symbol, SQL::Subscript, SQL::Identifier, SQL::QualifiedIdentifier
|
|
767
|
+
# nothing
|
|
768
|
+
else
|
|
769
|
+
wrap_expression = true
|
|
770
|
+
sql << '('
|
|
771
|
+
end
|
|
772
|
+
literal_append(sql, s.expression)
|
|
773
|
+
if wrap_expression
|
|
774
|
+
sql << ')['
|
|
775
|
+
else
|
|
776
|
+
sql << '['
|
|
777
|
+
end
|
|
778
|
+
sub = s.sub
|
|
779
|
+
if sub.length == 1 && (range = sub.first).is_a?(Range)
|
|
780
|
+
literal_append(sql, range.begin)
|
|
781
|
+
sql << ':'
|
|
782
|
+
e = range.end
|
|
783
|
+
e -= 1 if range.exclude_end? && e.is_a?(Integer)
|
|
784
|
+
literal_append(sql, e)
|
|
785
|
+
else
|
|
786
|
+
expression_list_append(sql, s.sub)
|
|
787
|
+
end
|
|
788
|
+
sql << ']'
|
|
789
|
+
end
|
|
790
|
+
|
|
791
|
+
# Append literalization of windows (for window functions) to SQL string.
|
|
792
|
+
def window_sql_append(sql, opts)
|
|
793
|
+
raise(Error, 'This dataset does not support window functions') unless supports_window_functions?
|
|
794
|
+
space = false
|
|
795
|
+
space_s = ' '
|
|
796
|
+
|
|
797
|
+
sql << '('
|
|
798
|
+
|
|
799
|
+
if window = opts[:window]
|
|
800
|
+
literal_append(sql, window)
|
|
801
|
+
space = true
|
|
802
|
+
end
|
|
803
|
+
|
|
804
|
+
if part = opts[:partition]
|
|
805
|
+
sql << space_s if space
|
|
806
|
+
sql << "PARTITION BY "
|
|
807
|
+
expression_list_append(sql, Array(part))
|
|
808
|
+
space = true
|
|
809
|
+
end
|
|
810
|
+
|
|
811
|
+
if order = opts[:order]
|
|
812
|
+
sql << space_s if space
|
|
813
|
+
sql << "ORDER BY "
|
|
814
|
+
expression_list_append(sql, Array(order))
|
|
815
|
+
space = true
|
|
816
|
+
end
|
|
817
|
+
|
|
818
|
+
if frame = opts[:frame]
|
|
819
|
+
sql << space_s if space
|
|
820
|
+
|
|
821
|
+
if frame.is_a?(String)
|
|
822
|
+
sql << frame
|
|
823
|
+
else
|
|
824
|
+
case frame
|
|
825
|
+
when :all
|
|
826
|
+
frame_type = :rows
|
|
827
|
+
frame_start = :preceding
|
|
828
|
+
frame_end = :following
|
|
829
|
+
when :rows, :range, :groups
|
|
830
|
+
frame_type = frame
|
|
831
|
+
frame_start = :preceding
|
|
832
|
+
frame_end = :current
|
|
833
|
+
when Hash
|
|
834
|
+
frame_type = frame[:type]
|
|
835
|
+
unless frame_type == :rows || frame_type == :range || frame_type == :groups
|
|
836
|
+
raise Error, "invalid window :frame :type option: #{frame_type.inspect}"
|
|
837
|
+
end
|
|
838
|
+
unless frame_start = frame[:start]
|
|
839
|
+
raise Error, "invalid window :frame :start option: #{frame_start.inspect}"
|
|
840
|
+
end
|
|
841
|
+
frame_end = frame[:end]
|
|
842
|
+
frame_exclude = frame[:exclude]
|
|
843
|
+
else
|
|
844
|
+
raise Error, "invalid window :frame option: #{frame.inspect}"
|
|
845
|
+
end
|
|
846
|
+
|
|
847
|
+
sql << frame_type.to_s.upcase << " "
|
|
848
|
+
sql << 'BETWEEN ' if frame_end
|
|
849
|
+
window_frame_boundary_sql_append(sql, frame_start, :preceding)
|
|
850
|
+
if frame_end
|
|
851
|
+
sql << " AND "
|
|
852
|
+
window_frame_boundary_sql_append(sql, frame_end, :following)
|
|
853
|
+
end
|
|
854
|
+
|
|
855
|
+
if frame_exclude
|
|
856
|
+
sql << " EXCLUDE "
|
|
857
|
+
|
|
858
|
+
case frame_exclude
|
|
859
|
+
when :current
|
|
860
|
+
sql << "CURRENT ROW"
|
|
861
|
+
when :group
|
|
862
|
+
sql << "GROUP"
|
|
863
|
+
when :ties
|
|
864
|
+
sql << "TIES"
|
|
865
|
+
when :no_others
|
|
866
|
+
sql << "NO OTHERS"
|
|
867
|
+
else
|
|
868
|
+
raise Error, "invalid window :frame :exclude option: #{frame_exclude.inspect}"
|
|
869
|
+
end
|
|
870
|
+
end
|
|
871
|
+
end
|
|
872
|
+
end
|
|
873
|
+
|
|
874
|
+
sql << ')'
|
|
875
|
+
end
|
|
876
|
+
|
|
877
|
+
protected
|
|
878
|
+
|
|
879
|
+
# Return a from_self dataset if an order or limit is specified, so it works as expected
|
|
880
|
+
# with UNION, EXCEPT, and INTERSECT clauses.
|
|
881
|
+
def compound_from_self
|
|
882
|
+
(@opts[:sql] || @opts[:limit] || @opts[:order] || @opts[:offset]) ? from_self : self
|
|
883
|
+
end
|
|
884
|
+
|
|
885
|
+
private
|
|
886
|
+
|
|
887
|
+
# Append the INSERT sql used in a MERGE
|
|
888
|
+
def _merge_insert_sql(sql, data)
|
|
889
|
+
sql << " THEN INSERT"
|
|
890
|
+
columns, values = _parse_insert_sql_args(data[:values])
|
|
891
|
+
_insert_columns_sql(sql, columns)
|
|
892
|
+
_insert_values_sql(sql, values)
|
|
893
|
+
end
|
|
894
|
+
|
|
895
|
+
def _merge_update_sql(sql, data)
|
|
896
|
+
sql << " THEN UPDATE SET "
|
|
897
|
+
update_sql_values_hash(sql, data[:values])
|
|
898
|
+
end
|
|
899
|
+
|
|
900
|
+
def _merge_delete_sql(sql, data)
|
|
901
|
+
sql << " THEN DELETE"
|
|
902
|
+
end
|
|
903
|
+
|
|
904
|
+
# Mapping of merge types to related SQL
|
|
905
|
+
MERGE_TYPE_SQL = {
|
|
906
|
+
:insert => ' WHEN NOT MATCHED',
|
|
907
|
+
:delete => ' WHEN MATCHED',
|
|
908
|
+
:delete_not_matched_by_source => ' WHEN NOT MATCHED BY SOURCE',
|
|
909
|
+
:update => ' WHEN MATCHED',
|
|
910
|
+
:update_not_matched_by_source => ' WHEN NOT MATCHED BY SOURCE',
|
|
911
|
+
:matched => ' WHEN MATCHED',
|
|
912
|
+
:not_matched => ' WHEN NOT MATCHED',
|
|
913
|
+
:not_matched_by_source => ' WHEN NOT MATCHED BY SOURCE',
|
|
914
|
+
}.freeze
|
|
915
|
+
private_constant :MERGE_TYPE_SQL
|
|
916
|
+
|
|
917
|
+
MERGE_NORMALIZE_TYPE_MAP = {
|
|
918
|
+
:delete_not_matched_by_source => :delete,
|
|
919
|
+
:update_not_matched_by_source => :update,
|
|
920
|
+
:matched => :do_nothing,
|
|
921
|
+
:not_matched => :do_nothing,
|
|
922
|
+
:not_matched_by_source => :do_nothing,
|
|
923
|
+
}.freeze
|
|
924
|
+
private_constant :MERGE_NORMALIZE_TYPE_MAP
|
|
925
|
+
|
|
926
|
+
# Add the WHEN clauses to the MERGE SQL
|
|
927
|
+
def _merge_when_sql(sql)
|
|
928
|
+
raise Error, "no WHEN [NOT] MATCHED clauses provided for MERGE" unless merge_when = @opts[:merge_when]
|
|
929
|
+
merge_when.each do |data|
|
|
930
|
+
type = data[:type]
|
|
931
|
+
sql << MERGE_TYPE_SQL[type]
|
|
932
|
+
type = MERGE_NORMALIZE_TYPE_MAP[type] || type
|
|
933
|
+
_merge_when_conditions_sql(sql, data)
|
|
934
|
+
send(:"_merge_#{type}_sql", sql, data)
|
|
935
|
+
end
|
|
936
|
+
end
|
|
937
|
+
|
|
938
|
+
# Append MERGE WHEN conditions, if there are conditions provided.
|
|
939
|
+
def _merge_when_conditions_sql(sql, data)
|
|
940
|
+
if data.has_key?(:conditions)
|
|
941
|
+
sql << " AND "
|
|
942
|
+
literal_append(sql, data[:conditions])
|
|
943
|
+
end
|
|
944
|
+
end
|
|
945
|
+
|
|
946
|
+
# Parse the values passed to insert_sql, returning columns and values
|
|
947
|
+
# to use for the INSERT. Returned columns is always an array, but can be empty
|
|
948
|
+
# for an INSERT without explicit column references. Returned values can be an
|
|
949
|
+
# array, dataset, or literal string.
|
|
950
|
+
def _parse_insert_sql_args(values)
|
|
951
|
+
columns = []
|
|
952
|
+
|
|
953
|
+
case values.size
|
|
954
|
+
when 0
|
|
955
|
+
values = []
|
|
956
|
+
when 1
|
|
957
|
+
case vals = values[0]
|
|
958
|
+
when Hash
|
|
959
|
+
values = []
|
|
960
|
+
vals.each do |k,v|
|
|
961
|
+
columns << k
|
|
962
|
+
values << v
|
|
963
|
+
end
|
|
964
|
+
when Dataset, Array, LiteralString
|
|
965
|
+
values = vals
|
|
966
|
+
end
|
|
967
|
+
when 2
|
|
968
|
+
if (v0 = values[0]).is_a?(Array) && ((v1 = values[1]).is_a?(Array) || v1.is_a?(Dataset) || v1.is_a?(LiteralString))
|
|
969
|
+
columns, values = v0, v1
|
|
970
|
+
raise(Error, "Different number of values and columns given to insert_sql") if values.is_a?(Array) and columns.length != values.length
|
|
971
|
+
end
|
|
972
|
+
end
|
|
973
|
+
|
|
974
|
+
[columns, values]
|
|
975
|
+
end
|
|
976
|
+
|
|
977
|
+
# Formats the truncate statement. Assumes the table given has already been
|
|
978
|
+
# literalized.
|
|
979
|
+
def _truncate_sql(table)
|
|
980
|
+
"TRUNCATE TABLE #{table}"
|
|
981
|
+
end
|
|
982
|
+
|
|
983
|
+
# Returns an appropriate symbol for the alias represented by s.
|
|
984
|
+
def alias_alias_symbol(s)
|
|
985
|
+
case s
|
|
986
|
+
when Symbol
|
|
987
|
+
s
|
|
988
|
+
when String
|
|
989
|
+
s.to_sym
|
|
990
|
+
when SQL::Identifier
|
|
991
|
+
s.value.to_s.to_sym
|
|
992
|
+
else
|
|
993
|
+
raise Error, "Invalid alias for alias_alias_symbol: #{s.inspect}"
|
|
994
|
+
end
|
|
995
|
+
end
|
|
996
|
+
|
|
997
|
+
# Returns an appropriate alias symbol for the given object, which can be
|
|
998
|
+
# a Symbol, String, SQL::Identifier, SQL::QualifiedIdentifier, or
|
|
999
|
+
# SQL::AliasedExpression.
|
|
1000
|
+
def alias_symbol(sym)
|
|
1001
|
+
case sym
|
|
1002
|
+
when Symbol
|
|
1003
|
+
s, t, a = split_symbol(sym)
|
|
1004
|
+
a || s ? (a || t).to_sym : sym
|
|
1005
|
+
when String
|
|
1006
|
+
sym.to_sym
|
|
1007
|
+
when SQL::Identifier
|
|
1008
|
+
sym.value.to_s.to_sym
|
|
1009
|
+
when SQL::QualifiedIdentifier
|
|
1010
|
+
alias_symbol(sym.column)
|
|
1011
|
+
when SQL::AliasedExpression
|
|
1012
|
+
alias_alias_symbol(sym.alias)
|
|
1013
|
+
else
|
|
1014
|
+
raise Error, "Invalid alias for alias_symbol: #{sym.inspect}"
|
|
1015
|
+
end
|
|
1016
|
+
end
|
|
1017
|
+
|
|
1018
|
+
# Clone of this dataset usable in aggregate operations. Does
|
|
1019
|
+
# a from_self if dataset contains any parameters that would
|
|
1020
|
+
# affect normal aggregation, or just removes an existing
|
|
1021
|
+
# order if not. Also removes the row_proc, which isn't needed
|
|
1022
|
+
# for aggregate calculations.
|
|
1023
|
+
def aggregate_dataset
|
|
1024
|
+
(aggreate_dataset_use_from_self? ? from_self : unordered).naked
|
|
1025
|
+
end
|
|
1026
|
+
|
|
1027
|
+
# Whether to use from_self for an aggregate dataset.
|
|
1028
|
+
def aggreate_dataset_use_from_self?
|
|
1029
|
+
options_overlap(COUNT_FROM_SELF_OPTS)
|
|
1030
|
+
end
|
|
1031
|
+
|
|
1032
|
+
# Append aliasing expression to SQL string.
|
|
1033
|
+
def as_sql_append(sql, aliaz, column_aliases=nil)
|
|
1034
|
+
sql << ' AS '
|
|
1035
|
+
quote_identifier_append(sql, aliaz)
|
|
1036
|
+
if column_aliases
|
|
1037
|
+
raise Error, "#{db.database_type} does not support derived column lists" unless supports_derived_column_lists?
|
|
1038
|
+
sql << '('
|
|
1039
|
+
derived_column_list_sql_append(sql, column_aliases)
|
|
1040
|
+
sql << ')'
|
|
1041
|
+
end
|
|
1042
|
+
end
|
|
1043
|
+
|
|
1044
|
+
# Don't allow caching SQL if specifically marked not to.
|
|
1045
|
+
def cache_sql?
|
|
1046
|
+
!@opts[:no_cache_sql] && !cache_get(:_no_cache_sql)
|
|
1047
|
+
end
|
|
1048
|
+
|
|
1049
|
+
# Raise an InvalidOperation exception if modification is not allowed for this dataset.
|
|
1050
|
+
# Check whether it is allowed to insert into this dataset.
|
|
1051
|
+
# Only for backwards compatibility with older external adapters.
|
|
1052
|
+
def check_modification_allowed!
|
|
1053
|
+
# SEQUEL6: Remove
|
|
1054
|
+
Sequel::Deprecation.deprecate("Dataset#check_modification_allowed!", "Use check_{insert,delete,update,truncation}_allowed! instead")
|
|
1055
|
+
_check_modification_allowed!(supports_modifying_joins?)
|
|
1056
|
+
end
|
|
1057
|
+
|
|
1058
|
+
# Check whether it is allowed to insert into this dataset.
|
|
1059
|
+
def check_insert_allowed!
|
|
1060
|
+
_check_modification_allowed!(false)
|
|
1061
|
+
end
|
|
1062
|
+
alias check_truncation_allowed! check_insert_allowed!
|
|
1063
|
+
|
|
1064
|
+
# Check whether it is allowed to delete from this dataset.
|
|
1065
|
+
def check_delete_allowed!
|
|
1066
|
+
_check_modification_allowed!(supports_deleting_joins?)
|
|
1067
|
+
end
|
|
1068
|
+
|
|
1069
|
+
# Check whether it is allowed to update this dataset.
|
|
1070
|
+
def check_update_allowed!
|
|
1071
|
+
_check_modification_allowed!(supports_updating_joins?)
|
|
1072
|
+
end
|
|
1073
|
+
|
|
1074
|
+
# Internals of the check_*_allowed! methods
|
|
1075
|
+
def _check_modification_allowed!(modifying_joins_supported)
|
|
1076
|
+
raise(InvalidOperation, "Grouped datasets cannot be modified") if opts[:group]
|
|
1077
|
+
raise(InvalidOperation, "Joined datasets cannot be modified") if !modifying_joins_supported && joined_dataset?
|
|
1078
|
+
end
|
|
1079
|
+
|
|
1080
|
+
# Raise error if the dataset uses limits or offsets.
|
|
1081
|
+
def check_not_limited!(type)
|
|
1082
|
+
return if @opts[:skip_limit_check] && type != :truncate
|
|
1083
|
+
raise InvalidOperation, "Dataset##{type} not supported on datasets with limits or offsets" if opts[:limit] || opts[:offset]
|
|
1084
|
+
end
|
|
1085
|
+
|
|
1086
|
+
# Append column list to SQL string.
|
|
1087
|
+
# If the column list is empty, a wildcard (*) is appended.
|
|
1088
|
+
def column_list_append(sql, columns)
|
|
1089
|
+
if (columns.nil? || columns.empty?)
|
|
1090
|
+
sql << '*'
|
|
1091
|
+
else
|
|
1092
|
+
expression_list_append(sql, columns)
|
|
1093
|
+
end
|
|
1094
|
+
end
|
|
1095
|
+
|
|
1096
|
+
# Yield each pair of arguments to the block, which should
|
|
1097
|
+
# return an object representing the SQL expression for those
|
|
1098
|
+
# two arguments. For more than two arguments, the first
|
|
1099
|
+
# argument to the block will be result of the previous block call.
|
|
1100
|
+
def complex_expression_arg_pairs(args)
|
|
1101
|
+
case args.length
|
|
1102
|
+
when 1
|
|
1103
|
+
args[0]
|
|
1104
|
+
when 2
|
|
1105
|
+
yield args[0], args[1]
|
|
1106
|
+
else
|
|
1107
|
+
args.inject{|m, a| yield(m, a)}
|
|
1108
|
+
end
|
|
1109
|
+
end
|
|
1110
|
+
|
|
1111
|
+
# Append the literalization of the args using complex_expression_arg_pairs
|
|
1112
|
+
# to the given SQL string, used when database operator/function is 2-ary
|
|
1113
|
+
# where Sequel expression is N-ary.
|
|
1114
|
+
def complex_expression_arg_pairs_append(sql, args, &block)
|
|
1115
|
+
literal_append(sql, complex_expression_arg_pairs(args, &block))
|
|
1116
|
+
end
|
|
1117
|
+
|
|
1118
|
+
# Append literalization of complex expression to SQL string, for
|
|
1119
|
+
# operators unsupported by some databases. Used by adapters for databases
|
|
1120
|
+
# that don't support the operators natively.
|
|
1121
|
+
def complex_expression_emulate_append(sql, op, args)
|
|
1122
|
+
# :nocov:
|
|
1123
|
+
case op
|
|
1124
|
+
# :nocov:
|
|
1125
|
+
when :%
|
|
1126
|
+
complex_expression_arg_pairs_append(sql, args){|a, b| Sequel.function(:MOD, a, b)}
|
|
1127
|
+
when :>>
|
|
1128
|
+
complex_expression_arg_pairs_append(sql, args){|a, b| Sequel./(a, Sequel.function(:power, 2, b))}
|
|
1129
|
+
when :<<
|
|
1130
|
+
complex_expression_arg_pairs_append(sql, args){|a, b| Sequel.*(a, Sequel.function(:power, 2, b))}
|
|
1131
|
+
when :&, :|, :^
|
|
1132
|
+
f = BITWISE_METHOD_MAP[op]
|
|
1133
|
+
complex_expression_arg_pairs_append(sql, args){|a, b| Sequel.function(f, a, b)}
|
|
1134
|
+
when :'B~'
|
|
1135
|
+
sql << "((0 - "
|
|
1136
|
+
literal_append(sql, args[0])
|
|
1137
|
+
sql << ") - 1)"
|
|
1138
|
+
end
|
|
1139
|
+
end
|
|
1140
|
+
|
|
1141
|
+
# Append literalization of dataset used in UNION/INTERSECT/EXCEPT clause to SQL string.
|
|
1142
|
+
def compound_dataset_sql_append(sql, ds)
|
|
1143
|
+
subselect_sql_append(sql, ds)
|
|
1144
|
+
end
|
|
1145
|
+
|
|
1146
|
+
# The alias to use for datasets, takes a number to make sure the name is unique.
|
|
1147
|
+
def dataset_alias(number)
|
|
1148
|
+
:"t#{number}"
|
|
1149
|
+
end
|
|
1150
|
+
|
|
1151
|
+
# The strftime format to use when literalizing time (Sequel::SQLTime) values.
|
|
1152
|
+
def default_time_format
|
|
1153
|
+
"'%H:%M:%S.%6N'"
|
|
1154
|
+
end
|
|
1155
|
+
|
|
1156
|
+
# The strftime format to use when literalizing timestamp (Time/DateTime) values.
|
|
1157
|
+
def default_timestamp_format
|
|
1158
|
+
"'%Y-%m-%d %H:%M:%S.%6N'"
|
|
1159
|
+
end
|
|
1160
|
+
|
|
1161
|
+
def delete_delete_sql(sql)
|
|
1162
|
+
sql << 'DELETE'
|
|
1163
|
+
end
|
|
1164
|
+
|
|
1165
|
+
def delete_from_sql(sql)
|
|
1166
|
+
if f = @opts[:from]
|
|
1167
|
+
sql << ' FROM '
|
|
1168
|
+
source_list_append(sql, f)
|
|
1169
|
+
end
|
|
1170
|
+
end
|
|
1171
|
+
|
|
1172
|
+
# Append the column aliases to the SQL.
|
|
1173
|
+
def derived_column_list_sql_append(sql, column_aliases)
|
|
1174
|
+
identifier_list_append(sql, column_aliases)
|
|
1175
|
+
end
|
|
1176
|
+
|
|
1177
|
+
# Disable caching of SQL for the current dataset
|
|
1178
|
+
def disable_sql_caching!
|
|
1179
|
+
cache_set(:_no_cache_sql, true)
|
|
1180
|
+
end
|
|
1181
|
+
|
|
1182
|
+
# An SQL FROM clause to use in SELECT statements where the dataset has
|
|
1183
|
+
# no from tables.
|
|
1184
|
+
def empty_from_sql
|
|
1185
|
+
nil
|
|
1186
|
+
end
|
|
1187
|
+
|
|
1188
|
+
# Whether to emulate the function with the given name. This should only be true
|
|
1189
|
+
# if the emulation goes beyond choosing a function with a different name.
|
|
1190
|
+
def emulate_function?(name)
|
|
1191
|
+
false
|
|
1192
|
+
end
|
|
1193
|
+
|
|
1194
|
+
# Append literalization of array of expressions to SQL string, separating them
|
|
1195
|
+
# with commas.
|
|
1196
|
+
def expression_list_append(sql, columns)
|
|
1197
|
+
c = false
|
|
1198
|
+
co = ', '
|
|
1199
|
+
columns.each do |col|
|
|
1200
|
+
sql << co if c
|
|
1201
|
+
literal_append(sql, col)
|
|
1202
|
+
c ||= true
|
|
1203
|
+
end
|
|
1204
|
+
end
|
|
1205
|
+
|
|
1206
|
+
# Append literalization of array of grouping elements to SQL string, seperating them with commas.
|
|
1207
|
+
def grouping_element_list_append(sql, columns)
|
|
1208
|
+
c = false
|
|
1209
|
+
co = ', '
|
|
1210
|
+
columns.each do |col|
|
|
1211
|
+
sql << co if c
|
|
1212
|
+
if col.is_a?(Array) && col.empty?
|
|
1213
|
+
sql << '()'
|
|
1214
|
+
else
|
|
1215
|
+
literal_append(sql, Array(col))
|
|
1216
|
+
end
|
|
1217
|
+
c ||= true
|
|
1218
|
+
end
|
|
1219
|
+
end
|
|
1220
|
+
|
|
1221
|
+
# An expression for how to handle an empty array lookup.
|
|
1222
|
+
def empty_array_value(op, cols)
|
|
1223
|
+
{1 => ((op == :IN) ? 0 : 1)}
|
|
1224
|
+
end
|
|
1225
|
+
|
|
1226
|
+
# Format the timestamp based on the default_timestamp_format.
|
|
1227
|
+
def format_timestamp(v)
|
|
1228
|
+
db.from_application_timestamp(v).strftime(default_timestamp_format)
|
|
1229
|
+
end
|
|
1230
|
+
|
|
1231
|
+
# :nocov:
|
|
1232
|
+
|
|
1233
|
+
# Return the SQL timestamp fragment to use for the fractional time part.
|
|
1234
|
+
# Should start with the decimal point. Uses 6 decimal places by default.
|
|
1235
|
+
def format_timestamp_usec(usec, ts=timestamp_precision)
|
|
1236
|
+
# SEQUEL6: Remove
|
|
1237
|
+
unless ts == 6
|
|
1238
|
+
usec = usec/(10 ** (6 - ts))
|
|
1239
|
+
end
|
|
1240
|
+
sprintf(".%0#{ts}d", usec)
|
|
1241
|
+
end
|
|
1242
|
+
# :nocov:
|
|
1243
|
+
|
|
1244
|
+
# Append literalization of identifier to SQL string, considering regular strings
|
|
1245
|
+
# as SQL identifiers instead of SQL strings.
|
|
1246
|
+
def identifier_append(sql, v)
|
|
1247
|
+
if v.is_a?(String)
|
|
1248
|
+
case v
|
|
1249
|
+
when LiteralString
|
|
1250
|
+
sql << v
|
|
1251
|
+
when SQL::Blob
|
|
1252
|
+
literal_append(sql, v)
|
|
1253
|
+
else
|
|
1254
|
+
quote_identifier_append(sql, v)
|
|
1255
|
+
end
|
|
1256
|
+
else
|
|
1257
|
+
literal_append(sql, v)
|
|
1258
|
+
end
|
|
1259
|
+
end
|
|
1260
|
+
|
|
1261
|
+
# Append literalization of array of identifiers to SQL string.
|
|
1262
|
+
def identifier_list_append(sql, args)
|
|
1263
|
+
c = false
|
|
1264
|
+
comma = ', '
|
|
1265
|
+
args.each do |a|
|
|
1266
|
+
sql << comma if c
|
|
1267
|
+
identifier_append(sql, a)
|
|
1268
|
+
c ||= true
|
|
1269
|
+
end
|
|
1270
|
+
end
|
|
1271
|
+
|
|
1272
|
+
# Upcase identifiers by default when inputting them into the database.
|
|
1273
|
+
def input_identifier(v)
|
|
1274
|
+
v.to_s.upcase
|
|
1275
|
+
end
|
|
1276
|
+
|
|
1277
|
+
def insert_into_sql(sql)
|
|
1278
|
+
sql << " INTO "
|
|
1279
|
+
if (f = @opts[:from]) && f.length == 1
|
|
1280
|
+
identifier_append(sql, unaliased_identifier(f.first))
|
|
1281
|
+
else
|
|
1282
|
+
source_list_append(sql, f)
|
|
1283
|
+
end
|
|
1284
|
+
end
|
|
1285
|
+
|
|
1286
|
+
def insert_columns_sql(sql)
|
|
1287
|
+
_insert_columns_sql(sql, opts[:columns])
|
|
1288
|
+
end
|
|
1289
|
+
|
|
1290
|
+
def _insert_columns_sql(sql, columns)
|
|
1291
|
+
if columns && !columns.empty?
|
|
1292
|
+
sql << ' ('
|
|
1293
|
+
identifier_list_append(sql, columns)
|
|
1294
|
+
sql << ')'
|
|
1295
|
+
end
|
|
1296
|
+
end
|
|
1297
|
+
|
|
1298
|
+
# The columns and values to use for an empty insert if the database doesn't support
|
|
1299
|
+
# INSERT with DEFAULT VALUES.
|
|
1300
|
+
def insert_empty_columns_values
|
|
1301
|
+
[[columns.last], [DEFAULT]]
|
|
1302
|
+
end
|
|
1303
|
+
|
|
1304
|
+
def insert_insert_sql(sql)
|
|
1305
|
+
sql << "INSERT"
|
|
1306
|
+
end
|
|
1307
|
+
|
|
1308
|
+
def insert_values_sql(sql)
|
|
1309
|
+
_insert_values_sql(sql, opts[:values])
|
|
1310
|
+
end
|
|
1311
|
+
|
|
1312
|
+
def _insert_values_sql(sql, values)
|
|
1313
|
+
case values
|
|
1314
|
+
when Array
|
|
1315
|
+
if values.empty?
|
|
1316
|
+
sql << " DEFAULT VALUES"
|
|
1317
|
+
else
|
|
1318
|
+
sql << " VALUES "
|
|
1319
|
+
literal_append(sql, values)
|
|
1320
|
+
end
|
|
1321
|
+
when Dataset
|
|
1322
|
+
sql << ' '
|
|
1323
|
+
subselect_sql_append(sql, values)
|
|
1324
|
+
when LiteralString
|
|
1325
|
+
sql << ' ' << values
|
|
1326
|
+
else
|
|
1327
|
+
raise Error, "Unsupported INSERT values type, should be an Array or Dataset: #{values.inspect}"
|
|
1328
|
+
end
|
|
1329
|
+
end
|
|
1330
|
+
|
|
1331
|
+
def insert_returning_sql(sql)
|
|
1332
|
+
if opts.has_key?(:returning)
|
|
1333
|
+
sql << " RETURNING "
|
|
1334
|
+
column_list_append(sql, Array(opts[:returning]))
|
|
1335
|
+
end
|
|
1336
|
+
end
|
|
1337
|
+
alias delete_returning_sql insert_returning_sql
|
|
1338
|
+
alias update_returning_sql insert_returning_sql
|
|
1339
|
+
|
|
1340
|
+
# SQL fragment specifying a JOIN type, converts underscores to
|
|
1341
|
+
# spaces and upcases.
|
|
1342
|
+
def join_type_sql(join_type)
|
|
1343
|
+
"#{join_type.to_s.tr('_', ' ').upcase} JOIN"
|
|
1344
|
+
end
|
|
1345
|
+
|
|
1346
|
+
# Append USING clause for JOIN USING
|
|
1347
|
+
def join_using_clause_using_sql_append(sql, using_columns)
|
|
1348
|
+
sql << ' USING ('
|
|
1349
|
+
column_list_append(sql, using_columns)
|
|
1350
|
+
sql << ')'
|
|
1351
|
+
end
|
|
1352
|
+
|
|
1353
|
+
# Append a literalization of the array to SQL string.
|
|
1354
|
+
# Treats as an expression if an array of all two pairs, or as a SQL array otherwise.
|
|
1355
|
+
def literal_array_append(sql, v)
|
|
1356
|
+
if Sequel.condition_specifier?(v)
|
|
1357
|
+
literal_expression_append(sql, SQL::BooleanExpression.from_value_pairs(v))
|
|
1358
|
+
else
|
|
1359
|
+
array_sql_append(sql, v)
|
|
1360
|
+
end
|
|
1361
|
+
end
|
|
1362
|
+
|
|
1363
|
+
# SQL fragment for BigDecimal
|
|
1364
|
+
def literal_big_decimal(v)
|
|
1365
|
+
d = v.to_s("F")
|
|
1366
|
+
v.nan? || v.infinite? ? "'#{d}'" : d
|
|
1367
|
+
end
|
|
1368
|
+
|
|
1369
|
+
# Append literalization of SQL::Blob to SQL string.
|
|
1370
|
+
def literal_blob_append(sql, v)
|
|
1371
|
+
literal_string_append(sql, v)
|
|
1372
|
+
end
|
|
1373
|
+
|
|
1374
|
+
# Append literalization of dataset to SQL string. Does a subselect inside parantheses.
|
|
1375
|
+
def literal_dataset_append(sql, v)
|
|
1376
|
+
sql << 'LATERAL ' if v.opts[:lateral]
|
|
1377
|
+
sql << '('
|
|
1378
|
+
subselect_sql_append(sql, v)
|
|
1379
|
+
sql << ')'
|
|
1380
|
+
end
|
|
1381
|
+
|
|
1382
|
+
# SQL fragment for Date, using the ISO8601 format.
|
|
1383
|
+
def literal_date(v)
|
|
1384
|
+
v.strftime("'%Y-%m-%d'")
|
|
1385
|
+
end
|
|
1386
|
+
|
|
1387
|
+
# Append literalization of date to SQL string.
|
|
1388
|
+
def literal_date_append(sql, v)
|
|
1389
|
+
sql << literal_date(v)
|
|
1390
|
+
end
|
|
1391
|
+
|
|
1392
|
+
# SQL fragment for DateTime
|
|
1393
|
+
def literal_datetime(v)
|
|
1394
|
+
format_timestamp(v)
|
|
1395
|
+
end
|
|
1396
|
+
|
|
1397
|
+
# Append literalization of DateTime to SQL string.
|
|
1398
|
+
def literal_datetime_append(sql, v)
|
|
1399
|
+
sql << literal_datetime(v)
|
|
1400
|
+
end
|
|
1401
|
+
|
|
1402
|
+
# Append literalization of SQL::Expression to SQL string.
|
|
1403
|
+
def literal_expression_append(sql, v)
|
|
1404
|
+
v.to_s_append(self, sql)
|
|
1405
|
+
end
|
|
1406
|
+
|
|
1407
|
+
# SQL fragment for false
|
|
1408
|
+
def literal_false
|
|
1409
|
+
"'f'"
|
|
1410
|
+
end
|
|
1411
|
+
|
|
1412
|
+
# SQL fragment for Float
|
|
1413
|
+
def literal_float(v)
|
|
1414
|
+
v.to_s
|
|
1415
|
+
end
|
|
1416
|
+
|
|
1417
|
+
# Append literalization of Hash to SQL string, treating hash as a boolean expression.
|
|
1418
|
+
def literal_hash_append(sql, v)
|
|
1419
|
+
literal_expression_append(sql, SQL::BooleanExpression.from_value_pairs(v))
|
|
1420
|
+
end
|
|
1421
|
+
|
|
1422
|
+
# SQL fragment for Integer
|
|
1423
|
+
def literal_integer(v)
|
|
1424
|
+
v.to_s
|
|
1425
|
+
end
|
|
1426
|
+
|
|
1427
|
+
# SQL fragment for nil
|
|
1428
|
+
def literal_nil
|
|
1429
|
+
"NULL"
|
|
1430
|
+
end
|
|
1431
|
+
|
|
1432
|
+
# Append a literalization of the object to the given SQL string.
|
|
1433
|
+
# Calls +sql_literal_append+ if object responds to it, otherwise
|
|
1434
|
+
# calls +sql_literal+ if object responds to it, otherwise raises an error.
|
|
1435
|
+
# If a database specific type is allowed, this should be overriden in a subclass.
|
|
1436
|
+
def literal_other_append(sql, v)
|
|
1437
|
+
if v.respond_to?(:sql_literal_append)
|
|
1438
|
+
v.sql_literal_append(self, sql)
|
|
1439
|
+
elsif v.respond_to?(:sql_literal)
|
|
1440
|
+
sql << v.sql_literal(self)
|
|
1441
|
+
else
|
|
1442
|
+
raise Error, "can't express #{v.inspect} as a SQL literal"
|
|
1443
|
+
end
|
|
1444
|
+
|
|
1445
|
+
if !v.respond_to?(:sql_literal_allow_caching?) || !v.sql_literal_allow_caching?(self)
|
|
1446
|
+
# We can't be sure if v will always literalize to the same SQL, so
|
|
1447
|
+
# don't cache SQL for a dataset that uses this.
|
|
1448
|
+
disable_sql_caching!
|
|
1449
|
+
end
|
|
1450
|
+
end
|
|
1451
|
+
|
|
1452
|
+
# Append a literalization of the set to SQL string.
|
|
1453
|
+
# Treats as an expression as an SQL value list.
|
|
1454
|
+
def literal_set_append(sql, v)
|
|
1455
|
+
array_sql_append(sql, v)
|
|
1456
|
+
end
|
|
1457
|
+
|
|
1458
|
+
# SQL fragment for Sequel::SQLTime, containing just the time part
|
|
1459
|
+
def literal_sqltime(v)
|
|
1460
|
+
v.strftime(default_time_format)
|
|
1461
|
+
end
|
|
1462
|
+
|
|
1463
|
+
# Append literalization of Sequel::SQLTime to SQL string.
|
|
1464
|
+
def literal_sqltime_append(sql, v)
|
|
1465
|
+
sql << literal_sqltime(v)
|
|
1466
|
+
end
|
|
1467
|
+
|
|
1468
|
+
# Append literalization of string to SQL string.
|
|
1469
|
+
def literal_string_append(sql, v)
|
|
1470
|
+
sql << "'" << v.gsub("'", "''") << "'"
|
|
1471
|
+
end
|
|
1472
|
+
|
|
1473
|
+
# Append literalization of symbol to SQL string.
|
|
1474
|
+
def literal_symbol_append(sql, v)
|
|
1475
|
+
c_table, column, c_alias = split_symbol(v)
|
|
1476
|
+
if c_table
|
|
1477
|
+
quote_identifier_append(sql, c_table)
|
|
1478
|
+
sql << '.'
|
|
1479
|
+
end
|
|
1480
|
+
quote_identifier_append(sql, column)
|
|
1481
|
+
as_sql_append(sql, c_alias) if c_alias
|
|
1482
|
+
end
|
|
1483
|
+
|
|
1484
|
+
# SQL fragment for Time
|
|
1485
|
+
def literal_time(v)
|
|
1486
|
+
format_timestamp(v)
|
|
1487
|
+
end
|
|
1488
|
+
|
|
1489
|
+
# Append literalization of Time to SQL string.
|
|
1490
|
+
def literal_time_append(sql, v)
|
|
1491
|
+
sql << literal_time(v)
|
|
1492
|
+
end
|
|
1493
|
+
|
|
1494
|
+
# SQL fragment for true
|
|
1495
|
+
def literal_true
|
|
1496
|
+
"'t'"
|
|
1497
|
+
end
|
|
1498
|
+
|
|
1499
|
+
# What strategy to use for import/multi_insert. While SQL-92 defaults
|
|
1500
|
+
# to allowing multiple rows in a VALUES clause, there are enough databases
|
|
1501
|
+
# that don't allow that that it can't be the default. Use separate queries
|
|
1502
|
+
# by default, which works everywhere.
|
|
1503
|
+
def multi_insert_sql_strategy
|
|
1504
|
+
:separate
|
|
1505
|
+
end
|
|
1506
|
+
|
|
1507
|
+
|
|
1508
|
+
# Get the native function name given the emulated function name.
|
|
1509
|
+
def native_function_name(emulated_function)
|
|
1510
|
+
emulated_function
|
|
1511
|
+
end
|
|
1512
|
+
|
|
1513
|
+
# Returns a qualified column name (including a table name) if the column
|
|
1514
|
+
# name isn't already qualified.
|
|
1515
|
+
def qualified_column_name(column, table)
|
|
1516
|
+
if column.is_a?(Symbol)
|
|
1517
|
+
c_table, column, _ = split_symbol(column)
|
|
1518
|
+
unless c_table
|
|
1519
|
+
case table
|
|
1520
|
+
when Symbol
|
|
1521
|
+
schema, table, t_alias = split_symbol(table)
|
|
1522
|
+
t_alias ||= Sequel::SQL::QualifiedIdentifier.new(schema, table) if schema
|
|
1523
|
+
when Sequel::SQL::AliasedExpression
|
|
1524
|
+
t_alias = table.alias
|
|
1525
|
+
end
|
|
1526
|
+
c_table = t_alias || table
|
|
1527
|
+
end
|
|
1528
|
+
::Sequel::SQL::QualifiedIdentifier.new(c_table, column)
|
|
1529
|
+
else
|
|
1530
|
+
column
|
|
1531
|
+
end
|
|
1532
|
+
end
|
|
1533
|
+
|
|
1534
|
+
# Qualify the given expression to the given table.
|
|
1535
|
+
def qualified_expression(e, table)
|
|
1536
|
+
Qualifier.new(table).transform(e)
|
|
1537
|
+
end
|
|
1538
|
+
|
|
1539
|
+
def select_columns_sql(sql)
|
|
1540
|
+
sql << ' '
|
|
1541
|
+
column_list_append(sql, @opts[:select])
|
|
1542
|
+
end
|
|
1543
|
+
|
|
1544
|
+
def select_distinct_sql(sql)
|
|
1545
|
+
if distinct = @opts[:distinct]
|
|
1546
|
+
sql << " DISTINCT"
|
|
1547
|
+
unless distinct.empty?
|
|
1548
|
+
sql << " ON ("
|
|
1549
|
+
expression_list_append(sql, distinct)
|
|
1550
|
+
sql << ')'
|
|
1551
|
+
end
|
|
1552
|
+
end
|
|
1553
|
+
end
|
|
1554
|
+
|
|
1555
|
+
# Modify the sql to add a dataset to the via an EXCEPT, INTERSECT, or UNION clause.
|
|
1556
|
+
# This uses a subselect for the compound datasets used, because using parantheses doesn't
|
|
1557
|
+
# work on all databases.
|
|
1558
|
+
def select_compounds_sql(sql)
|
|
1559
|
+
return unless c = @opts[:compounds]
|
|
1560
|
+
c.each do |type, dataset, all|
|
|
1561
|
+
sql << ' ' << type.to_s.upcase
|
|
1562
|
+
sql << ' ALL' if all
|
|
1563
|
+
sql << ' '
|
|
1564
|
+
compound_dataset_sql_append(sql, dataset)
|
|
1565
|
+
end
|
|
1566
|
+
end
|
|
1567
|
+
|
|
1568
|
+
def select_from_sql(sql)
|
|
1569
|
+
if f = @opts[:from]
|
|
1570
|
+
sql << ' FROM '
|
|
1571
|
+
source_list_append(sql, f)
|
|
1572
|
+
elsif f = empty_from_sql
|
|
1573
|
+
sql << f
|
|
1574
|
+
end
|
|
1575
|
+
end
|
|
1576
|
+
|
|
1577
|
+
def select_group_sql(sql)
|
|
1578
|
+
if group = @opts[:group]
|
|
1579
|
+
sql << " GROUP BY "
|
|
1580
|
+
if go = @opts[:group_options]
|
|
1581
|
+
if go == :"grouping sets"
|
|
1582
|
+
sql << go.to_s.upcase << '('
|
|
1583
|
+
grouping_element_list_append(sql, group)
|
|
1584
|
+
sql << ')'
|
|
1585
|
+
elsif uses_with_rollup?
|
|
1586
|
+
expression_list_append(sql, group)
|
|
1587
|
+
sql << " WITH " << go.to_s.upcase
|
|
1588
|
+
else
|
|
1589
|
+
sql << go.to_s.upcase << '('
|
|
1590
|
+
expression_list_append(sql, group)
|
|
1591
|
+
sql << ')'
|
|
1592
|
+
end
|
|
1593
|
+
else
|
|
1594
|
+
expression_list_append(sql, group)
|
|
1595
|
+
end
|
|
1596
|
+
end
|
|
1597
|
+
end
|
|
1598
|
+
|
|
1599
|
+
def select_having_sql(sql)
|
|
1600
|
+
if having = @opts[:having]
|
|
1601
|
+
sql << " HAVING "
|
|
1602
|
+
literal_append(sql, having)
|
|
1603
|
+
end
|
|
1604
|
+
end
|
|
1605
|
+
|
|
1606
|
+
def select_join_sql(sql)
|
|
1607
|
+
if js = @opts[:join]
|
|
1608
|
+
js.each{|j| literal_append(sql, j)}
|
|
1609
|
+
end
|
|
1610
|
+
end
|
|
1611
|
+
|
|
1612
|
+
def select_limit_sql(sql)
|
|
1613
|
+
if l = @opts[:limit]
|
|
1614
|
+
sql << " LIMIT "
|
|
1615
|
+
literal_append(sql, l)
|
|
1616
|
+
if o = @opts[:offset]
|
|
1617
|
+
sql << " OFFSET "
|
|
1618
|
+
literal_append(sql, o)
|
|
1619
|
+
end
|
|
1620
|
+
elsif @opts[:offset]
|
|
1621
|
+
select_only_offset_sql(sql)
|
|
1622
|
+
end
|
|
1623
|
+
end
|
|
1624
|
+
|
|
1625
|
+
def select_lock_sql(sql)
|
|
1626
|
+
case l = @opts[:lock]
|
|
1627
|
+
when :update
|
|
1628
|
+
sql << ' FOR UPDATE'
|
|
1629
|
+
when String
|
|
1630
|
+
sql << ' ' << l
|
|
1631
|
+
end
|
|
1632
|
+
end
|
|
1633
|
+
|
|
1634
|
+
# Used only if there is an offset and no limit, making it easier to override
|
|
1635
|
+
# in the adapter, as many databases do not support just a plain offset with
|
|
1636
|
+
# no limit.
|
|
1637
|
+
def select_only_offset_sql(sql)
|
|
1638
|
+
sql << " OFFSET "
|
|
1639
|
+
literal_append(sql, @opts[:offset])
|
|
1640
|
+
end
|
|
1641
|
+
|
|
1642
|
+
def select_order_sql(sql)
|
|
1643
|
+
if o = @opts[:order]
|
|
1644
|
+
sql << " ORDER BY "
|
|
1645
|
+
expression_list_append(sql, o)
|
|
1646
|
+
end
|
|
1647
|
+
end
|
|
1648
|
+
alias delete_order_sql select_order_sql
|
|
1649
|
+
alias update_order_sql select_order_sql
|
|
1650
|
+
|
|
1651
|
+
def select_select_sql(sql)
|
|
1652
|
+
sql << 'SELECT'
|
|
1653
|
+
end
|
|
1654
|
+
|
|
1655
|
+
def select_where_sql(sql)
|
|
1656
|
+
if w = @opts[:where]
|
|
1657
|
+
sql << " WHERE "
|
|
1658
|
+
literal_append(sql, w)
|
|
1659
|
+
end
|
|
1660
|
+
end
|
|
1661
|
+
alias delete_where_sql select_where_sql
|
|
1662
|
+
alias update_where_sql select_where_sql
|
|
1663
|
+
|
|
1664
|
+
def select_window_sql(sql)
|
|
1665
|
+
if ws = @opts[:window]
|
|
1666
|
+
sql << " WINDOW "
|
|
1667
|
+
c = false
|
|
1668
|
+
co = ', '
|
|
1669
|
+
as = ' AS '
|
|
1670
|
+
ws.map do |name, window|
|
|
1671
|
+
sql << co if c
|
|
1672
|
+
literal_append(sql, name)
|
|
1673
|
+
sql << as
|
|
1674
|
+
literal_append(sql, window)
|
|
1675
|
+
c ||= true
|
|
1676
|
+
end
|
|
1677
|
+
end
|
|
1678
|
+
end
|
|
1679
|
+
|
|
1680
|
+
def select_with_sql(sql)
|
|
1681
|
+
return unless supports_cte?
|
|
1682
|
+
ctes = opts[:with]
|
|
1683
|
+
return if !ctes || ctes.empty?
|
|
1684
|
+
sql << select_with_sql_base
|
|
1685
|
+
c = false
|
|
1686
|
+
comma = ', '
|
|
1687
|
+
ctes.each do |cte|
|
|
1688
|
+
sql << comma if c
|
|
1689
|
+
select_with_sql_cte(sql, cte)
|
|
1690
|
+
c ||= true
|
|
1691
|
+
end
|
|
1692
|
+
sql << ' '
|
|
1693
|
+
end
|
|
1694
|
+
alias delete_with_sql select_with_sql
|
|
1695
|
+
alias insert_with_sql select_with_sql
|
|
1696
|
+
alias update_with_sql select_with_sql
|
|
1697
|
+
|
|
1698
|
+
def select_with_sql_base
|
|
1699
|
+
"WITH "
|
|
1700
|
+
end
|
|
1701
|
+
|
|
1702
|
+
def select_with_sql_cte(sql, cte)
|
|
1703
|
+
select_with_sql_prefix(sql, cte)
|
|
1704
|
+
literal_dataset_append(sql, cte[:dataset])
|
|
1705
|
+
end
|
|
1706
|
+
|
|
1707
|
+
def select_with_sql_prefix(sql, w)
|
|
1708
|
+
quote_identifier_append(sql, w[:name])
|
|
1709
|
+
if args = w[:args]
|
|
1710
|
+
sql << '('
|
|
1711
|
+
identifier_list_append(sql, args)
|
|
1712
|
+
sql << ')'
|
|
1713
|
+
end
|
|
1714
|
+
sql << ' AS '
|
|
1715
|
+
|
|
1716
|
+
case w[:materialized]
|
|
1717
|
+
when true
|
|
1718
|
+
sql << "MATERIALIZED "
|
|
1719
|
+
when false
|
|
1720
|
+
sql << "NOT MATERIALIZED "
|
|
1721
|
+
end
|
|
1722
|
+
end
|
|
1723
|
+
|
|
1724
|
+
# Whether the symbol cache should be skipped when literalizing the dataset
|
|
1725
|
+
def skip_symbol_cache?
|
|
1726
|
+
@opts[:skip_symbol_cache]
|
|
1727
|
+
end
|
|
1728
|
+
|
|
1729
|
+
# Append literalization of array of sources/tables to SQL string, raising an Error if there
|
|
1730
|
+
# are no sources.
|
|
1731
|
+
def source_list_append(sql, sources)
|
|
1732
|
+
raise(Error, 'No source specified for query') if sources.nil? || sources == []
|
|
1733
|
+
identifier_list_append(sql, sources)
|
|
1734
|
+
end
|
|
1735
|
+
|
|
1736
|
+
# Delegate to Sequel.split_symbol.
|
|
1737
|
+
def split_symbol(sym)
|
|
1738
|
+
Sequel.split_symbol(sym)
|
|
1739
|
+
end
|
|
1740
|
+
|
|
1741
|
+
# The string that is appended to to create the SQL query, the empty
|
|
1742
|
+
# string by default.
|
|
1743
|
+
def sql_string_origin
|
|
1744
|
+
String.new
|
|
1745
|
+
end
|
|
1746
|
+
|
|
1747
|
+
# The precision to use for SQLTime instances (time column values without dates).
|
|
1748
|
+
# Defaults to timestamp_precision.
|
|
1749
|
+
def sqltime_precision
|
|
1750
|
+
timestamp_precision
|
|
1751
|
+
end
|
|
1752
|
+
|
|
1753
|
+
# SQL to use if this dataset uses static SQL. Since static SQL
|
|
1754
|
+
# can be a PlaceholderLiteralString in addition to a String,
|
|
1755
|
+
# we literalize nonstrings. If there is an append_sql for this
|
|
1756
|
+
# dataset, append to that SQL instead of returning the value.
|
|
1757
|
+
def static_sql(sql)
|
|
1758
|
+
if append_sql = @opts[:append_sql]
|
|
1759
|
+
if sql.is_a?(String)
|
|
1760
|
+
append_sql << sql
|
|
1761
|
+
else
|
|
1762
|
+
literal_append(append_sql, sql)
|
|
1763
|
+
end
|
|
1764
|
+
else
|
|
1765
|
+
if sql.is_a?(String)
|
|
1766
|
+
sql
|
|
1767
|
+
else
|
|
1768
|
+
literal(sql)
|
|
1769
|
+
end
|
|
1770
|
+
end
|
|
1771
|
+
end
|
|
1772
|
+
|
|
1773
|
+
# Append literalization of the subselect to SQL string.
|
|
1774
|
+
def subselect_sql_append(sql, ds)
|
|
1775
|
+
sds = subselect_sql_dataset(sql, ds)
|
|
1776
|
+
subselect_sql_append_sql(sql, sds)
|
|
1777
|
+
unless sds.send(:cache_sql?)
|
|
1778
|
+
# If subquery dataset does not allow caching SQL,
|
|
1779
|
+
# then this dataset should not allow caching SQL.
|
|
1780
|
+
disable_sql_caching!
|
|
1781
|
+
end
|
|
1782
|
+
end
|
|
1783
|
+
|
|
1784
|
+
def subselect_sql_dataset(sql, ds)
|
|
1785
|
+
ds.clone(:append_sql=>sql)
|
|
1786
|
+
end
|
|
1787
|
+
|
|
1788
|
+
def subselect_sql_append_sql(sql, ds)
|
|
1789
|
+
ds.sql
|
|
1790
|
+
end
|
|
1791
|
+
|
|
1792
|
+
# The number of decimal digits of precision to use in timestamps.
|
|
1793
|
+
def timestamp_precision
|
|
1794
|
+
supports_timestamp_usecs? ? 6 : 0
|
|
1795
|
+
end
|
|
1796
|
+
|
|
1797
|
+
def update_table_sql(sql)
|
|
1798
|
+
sql << ' '
|
|
1799
|
+
source_list_append(sql, @opts[:from])
|
|
1800
|
+
select_join_sql(sql) if supports_modifying_joins?
|
|
1801
|
+
end
|
|
1802
|
+
|
|
1803
|
+
def update_set_sql(sql)
|
|
1804
|
+
sql << ' SET '
|
|
1805
|
+
values = @opts[:values]
|
|
1806
|
+
if values.is_a?(Hash)
|
|
1807
|
+
update_sql_values_hash(sql, values)
|
|
1808
|
+
else
|
|
1809
|
+
sql << values
|
|
1810
|
+
end
|
|
1811
|
+
end
|
|
1812
|
+
|
|
1813
|
+
def update_sql_values_hash(sql, values)
|
|
1814
|
+
c = false
|
|
1815
|
+
eq = ' = '
|
|
1816
|
+
values.each do |k, v|
|
|
1817
|
+
sql << ', ' if c
|
|
1818
|
+
if k.is_a?(String) && !k.is_a?(LiteralString)
|
|
1819
|
+
quote_identifier_append(sql, k)
|
|
1820
|
+
else
|
|
1821
|
+
literal_append(sql, k)
|
|
1822
|
+
end
|
|
1823
|
+
sql << eq
|
|
1824
|
+
literal_append(sql, v)
|
|
1825
|
+
c ||= true
|
|
1826
|
+
end
|
|
1827
|
+
end
|
|
1828
|
+
|
|
1829
|
+
def update_update_sql(sql)
|
|
1830
|
+
sql << 'UPDATE'
|
|
1831
|
+
end
|
|
1832
|
+
|
|
1833
|
+
def window_frame_boundary_sql_append(sql, boundary, direction)
|
|
1834
|
+
case boundary
|
|
1835
|
+
when :current
|
|
1836
|
+
sql << "CURRENT ROW"
|
|
1837
|
+
when :preceding
|
|
1838
|
+
sql << "UNBOUNDED PRECEDING"
|
|
1839
|
+
when :following
|
|
1840
|
+
sql << "UNBOUNDED FOLLOWING"
|
|
1841
|
+
else
|
|
1842
|
+
if boundary.is_a?(Array)
|
|
1843
|
+
offset, direction = boundary
|
|
1844
|
+
unless boundary.length == 2 && (direction == :preceding || direction == :following)
|
|
1845
|
+
raise Error, "invalid window :frame boundary (:start or :end) option: #{boundary.inspect}"
|
|
1846
|
+
end
|
|
1847
|
+
else
|
|
1848
|
+
offset = boundary
|
|
1849
|
+
end
|
|
1850
|
+
|
|
1851
|
+
case offset
|
|
1852
|
+
when Numeric, String, SQL::Cast
|
|
1853
|
+
# nothing
|
|
1854
|
+
else
|
|
1855
|
+
raise Error, "invalid window :frame boundary (:start or :end) option: #{boundary.inspect}"
|
|
1856
|
+
end
|
|
1857
|
+
|
|
1858
|
+
literal_append(sql, offset)
|
|
1859
|
+
sql << (direction == :preceding ? " PRECEDING" : " FOLLOWING")
|
|
1860
|
+
end
|
|
1861
|
+
end
|
|
1862
|
+
end
|
|
1863
|
+
end
|