{"id":19358059,"url":"https://github.com/faveod/arel-extensions","last_synced_at":"2025-05-15T12:06:04.656Z","repository":{"id":10737934,"uuid":"66791150","full_name":"Faveod/arel-extensions","owner":"Faveod","description":"Extending Arel","archived":false,"fork":false,"pushed_at":"2025-02-11T11:12:58.000Z","size":1465,"stargazers_count":142,"open_issues_count":15,"forks_count":24,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-05-15T12:05:58.987Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Faveod.png","metadata":{"files":{"readme":"README.md","changelog":"NEWS.md","contributing":"CONTRIBUTING.md","funding":null,"license":"MIT-LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-08-28T21:15:11.000Z","updated_at":"2025-02-11T10:34:28.000Z","dependencies_parsed_at":"2024-12-15T12:00:35.369Z","dependency_job_id":"6e510a06-4bb0-48eb-afd9-2a0f1c8e2d9d","html_url":"https://github.com/Faveod/arel-extensions","commit_stats":{"total_commits":934,"total_committers":12,"mean_commits":77.83333333333333,"dds":0.5706638115631691,"last_synced_commit":"e3575aef4c65720954543819c8f85f324f45ba1a"},"previous_names":[],"tags_count":66,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Faveod%2Farel-extensions","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Faveod%2Farel-extensions/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Faveod%2Farel-extensions/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Faveod%2Farel-extensions/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Faveod","download_url":"https://codeload.github.com/Faveod/arel-extensions/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254337613,"owners_count":22054253,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-10T07:10:09.866Z","updated_at":"2025-05-15T12:05:59.633Z","avatar_url":"https://github.com/Faveod.png","language":"Ruby","readme":"# Arel Extensions\n\n![GitHub workflow](https://github.com/Faveod/arel-extensions/actions/workflows/ruby.yml/badge.svg)\n[![AppVeyor Build Status](https://img.shields.io/appveyor/ci/jdelporte/arel-extensions.svg?label=AppVeyor%20build)](https://ci.appveyor.com/project/jdelporte/arel-extensions)\n![](http://img.shields.io/badge/license-MIT-brightgreen.svg)\n\nGem: [![Latest Release](https://img.shields.io/gem/v/arel_extensions.svg)](https://rubygems.org/gems/arel_extensions)\n[![Gem](https://ruby-gem-downloads-badge.herokuapp.com/arel_extensions?type=total)](https://rubygems.org/gems/arel_extensions)\n[![Gem](https://ruby-gem-downloads-badge.herokuapp.com/arel_extensions?label=downloads-current-version)](https://rubygems.org/gems/arel_extensions)\n\nArel Extensions adds shortcuts, fixes and new ORM mappings (Ruby to SQL) to Arel.\nIt aims to ensure pure Ruby syntax for most usual cases.\nIt allows to use more advanced SQL functions for any supported RDBMS.\n\n\n## Requirements\n\nArel 6 (Rails 4) or Arel 7+ (Rails 5).\n[Arel Repository](http://github.com/rails/arel)\n\nor\n\nRails 6\n[Rails Repository](http://github.com/rails/rails)\n\n## Usage\n\nMost of the features will work just by adding the gem to your Gemfiles. To make sure to get all the features for any dbms, you should execute the next line as soon as you get your connection to your DB:\n\n```ruby\nArelExtensions::CommonSqlFunctions.new(ActiveRecord::Base.connection).add_sql_functions()\n```\n\nIt will add common SQL features in your DB to align ti with current routines. Technically, it will execute SQL scripts from init folder.\n\n\n## Examples\n\nIn the following examples\n`t` is an `Arel::Table` for table `my_table` (i.e., `t = Arel::Table.new('my_table')`).\n\n## Comparators\n\n```ruby\n(t[:date1] \u003e t[:date2]).to_sql # (same as (t[:date1].gt(t[:date2])).to_sql)\n# =\u003e my_table.date1 \u003e my_table.date2\n```\n\n```ruby\n(t[:nb] \u003e 42).to_sql # (same as (t[:nb].gt(42)).to_sql)\n# =\u003e my_table.nb \u003e 42\n```\n\nOther operators: \u003c, \u003e=, \u003c=, =~\n\n\n## Maths\n\nCurrently in Arel:\n```ruby\n(t[:nb] + 42).to_sql\n# =\u003e my_table.nb + 42\n```\n\nBut:\n```ruby\n(t[:nb].sum + 42).to_sql\n# =\u003e NoMethodError: undefined method `+' for #\u003cArel::Nodes::Sum\u003e\n```\n\nWith Arel Extensions:\n```ruby\n(t[:nb].sum + 42).to_sql\n# =\u003e SUM(my_table.nb) + 42\n```\n\nOther functions: ABS, RAND, ROUND, FLOOR, CEIL, FORMAT\n\nFor Example:\n```ruby\nt[:price].format_number(\"%07.2f €\",\"fr_FR\")\n# equivalent to 'sprintf(\"%07.2f €\",price)' plus locale management\n```\n\n## String operations\n\n```ruby\n(t[:name] + ' append').to_sql\n# =\u003e CONCAT(my_table.name, ' append')\n\n(t[:name].coalesce('default')).to_sql\n# =\u003e COALESCE(my_table.name, 'default')\n\n(t[:name].blank).to_sql\n# =\u003e TRIM(TRIM(TRIM(COALESCE(my_table.name, '')), '\\t'), '\\n') = ''\n\n(t[:name] =~ /\\A[a-d_]+/).to_sql\n# =\u003e my_table.name REGEXP '^[a-d_]+'\n```\n\nThe `replace` function supports string and regex patterns.\nFor instance\n\n```ruby\nt[:email].replace('@', ' at ').replace('.', ' dot ').to_sql\n# =\u003e REPLACE(REPLACE(`my_table`.`email`, '@', ' at '), '.', ' dot ')\n```\n\nCaptures are supported when using regex patterns.  The replace string may then reference the capture groups using `\\1`, `\\2`, etc.  For instance\n\n```ruby\nt[:email].replace(/^(.*)@(.*)$/, 'user: \\1, host: \\2').to_sql\n# =\u003e REGEXP_REPLACE(`my_table`.`email`, '(?-mix:^(.*)@(.*)$)', 'user: \\\\1, host: \\\\2')\n```\n\nOther functions: SOUNDEX, LENGTH, REPLACE, LOCATE, SUBSTRING, TRIM\n\n### String Array operations\n\n`t[:list]` is a classical varchar containing a comma separated list (`\"1,2,3,4\"`).\n\n```ruby\n(t[:list] \u0026 3).to_sql\n# =\u003e FIND_IN_SET('3', my_table.list)\n\n(t[:list] \u0026 [2,3]).to_sql\n# =\u003e FIND_IN_SET('2', my_table.list) OR FIND_IN_SET('3', my_table.list)\n```\n\n\n## Date \u0026 Time operations\n\n```ruby\n(t[:birthdate] + 10.years).to_sql\n# =\u003e ADDDATE(my_table.birthdate, INTERVAL 10 YEAR)\n\n((t[:birthdate] - Date.today) * -1).to_sql\n# =\u003e DATEDIFF(my_table.birthdate, '2017-01-01') * -1\n\nt[:birthdate].week.to_sql\n# =\u003e WEEK(my_table.birthdate)\n\nt[:birthdate].month.to_sql\n# =\u003e MONTH(my_table.birthdate)\n\nt[:birthdate].year.to_sql\n# =\u003e YEAR(my_table.birthdate)\n```\n\n### Datetime\n\n```ruby\n# datetime difference\nt[:birthdate] - Time.utc(2014, 3, 3, 12, 41, 18)\n\n# comparison\nt[:birthdate] \u003e= '2014-03-03 10:10:10'\n```\n\n### Format and Time Zone Conversion\n\n`format` has two forms:\n\n```ruby\nt[:birthdate].format('%Y-%m-%d').to_sql\n# =\u003e DATE_FORMAT(my_table.birthdate, '%Y-%m-%d')\n```\n\nWhich formats the datetime without any time zone conversion.\nThe second form accepts 2 kinds of values:\n\n1. String:\n\n```ruby\nt[:birthdate].format('%Y/%m/%d %H:%M:%S', 'posix/Pacific/Tahiti')\n# =\u003e DATE_FORMAT(CONVERT_TZ(CAST(my_table.birthdate AS datetime), 'UTC', 'posix/Pacific/Tahiti'), '%Y/%m/%d %H:%i:%S')                             ## MySQL\n# =\u003e TO_CHAR(CAST(my_table.birthdate AS timestamp with time zone) AT TIME ZONE 'UTC' AT TIME ZONE 'posix/Pacific/Tahiti', 'YYYY/MM/DD HH24:MI:SS') ## PostgreSQL\n# =\u003e CONVERT(datetime, my_table.birthdate) AT TIME ZONE 'UTC' AT TIME ZONE N'posix/Pacific/Tahiti'                                                 ## SQL Server (\u0026 truncated for clarity)\n#                                                                            ^^^^^^^^^^^^^^^^^^^^ 🚨 Invalid timezone for SQL Server. Explanation below.\n```\n\nwhich will convert the datetime field to the supplied time zone. This generally\nmeans that you're letting the RDBMS decide or infer what is the timezone of the\ncolumn before conversion to the supplied timezone.\n\n1. Hash of the form `{ src_time_zone =\u003e dst_time_zone }`:\n\n```ruby\nt[:birthdate].format('%Y/%m/%d %H:%M:%S', { 'posix/Europe/Paris' =\u003e 'posix/Pacific/Tahiti' })\n```\n\nwhich will explicitly indicate the original timestamp that should be considered\nby the RDBMS.\n\nWarning:\n\n- ⚠️ Time Zone names are specific to each RDBMS. While `PostgreSQL` and `MySQL`\n  have overlaping names (the ones prefixed with `posix`), you should always\n  read your vendor's documentation. `SQL Server` is a black sheep and has its\n  own conventions.\n- ⚠️ Daylight saving is managed by the RDBMS vendor. Choose the approptiate time\n  zone name that enforces proper daylight saving conversions.\n  - ☣️ Choosing `GMT+offset` will certainly bypass daylight saving computations.\n  - ☣️ Choosing abbreviate forms like `CET`, which stands for `Central European\n    Time` will behave differently on `PostgreSQL` and `MySQL`. Don't assume\n    uniform behavior, or even a _rational_ one.\n- ⚠️ Pay attention to the type of the `datetime` column you're working with. For\n  example, in Postgres, a `datetime` can be one of the following types:\n  1. `timestamp with time zone`\n  2. `timestamp without time zone`\n  In the first case, you don't need to supply a conversion hash because postgres\n  knows how to convert it to the desired time zone. However, if you do the same\n  for the second case, you might get surprises, especially if your Postgres\n  installation's default timezone is not `UTC`.\n- ⚠️ SQLite is not supported.\n- 🚨 Always test against your setup 🚨\n\n## Unions\n\n```ruby\n(t.where(t[:name].eq('str')) + t.where(t[:name].eq('test'))).to_sql\n# =\u003e (SELECT * FROM my_table WHERE name='str') UNION (SELECT * FROM my_table WHERE name='test')\n```\n\n## Case clause\n\nArel-extensions allows to use functions on case clause\n\n```ruby\nt[:name].when(\"smith\").then(1).when(\"doe\").then(2).else(0).sum.to_sql\n# =\u003e SUM(CASE \"my_table\".\"name\" WHEN 'smith' THEN 1 WHEN 'doe' THEN 2 ELSE 0 END)\n```\n\n## Cast Function\n\nArel-extensions allows to cast type on constants and attributes\n\n```ruby\nt[:id].cast('char').to_sql\n# =\u003e CAST(\"my_table\".\"id\" AS char)\n```\n\n\n## Stored Procedures and User-defined functions\n\nTo optimize queries, some classical functions are defined in databases missing any alternative native functions.\nExamples:\n- `FIND_IN_SET`\n\n## BULK INSERT / UPSERT\n\nArel Extensions improves InsertManager by adding bulk_insert method, which allows to insert multiple rows in one insert.\n\n\n```ruby\n@cols = ['id', 'name', 'comments', 'created_at']\n@data = [\n   \t[23, 'name1', \"sdfdsfdsfsdf\", '2016-01-01'],\n   \t[25, 'name2', \"sdfds234sfsdf\", '2016-01-01']\n]\n\ninsert_manager = Arel::InsertManager.new(User).into(User.arel_table)\ninsert_manager.bulk_insert(@cols, @data)\nUser.connection.execute(insert_manager.to_sql)\n```\n\n## New Arel Functions\n\n\u003ctable class=\"tg arel-functions\" style=\"font-size:80%\"\u003e\n  \u003cthead\u003e\n  \u003ctr\u003e\n    \u003cth\u003e\u003c/th\u003e\n    \u003cth class=\"tg-by3v\"\u003eFunction / Example\u003cbr/\u003eToSql\u003c/th\u003e\n    \u003cth class=\"tg-pjz5\"\u003eMySQL / MariaDB\u003c/th\u003e\n    \u003cth class=\"tg-pjz5\"\u003ePostgreSQL\u003c/th\u003e\n    \u003cth class=\"tg-pjz5\"\u003eSQLite\u003c/th\u003e\n    \u003cth class=\"tg-pjz5\"\u003eOracle\u003c/th\u003e\n    \u003cth class=\"tg-pjz5\"\u003eMS SQL\u003c/th\u003e\n    \u003cth class=\"tg-pjz5\"\u003eDB2\u003cbr/\u003e(not tested on real DB)\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n  \u003ctr\u003e\n    \u003cth class=\"tg-82sq\" rowspan=\"7\"\u003e\u003cdiv\u003eNumber functions\u003c/div\u003e\u003c/th\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eABS\u003cbr\u003ecolumn.abs\u003cbr\u003e\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eCEIL\u003cbr\u003ecolumn.ceil\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eCASE + CAST\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eCEILING()\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eCEILING()\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eFLOOR\u003cbr\u003ecolumn.floor\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eCASE + CAST\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003ePOSIX FORMATTING\u003cbr\u003ecolumn.format_number(\"$ %7.2f\",\"en_US\")\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ko\"\u003enot implemented\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eRAND\u003cbr\u003eArel.rand\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eRANDOM()\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003edbms_random.value()\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eROUND\u003cbr\u003ecolumn.round(precision = 0)\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eSUM / AVG / MIN / MAX + x\u003cbr\u003ecolumn.sum + 42\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth class=\"tg-ffjm\" rowspan=\"17\"\u003e\u003cdiv\u003eString functions\u003c/div\u003e\u003c/th\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eCONCAT\u003cbr\u003ecolumn + \"string\"\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003e ||\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003e+\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eFIND_IN_SET\u003cbr\u003ecolumn \u0026amp; (\"l\")\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-orpl\"\u003eRuby function\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eILIKE (in Arel6)\u003cbr/\u003ecolumn.imatches('%pattern')\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eLOWER() LIKE LOWER()\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eLOWER() LIKE LOWER()\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eLOWER() LIKE LOWER()\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eLOWER() LIKE LOWER()\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eLENGTH\u003cbr\u003ecolumn.length\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eLEN()\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eLOCATE\u003cbr\u003ecolumn.locate(\"string\")\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eINSTR() or Ruby function\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eCHARINDEX()\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eMatching Accent/Case Insensitive\u003cbr\u003ecolumn.ai_imatches('blah')\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eunaccent required\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003enot supported\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003e?\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eMatching Accent Insensitive\u003cbr\u003ecolumn.ai_matches('blah')\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003enot supported\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003enot supported\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003enot supported\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003enot supported\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003e?\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eMatching Case Insensitive\u003cbr\u003ecolumn.imatches('blah')\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003enot supported\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003e?\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eMatching Accent/Case Sensitive\u003cbr\u003ecolumn.smatches('blah')\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003enot supported\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003e?\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eNOT_REGEXP\u003cbr\u003ecolumn != \"pattern\"\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003cbr\u003e\u003c/td\u003e\n    \u003ctd class=\"tg-3oug\"\u003erequire pcre.so\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eNOT REGEXP_LIKE \u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eNOT LIKE\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eREGEXP\u003cbr\u003ecolumn =~ \"pattern\"\u003cbr\u003e\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-3oug\"\u003erequire pcre.so\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eREGEXP_LIKE\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eLIKE\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eREPLACE\u003cbr\u003ecolumn.replace(\"s\",\"X\")\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eREPLACE\u003cbr\u003ecolumn.replace(/re/,\"X\")\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eSOUNDEX\u003cbr\u003ecolumn.soundex\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-3oug\"\u003erequire fuzzystrmatch\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eSUBSTRING\u003cbr/\u003ecolumn[1..2]\u003cbr/\u003ecolumn.substring(1)\u003cbr/\u003ecolumn.substring(1, 1)\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eSUBSTR()\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eSUBSTR()\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eSUBSTR()\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eTRIM (leading)\u003cbr\u003ecolumn.trim(\"LEADING\",\"M\")\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eLTRIM()\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eLTRIM()\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eLTRIM()\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eTRIM (trailing)\u003cbr\u003ecolumn.trim(\"TRAILING\",\"g\")\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eRTRIM()\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eRTRIM()\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eRtrim()\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eTRIM (both)\u003cbr\u003ecolumn.trim(\"BOTH\",\"e\")\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eTRIM()\u003cbr\u003e\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eTRIM()\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eLTRIM(RTRIM())\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eTRIM()\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth class=\"tg-4rp9\" rowspan=\"6\"\u003e\u003cdiv\u003eDate functions\u003c/div\u003e\u003c/th\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eDATEADD\u003cbr\u003ecolumn + 2.year\u003cbr\u003e\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eDATE_ADD()\u003cbr\u003e\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003e+\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eDATEDIFF\u003cbr\u003ecolumn - date\u003cbr\u003e\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eDATEDIFF()\u003cbr\u003e\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eJULIANDAY() - JULIANDAY()\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003e -\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eDAY()\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eDAY\u003cbr\u003ecolumn.day\u003cbr\u003e\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eSTRFTIME()\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eMONTH\u003cbr\u003ecolumn.month\u003cbr\u003e\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eSTRFTIME()\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eWEEK\u003cbr\u003ecolumn.week\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eSTRFTIME()\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eYEAR\u003cbr\u003ecolumn.year\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eSTRFTIME()\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth class=\"tg-72dn\" rowspan=\"13\"\u003e\u003cdiv\u003eComparators functions\u003c/div\u003e\u003c/th\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eBLANK\u003cbr\u003ecolumn.blank\u003cbr\u003e\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eCOALESCE\u003cbr\u003ecolumn.coalesce(var)\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eCOALESCE_BLANK\u003cbr\u003ecolumn.coalesce_blank(var)\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eIF_PRESENT\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eISNULL\u003cbr\u003ecolumn.isnull()\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eIFNULL()\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"tg-j6lv\"\u003eNVC()\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eNOT_BLANK\u003cbr\u003ecolumn.not_blank\u003cbr\u003e\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003ePRESENT\u003cbr\u003ecolumn.present\u003cbr\u003ealias to NOT_BLANK\u003cbr\u003e\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003e==\u003cbr\u003ecolumn == integer\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003e!=\u003cbr\u003ecolumn != integer\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003e\u0026gt;\u003cbr\u003ecolumn \u0026gt; integer\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003e\u0026gt;=\u003cbr\u003ecolumn \u0026gt;= integer\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003e\u0026lt; \u003cbr\u003ecolumn \u0026lt; integer\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003e\u0026lt;=\u003cbr\u003ecolumn \u0026lt;= integer\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth class=\"tg-9hbo\" rowspan=\"2\"\u003e\u003cdiv\u003eBoolean \u003cbr/\u003e functions\u003c/div\u003e\u003c/th\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eOR ( ⋁ )\u003cbr\u003ecolumn.eq(var).⋁(column.eq(var))\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eAND ( ⋀ )\u003cbr\u003ecolumn.eq(var).⋀(column.eq(var))\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth class=\"bulk_insert\" rowspan=\"1\"\u003e\u003cdiv\u003eBulk \u003cbr/\u003e Insert\u003c/div\u003e\u003c/th\u003e\n    \u003ctd class=\"tg-yw4l\"\u003einsert_manager.bulk_insert(@cols, @data)\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e  \u003ctr\u003e\n    \u003cth class=\"set_operators\" rowspan=\"1\"\u003e\u003cdiv\u003eSet \u003cbr/\u003e Operators\u003c/div\u003e\u003c/th\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eUNION (+)\u003cbr/\u003equery + query\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e  \u003ctr\u003e\n    \u003cth class=\"set_operators\" rowspan=\"1\"\u003e\u003cdiv\u003eSet \u003cbr/\u003e Operators\u003c/div\u003e\u003c/th\u003e\n    \u003ctd class=\"tg-yw4l\"\u003eUNION ALL\u003cbr/\u003equery.union_all(query)\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n    \u003ctd class=\"ok\"\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n## Version Compatibility\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003eRuby\u003c/th\u003e \u003cth\u003eRails\u003c/th\u003e    \u003cth\u003eArel Extensions\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e3.1\u003c/td\u003e  \u003ctd\u003e6.1\u003c/td\u003e      \u003ctd\u003e2\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e3.0\u003c/td\u003e  \u003ctd\u003e6.1\u003c/td\u003e      \u003ctd\u003e2\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e2.7\u003c/td\u003e  \u003ctd\u003e6.1, 6.0\u003c/td\u003e \u003ctd\u003e2\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e2.5\u003c/td\u003e  \u003ctd\u003e6.1, 6.0\u003c/td\u003e \u003ctd\u003e2\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e2.5\u003c/td\u003e  \u003ctd\u003e5.2\u003c/td\u003e      \u003ctd\u003e1\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n","funding_links":[],"categories":["ORM/ODM Extensions"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffaveod%2Farel-extensions","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffaveod%2Farel-extensions","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffaveod%2Farel-extensions/lists"}