SQL: revise guidance around triggers and add ability to enable them

Previous guidance and code banned the use of SQLite triggers without
exception. The reasoning is the (unsubstantiated) claim that triggers
"increase the difficulty of reviewing and maintaining" SQL usage.

The guidance is updated to add nuance: misuse of triggers is bad, but
there are also appropriate ways to use triggers. If code/queries get a
lot simpler (to review, maintain, update, etc) with the use of triggers,
then they should be applied. Otherwise, steer clear.

A new DatabaseOptions field is introduced to allow enabling triggers.
We could just enable triggers by default, but making this a non-
default configuration aligns with the guidance to avoid triggers most
of the time, and increases the likelihood that the guidance will be
discovered and read.

IndexedDB's SQLite implementation is updated to enable triggers. IDB is
easily the most sophisticated client of //sql in Chromium (after WebSQL
has been disabled) by number of and complexity of queries. As a case
study of code that is better served by the use of triggers, IDB has
several paths for deleting a record (i.e. row in the records table),
which then has a cascading effect on some other SQLite tables:

1. records can be deleted explicitly, given a certain key range
2. records can be deleted by deleting or clearing the object store
   that they're in.
3. a record can be *updated* via Put(), which is equivalent to
   deleting the old row and inserting a new one (via Put())

In all cases, the table that tracks blob references must be updated, and
the table that holds blobs may also need to be updated depending on the
remaining references. This means that *multiple* additional queries
would need to be written for *each* of the above record deletion
pathways, as well as any future record deletion pathways that are added.
A pair of triggers greatly simplifies this process. (Note this is just
one example of the application of triggers in IDB code; there are more.)

Bug: 40253999
Change-Id: Id89dfe38bdc7648f0837fb002441478383c3706a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6657148
Reviewed-by: Abhishek Shanthkumar <abhishek.shanthkumar@microsoft.com>
Commit-Queue: Evan Stade <evanstade@microsoft.com>
Cr-Commit-Position: refs/heads/main@{#1478096}
5 files changed
tree: d020167ce32ad7a509f0ebb941d522bc6911cee0
  1. .github/
  2. android_webview/
  3. apps/
  4. ash/
  5. base/
  6. build/
  7. build_overrides/
  8. buildtools/
  9. cc/
  10. chrome/
  11. chromecast/
  12. chromeos/
  13. codelabs/
  14. components/
  15. content/
  16. crypto/
  17. dbus/
  18. device/
  19. docs/
  20. extensions/
  21. fuchsia_web/
  22. gin/
  23. google_apis/
  24. gpu/
  25. headless/
  26. infra/
  27. ios/
  28. ipc/
  29. media/
  30. mojo/
  31. native_client_sdk/
  32. net/
  33. pdf/
  34. ppapi/
  35. printing/
  36. remoting/
  37. rlz/
  38. sandbox/
  39. services/
  40. skia/
  41. sql/
  42. storage/
  43. styleguide/
  44. testing/
  45. third_party/
  46. tools/
  47. ui/
  48. url/
  49. webkit/
  50. .clang-format
  51. .clang-tidy
  52. .clangd
  53. .cursorignore
  54. .git-blame-ignore-revs
  55. .gitallowed
  56. .gitattributes
  57. .gitignore
  58. .gitmodules
  59. .gn
  60. .mailmap
  61. .rustfmt.toml
  62. .vpython3
  63. .yapfignore
  64. ATL_OWNERS
  65. AUTHORS
  66. BUILD.gn
  67. CODE_OF_CONDUCT.md
  68. codereview.settings
  69. CPPLINT.cfg
  70. CRYPTO_OWNERS
  71. DEPS
  72. DIR_METADATA
  73. LICENSE
  74. LICENSE.chromium_os
  75. OWNERS
  76. PRESUBMIT.py
  77. PRESUBMIT_test.py
  78. PRESUBMIT_test_mocks.py
  79. README.md
  80. SECURITY_OWNERS
  81. WATCHLISTS
README.md

Logo Chromium

Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.

The project's web site is https://www.chromium.org.

To check out the source code locally, don't use git clone! Instead, follow the instructions on how to get the code.

Documentation in the source is rooted in docs/README.md.

Learn how to Get Around the Chromium Source Code Directory Structure.

For historical reasons, there are some small top level directories. Now the guidance is that new top level directories are for product (e.g. Chrome, Android WebView, Ash). Even if these products have multiple executables, the code should be in subdirectories of the product.

If you found a bug, please file it at https://crbug.com/new.