fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectly - #7371

Merged
kenjis merged 15 commits into
codeigniter4:developfrom
kenjis:fix-modifyColumn-SQLite3
Apr 27, 2023
Merged

fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectly#7371
kenjis merged 15 commits into
codeigniter4:developfrom
kenjis:fix-modifyColumn-SQLite3

Conversation

@kenjis

@kenjiskenjis commented Mar 23, 2023

Copy link
Copy Markdown
Member

Description
See #7302

  • The $forge->modifyColumn() has been fixed. Due to a bug, in previous versions, SQLite3/Postgres/SQLSRV might change NULL/NOT NULL unpredictably.
  • In previous versions, the OCI8 driver did not change NULL/NOT NULL when you don’t specify null value.
  • Now in all database drivers $forge->modifyColumn() always sets NULL when you don’t specify null value.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis changed the title fix: SQLite3 Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3] Forge::modifyColumn() changes NULL incorrectlyMar 23, 2023
@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Mar 23, 2023
@kenjis

Copy link
Copy Markdown
MemberAuthor

Because sanity-tests fail, we cannot run database-live-tests...

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 2 times, most recently from 6338612 to 156419aCompareMarch 23, 2023 06:02
@kenjis
kenjis marked this pull request as draft March 23, 2023 06:04
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 2 times, most recently from 6d2bfe1 to 89c4bc8CompareMarch 23, 2023 06:41
@kenjiskenjis mentioned this pull request Mar 23, 2023
5 tasks
@kenjis

Copy link
Copy Markdown
MemberAuthor

Okay. SQLite3 database-live-tests passed.
https://github.com/codeigniter4/CodeIgniter4/actions/runs/4497811722

$this->db->resetDataCache();

$col1 = $this->getMetaData('col1', 'forge_test_modify');
$this->assertTrue($col1->nullable); // Nullable if not specified.

@kenjiskenjisMar 23, 2023

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@codeigniter4/database-team Should this be false? What do you think?

Maybe different databases have different defaults when not specifying null or not null?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have also changed the behavior of other drivers to match the behavior of MySQL.

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 89c4bc8 to 7480fd5CompareMarch 23, 2023 08:11
@kenjis

kenjis commented Mar 23, 2023

Copy link
Copy Markdown
MemberAuthor

I didn't know but the following test passes on MySQL.

$this->forge->dropTable('forge_test_modify', true);
$this->forge->addField([
'col1' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
'col2' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
'col3' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
]);
$this->forge->createTable('forge_test_modify');
$this->forge->modifyColumn('forge_test_modify', [
'col1' => ['name' => 'new_name', 'type' => 'VARCHAR', 'constraint' => 1],
'col2' => ['type' => 'VARCHAR', 'constraint' => 1, 'null' => true],
'col3' => ['type' => 'VARCHAR', 'constraint' => 1, 'null' => false],
]);
$this->db->resetDataCache();
$col1 = $this->getMetaData('new_name', 'forge_test_modify');
$this->assertTrue($col1->nullable); // Nullable if not specified.$col2 = $this->getMetaData('col2', 'forge_test_modify');
$this->assertTrue($col2->nullable);
$col3 = $this->getMetaData('col3', 'forge_test_modify');
$this->assertFalse($col3->nullable);

Added notes in the docs: 3b8a428

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 3 times, most recently from 8068beb to 20cfb13CompareMarch 23, 2023 08:34
@kenjiskenjis added the database Issues or pull requests that affect the database layer label Mar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 20cfb13 to 16177e7CompareMarch 24, 2023 02:24
@kenjiskenjis changed the title fix: [SQLite3] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 07d4457 to 7e13c3aCompareMarch 24, 2023 02:55
@kenjiskenjis changed the title fix: [SQLite3][Postgres] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 4 times, most recently from 9c05b29 to e8e7a6bCompareMarch 24, 2023 04:20
@kenjiskenjis changed the title fix: [SQLite3][Postgres][SQLSRV] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 5c2f42f to 88c087cCompareMarch 24, 2023 06:52
@kenjiskenjis added the breaking change Pull requests that may break existing functionalities label Mar 24, 2023
@kenjiskenjis changed the title fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from e4be766 to 4653dffCompareMarch 24, 2023 07:45
@kenjis

Copy link
Copy Markdown
MemberAuthor

Rebased and add upgrade note.

@kenjis
kenjis marked this pull request as ready for review March 27, 2023 00:38
@kenjis

Copy link
Copy Markdown
MemberAuthor

@codeigniter4/database-team Please review.

@kenjis

Copy link
Copy Markdown
MemberAuthor

Any comment?

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would prefer someone DB to take a look too but the code makes sense and tests look good so I trust this is appropriate.

@kenjis

Copy link
Copy Markdown
MemberAuthor

I believe this code is okay. The issue is that this behavior is okay.

@michalsnmichalsn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that using:

null value

Could be a bit misleading, and some users may think they should define their table fields as null (at least for me). So, we could use something more specific.

Comment threaduser_guide_src/source/dbmgmt/forge.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/installation/upgrade_434.rst Outdated
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from bbbebf7 to 3b416c8CompareApril 26, 2023 23:03
@kenjis

Copy link
Copy Markdown
MemberAuthor

@michalsn Exactly! Applied your suggestions.

@kenjis
kenjis requested a review from michalsnApril 26, 2023 23:04
@kenjis
kenjis merged commit 90762f3 into codeigniter4:developApr 27, 2023
@kenjis
kenjis deleted the fix-modifyColumn-SQLite3 branch April 27, 2023 09:18
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking changePull requests that may break existing functionalitiesbugVerified issues on the current code behavior or pull requests that will fix themdatabaseIssues or pull requests that affect the database layer

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kenjis@michalsn@MGatner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectly - #7371

Merged
kenjis merged 15 commits into
codeigniter4:developfrom
kenjis:fix-modifyColumn-SQLite3
Apr 27, 2023
Merged

fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectly#7371
kenjis merged 15 commits into
codeigniter4:developfrom
kenjis:fix-modifyColumn-SQLite3

Conversation

@kenjis

@kenjiskenjis commented Mar 23, 2023

Copy link
Copy Markdown
Member

Description
See #7302

  • The $forge->modifyColumn() has been fixed. Due to a bug, in previous versions, SQLite3/Postgres/SQLSRV might change NULL/NOT NULL unpredictably.
  • In previous versions, the OCI8 driver did not change NULL/NOT NULL when you don’t specify null value.
  • Now in all database drivers $forge->modifyColumn() always sets NULL when you don’t specify null value.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis changed the title fix: SQLite3 Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3] Forge::modifyColumn() changes NULL incorrectlyMar 23, 2023
@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Mar 23, 2023
@kenjis

Copy link
Copy Markdown
MemberAuthor

Because sanity-tests fail, we cannot run database-live-tests...

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 2 times, most recently from 6338612 to 156419aCompareMarch 23, 2023 06:02
@kenjis
kenjis marked this pull request as draft March 23, 2023 06:04
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 2 times, most recently from 6d2bfe1 to 89c4bc8CompareMarch 23, 2023 06:41
@kenjiskenjis mentioned this pull request Mar 23, 2023
5 tasks
@kenjis

Copy link
Copy Markdown
MemberAuthor

Okay. SQLite3 database-live-tests passed.
https://github.com/codeigniter4/CodeIgniter4/actions/runs/4497811722

$this->db->resetDataCache();

$col1 = $this->getMetaData('col1', 'forge_test_modify');
$this->assertTrue($col1->nullable); // Nullable if not specified.

@kenjiskenjisMar 23, 2023

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@codeigniter4/database-team Should this be false? What do you think?

Maybe different databases have different defaults when not specifying null or not null?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have also changed the behavior of other drivers to match the behavior of MySQL.

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 89c4bc8 to 7480fd5CompareMarch 23, 2023 08:11
@kenjis

kenjis commented Mar 23, 2023

Copy link
Copy Markdown
MemberAuthor

I didn't know but the following test passes on MySQL.

$this->forge->dropTable('forge_test_modify', true);
$this->forge->addField([
'col1' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
'col2' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
'col3' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
]);
$this->forge->createTable('forge_test_modify');
$this->forge->modifyColumn('forge_test_modify', [
'col1' => ['name' => 'new_name', 'type' => 'VARCHAR', 'constraint' => 1],
'col2' => ['type' => 'VARCHAR', 'constraint' => 1, 'null' => true],
'col3' => ['type' => 'VARCHAR', 'constraint' => 1, 'null' => false],
]);
$this->db->resetDataCache();
$col1 = $this->getMetaData('new_name', 'forge_test_modify');
$this->assertTrue($col1->nullable); // Nullable if not specified.$col2 = $this->getMetaData('col2', 'forge_test_modify');
$this->assertTrue($col2->nullable);
$col3 = $this->getMetaData('col3', 'forge_test_modify');
$this->assertFalse($col3->nullable);

Added notes in the docs: 3b8a428

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 3 times, most recently from 8068beb to 20cfb13CompareMarch 23, 2023 08:34
@kenjiskenjis added the database Issues or pull requests that affect the database layer label Mar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 20cfb13 to 16177e7CompareMarch 24, 2023 02:24
@kenjiskenjis changed the title fix: [SQLite3] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 07d4457 to 7e13c3aCompareMarch 24, 2023 02:55
@kenjiskenjis changed the title fix: [SQLite3][Postgres] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 4 times, most recently from 9c05b29 to e8e7a6bCompareMarch 24, 2023 04:20
@kenjiskenjis changed the title fix: [SQLite3][Postgres][SQLSRV] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 5c2f42f to 88c087cCompareMarch 24, 2023 06:52
@kenjiskenjis added the breaking change Pull requests that may break existing functionalities label Mar 24, 2023
@kenjiskenjis changed the title fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from e4be766 to 4653dffCompareMarch 24, 2023 07:45
@kenjis

Copy link
Copy Markdown
MemberAuthor

Rebased and add upgrade note.

@kenjis
kenjis marked this pull request as ready for review March 27, 2023 00:38
@kenjis

Copy link
Copy Markdown
MemberAuthor

@codeigniter4/database-team Please review.

@kenjis

Copy link
Copy Markdown
MemberAuthor

Any comment?

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would prefer someone DB to take a look too but the code makes sense and tests look good so I trust this is appropriate.

@kenjis

Copy link
Copy Markdown
MemberAuthor

I believe this code is okay. The issue is that this behavior is okay.

@michalsnmichalsn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that using:

null value

Could be a bit misleading, and some users may think they should define their table fields as null (at least for me). So, we could use something more specific.

Comment threaduser_guide_src/source/dbmgmt/forge.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/installation/upgrade_434.rst Outdated
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from bbbebf7 to 3b416c8CompareApril 26, 2023 23:03
@kenjis

Copy link
Copy Markdown
MemberAuthor

@michalsn Exactly! Applied your suggestions.

@kenjis
kenjis requested a review from michalsnApril 26, 2023 23:04
@kenjis
kenjis merged commit 90762f3 into codeigniter4:developApr 27, 2023
@kenjis
kenjis deleted the fix-modifyColumn-SQLite3 branch April 27, 2023 09:18
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking changePull requests that may break existing functionalitiesbugVerified issues on the current code behavior or pull requests that will fix themdatabaseIssues or pull requests that affect the database layer

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kenjis@michalsn@MGatner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectly - #7371

Merged
kenjis merged 15 commits into
codeigniter4:developfrom
kenjis:fix-modifyColumn-SQLite3
Apr 27, 2023
Merged

fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectly#7371
kenjis merged 15 commits into
codeigniter4:developfrom
kenjis:fix-modifyColumn-SQLite3

Conversation

@kenjis

@kenjiskenjis commented Mar 23, 2023

Copy link
Copy Markdown
Member

Description
See #7302

  • The $forge->modifyColumn() has been fixed. Due to a bug, in previous versions, SQLite3/Postgres/SQLSRV might change NULL/NOT NULL unpredictably.
  • In previous versions, the OCI8 driver did not change NULL/NOT NULL when you don’t specify null value.
  • Now in all database drivers $forge->modifyColumn() always sets NULL when you don’t specify null value.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis changed the title fix: SQLite3 Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3] Forge::modifyColumn() changes NULL incorrectlyMar 23, 2023
@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Mar 23, 2023
@kenjis

Copy link
Copy Markdown
MemberAuthor

Because sanity-tests fail, we cannot run database-live-tests...

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 2 times, most recently from 6338612 to 156419aCompareMarch 23, 2023 06:02
@kenjis
kenjis marked this pull request as draft March 23, 2023 06:04
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 2 times, most recently from 6d2bfe1 to 89c4bc8CompareMarch 23, 2023 06:41
@kenjiskenjis mentioned this pull request Mar 23, 2023
5 tasks
@kenjis

Copy link
Copy Markdown
MemberAuthor

Okay. SQLite3 database-live-tests passed.
https://github.com/codeigniter4/CodeIgniter4/actions/runs/4497811722

$this->db->resetDataCache();

$col1 = $this->getMetaData('col1', 'forge_test_modify');
$this->assertTrue($col1->nullable); // Nullable if not specified.

@kenjiskenjisMar 23, 2023

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@codeigniter4/database-team Should this be false? What do you think?

Maybe different databases have different defaults when not specifying null or not null?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have also changed the behavior of other drivers to match the behavior of MySQL.

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 89c4bc8 to 7480fd5CompareMarch 23, 2023 08:11
@kenjis

kenjis commented Mar 23, 2023

Copy link
Copy Markdown
MemberAuthor

I didn't know but the following test passes on MySQL.

$this->forge->dropTable('forge_test_modify', true);
$this->forge->addField([
'col1' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
'col2' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
'col3' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
]);
$this->forge->createTable('forge_test_modify');
$this->forge->modifyColumn('forge_test_modify', [
'col1' => ['name' => 'new_name', 'type' => 'VARCHAR', 'constraint' => 1],
'col2' => ['type' => 'VARCHAR', 'constraint' => 1, 'null' => true],
'col3' => ['type' => 'VARCHAR', 'constraint' => 1, 'null' => false],
]);
$this->db->resetDataCache();
$col1 = $this->getMetaData('new_name', 'forge_test_modify');
$this->assertTrue($col1->nullable); // Nullable if not specified.$col2 = $this->getMetaData('col2', 'forge_test_modify');
$this->assertTrue($col2->nullable);
$col3 = $this->getMetaData('col3', 'forge_test_modify');
$this->assertFalse($col3->nullable);

Added notes in the docs: 3b8a428

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 3 times, most recently from 8068beb to 20cfb13CompareMarch 23, 2023 08:34
@kenjiskenjis added the database Issues or pull requests that affect the database layer label Mar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 20cfb13 to 16177e7CompareMarch 24, 2023 02:24
@kenjiskenjis changed the title fix: [SQLite3] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 07d4457 to 7e13c3aCompareMarch 24, 2023 02:55
@kenjiskenjis changed the title fix: [SQLite3][Postgres] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 4 times, most recently from 9c05b29 to e8e7a6bCompareMarch 24, 2023 04:20
@kenjiskenjis changed the title fix: [SQLite3][Postgres][SQLSRV] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 5c2f42f to 88c087cCompareMarch 24, 2023 06:52
@kenjiskenjis added the breaking change Pull requests that may break existing functionalities label Mar 24, 2023
@kenjiskenjis changed the title fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from e4be766 to 4653dffCompareMarch 24, 2023 07:45
@kenjis

Copy link
Copy Markdown
MemberAuthor

Rebased and add upgrade note.

@kenjis
kenjis marked this pull request as ready for review March 27, 2023 00:38
@kenjis

Copy link
Copy Markdown
MemberAuthor

@codeigniter4/database-team Please review.

@kenjis

Copy link
Copy Markdown
MemberAuthor

Any comment?

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would prefer someone DB to take a look too but the code makes sense and tests look good so I trust this is appropriate.

@kenjis

Copy link
Copy Markdown
MemberAuthor

I believe this code is okay. The issue is that this behavior is okay.

@michalsnmichalsn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that using:

null value

Could be a bit misleading, and some users may think they should define their table fields as null (at least for me). So, we could use something more specific.

Comment threaduser_guide_src/source/dbmgmt/forge.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/installation/upgrade_434.rst Outdated
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from bbbebf7 to 3b416c8CompareApril 26, 2023 23:03
@kenjis

Copy link
Copy Markdown
MemberAuthor

@michalsn Exactly! Applied your suggestions.

@kenjis
kenjis requested a review from michalsnApril 26, 2023 23:04
@kenjis
kenjis merged commit 90762f3 into codeigniter4:developApr 27, 2023
@kenjis
kenjis deleted the fix-modifyColumn-SQLite3 branch April 27, 2023 09:18
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking changePull requests that may break existing functionalitiesbugVerified issues on the current code behavior or pull requests that will fix themdatabaseIssues or pull requests that affect the database layer

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kenjis@michalsn@MGatner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectly - #7371

Merged
kenjis merged 15 commits into
codeigniter4:developfrom
kenjis:fix-modifyColumn-SQLite3
Apr 27, 2023
Merged

fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectly#7371
kenjis merged 15 commits into
codeigniter4:developfrom
kenjis:fix-modifyColumn-SQLite3

Conversation

@kenjis

@kenjiskenjis commented Mar 23, 2023

Copy link
Copy Markdown
Member

Description
See #7302

  • The $forge->modifyColumn() has been fixed. Due to a bug, in previous versions, SQLite3/Postgres/SQLSRV might change NULL/NOT NULL unpredictably.
  • In previous versions, the OCI8 driver did not change NULL/NOT NULL when you don’t specify null value.
  • Now in all database drivers $forge->modifyColumn() always sets NULL when you don’t specify null value.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis changed the title fix: SQLite3 Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3] Forge::modifyColumn() changes NULL incorrectlyMar 23, 2023
@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Mar 23, 2023
@kenjis

Copy link
Copy Markdown
MemberAuthor

Because sanity-tests fail, we cannot run database-live-tests...

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 2 times, most recently from 6338612 to 156419aCompareMarch 23, 2023 06:02
@kenjis
kenjis marked this pull request as draft March 23, 2023 06:04
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 2 times, most recently from 6d2bfe1 to 89c4bc8CompareMarch 23, 2023 06:41
@kenjiskenjis mentioned this pull request Mar 23, 2023
5 tasks
@kenjis

Copy link
Copy Markdown
MemberAuthor

Okay. SQLite3 database-live-tests passed.
https://github.com/codeigniter4/CodeIgniter4/actions/runs/4497811722

$this->db->resetDataCache();

$col1 = $this->getMetaData('col1', 'forge_test_modify');
$this->assertTrue($col1->nullable); // Nullable if not specified.

@kenjiskenjisMar 23, 2023

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@codeigniter4/database-team Should this be false? What do you think?

Maybe different databases have different defaults when not specifying null or not null?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have also changed the behavior of other drivers to match the behavior of MySQL.

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 89c4bc8 to 7480fd5CompareMarch 23, 2023 08:11
@kenjis

kenjis commented Mar 23, 2023

Copy link
Copy Markdown
MemberAuthor

I didn't know but the following test passes on MySQL.

$this->forge->dropTable('forge_test_modify', true);
$this->forge->addField([
'col1' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
'col2' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
'col3' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
]);
$this->forge->createTable('forge_test_modify');
$this->forge->modifyColumn('forge_test_modify', [
'col1' => ['name' => 'new_name', 'type' => 'VARCHAR', 'constraint' => 1],
'col2' => ['type' => 'VARCHAR', 'constraint' => 1, 'null' => true],
'col3' => ['type' => 'VARCHAR', 'constraint' => 1, 'null' => false],
]);
$this->db->resetDataCache();
$col1 = $this->getMetaData('new_name', 'forge_test_modify');
$this->assertTrue($col1->nullable); // Nullable if not specified.$col2 = $this->getMetaData('col2', 'forge_test_modify');
$this->assertTrue($col2->nullable);
$col3 = $this->getMetaData('col3', 'forge_test_modify');
$this->assertFalse($col3->nullable);

Added notes in the docs: 3b8a428

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 3 times, most recently from 8068beb to 20cfb13CompareMarch 23, 2023 08:34
@kenjiskenjis added the database Issues or pull requests that affect the database layer label Mar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 20cfb13 to 16177e7CompareMarch 24, 2023 02:24
@kenjiskenjis changed the title fix: [SQLite3] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 07d4457 to 7e13c3aCompareMarch 24, 2023 02:55
@kenjiskenjis changed the title fix: [SQLite3][Postgres] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 4 times, most recently from 9c05b29 to e8e7a6bCompareMarch 24, 2023 04:20
@kenjiskenjis changed the title fix: [SQLite3][Postgres][SQLSRV] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 5c2f42f to 88c087cCompareMarch 24, 2023 06:52
@kenjiskenjis added the breaking change Pull requests that may break existing functionalities label Mar 24, 2023
@kenjiskenjis changed the title fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from e4be766 to 4653dffCompareMarch 24, 2023 07:45
@kenjis

Copy link
Copy Markdown
MemberAuthor

Rebased and add upgrade note.

@kenjis
kenjis marked this pull request as ready for review March 27, 2023 00:38
@kenjis

Copy link
Copy Markdown
MemberAuthor

@codeigniter4/database-team Please review.

@kenjis

Copy link
Copy Markdown
MemberAuthor

Any comment?

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would prefer someone DB to take a look too but the code makes sense and tests look good so I trust this is appropriate.

@kenjis

Copy link
Copy Markdown
MemberAuthor

I believe this code is okay. The issue is that this behavior is okay.

@michalsnmichalsn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that using:

null value

Could be a bit misleading, and some users may think they should define their table fields as null (at least for me). So, we could use something more specific.

Comment threaduser_guide_src/source/dbmgmt/forge.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/installation/upgrade_434.rst Outdated
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from bbbebf7 to 3b416c8CompareApril 26, 2023 23:03
@kenjis

Copy link
Copy Markdown
MemberAuthor

@michalsn Exactly! Applied your suggestions.

@kenjis
kenjis requested a review from michalsnApril 26, 2023 23:04
@kenjis
kenjis merged commit 90762f3 into codeigniter4:developApr 27, 2023
@kenjis
kenjis deleted the fix-modifyColumn-SQLite3 branch April 27, 2023 09:18
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking changePull requests that may break existing functionalitiesbugVerified issues on the current code behavior or pull requests that will fix themdatabaseIssues or pull requests that affect the database layer

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kenjis@michalsn@MGatner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectly - #7371

Merged
kenjis merged 15 commits into
codeigniter4:developfrom
kenjis:fix-modifyColumn-SQLite3
Apr 27, 2023
Merged

fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectly#7371
kenjis merged 15 commits into
codeigniter4:developfrom
kenjis:fix-modifyColumn-SQLite3

Conversation

@kenjis

@kenjiskenjis commented Mar 23, 2023

Copy link
Copy Markdown
Member

Description
See #7302

  • The $forge->modifyColumn() has been fixed. Due to a bug, in previous versions, SQLite3/Postgres/SQLSRV might change NULL/NOT NULL unpredictably.
  • In previous versions, the OCI8 driver did not change NULL/NOT NULL when you don’t specify null value.
  • Now in all database drivers $forge->modifyColumn() always sets NULL when you don’t specify null value.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis changed the title fix: SQLite3 Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3] Forge::modifyColumn() changes NULL incorrectlyMar 23, 2023
@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Mar 23, 2023
@kenjis

Copy link
Copy Markdown
MemberAuthor

Because sanity-tests fail, we cannot run database-live-tests...

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 2 times, most recently from 6338612 to 156419aCompareMarch 23, 2023 06:02
@kenjis
kenjis marked this pull request as draft March 23, 2023 06:04
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 2 times, most recently from 6d2bfe1 to 89c4bc8CompareMarch 23, 2023 06:41
@kenjiskenjis mentioned this pull request Mar 23, 2023
5 tasks
@kenjis

Copy link
Copy Markdown
MemberAuthor

Okay. SQLite3 database-live-tests passed.
https://github.com/codeigniter4/CodeIgniter4/actions/runs/4497811722

$this->db->resetDataCache();

$col1 = $this->getMetaData('col1', 'forge_test_modify');
$this->assertTrue($col1->nullable); // Nullable if not specified.

@kenjiskenjisMar 23, 2023

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@codeigniter4/database-team Should this be false? What do you think?

Maybe different databases have different defaults when not specifying null or not null?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have also changed the behavior of other drivers to match the behavior of MySQL.

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 89c4bc8 to 7480fd5CompareMarch 23, 2023 08:11
@kenjis

kenjis commented Mar 23, 2023

Copy link
Copy Markdown
MemberAuthor

I didn't know but the following test passes on MySQL.

$this->forge->dropTable('forge_test_modify', true);
$this->forge->addField([
'col1' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
'col2' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
'col3' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
]);
$this->forge->createTable('forge_test_modify');
$this->forge->modifyColumn('forge_test_modify', [
'col1' => ['name' => 'new_name', 'type' => 'VARCHAR', 'constraint' => 1],
'col2' => ['type' => 'VARCHAR', 'constraint' => 1, 'null' => true],
'col3' => ['type' => 'VARCHAR', 'constraint' => 1, 'null' => false],
]);
$this->db->resetDataCache();
$col1 = $this->getMetaData('new_name', 'forge_test_modify');
$this->assertTrue($col1->nullable); // Nullable if not specified.$col2 = $this->getMetaData('col2', 'forge_test_modify');
$this->assertTrue($col2->nullable);
$col3 = $this->getMetaData('col3', 'forge_test_modify');
$this->assertFalse($col3->nullable);

Added notes in the docs: 3b8a428

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 3 times, most recently from 8068beb to 20cfb13CompareMarch 23, 2023 08:34
@kenjiskenjis added the database Issues or pull requests that affect the database layer label Mar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 20cfb13 to 16177e7CompareMarch 24, 2023 02:24
@kenjiskenjis changed the title fix: [SQLite3] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 07d4457 to 7e13c3aCompareMarch 24, 2023 02:55
@kenjiskenjis changed the title fix: [SQLite3][Postgres] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 4 times, most recently from 9c05b29 to e8e7a6bCompareMarch 24, 2023 04:20
@kenjiskenjis changed the title fix: [SQLite3][Postgres][SQLSRV] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 5c2f42f to 88c087cCompareMarch 24, 2023 06:52
@kenjiskenjis added the breaking change Pull requests that may break existing functionalities label Mar 24, 2023
@kenjiskenjis changed the title fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from e4be766 to 4653dffCompareMarch 24, 2023 07:45
@kenjis

Copy link
Copy Markdown
MemberAuthor

Rebased and add upgrade note.

@kenjis
kenjis marked this pull request as ready for review March 27, 2023 00:38
@kenjis

Copy link
Copy Markdown
MemberAuthor

@codeigniter4/database-team Please review.

@kenjis

Copy link
Copy Markdown
MemberAuthor

Any comment?

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would prefer someone DB to take a look too but the code makes sense and tests look good so I trust this is appropriate.

@kenjis

Copy link
Copy Markdown
MemberAuthor

I believe this code is okay. The issue is that this behavior is okay.

@michalsnmichalsn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that using:

null value

Could be a bit misleading, and some users may think they should define their table fields as null (at least for me). So, we could use something more specific.

Comment threaduser_guide_src/source/dbmgmt/forge.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/installation/upgrade_434.rst Outdated
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from bbbebf7 to 3b416c8CompareApril 26, 2023 23:03
@kenjis

Copy link
Copy Markdown
MemberAuthor

@michalsn Exactly! Applied your suggestions.

@kenjis
kenjis requested a review from michalsnApril 26, 2023 23:04
@kenjis
kenjis merged commit 90762f3 into codeigniter4:developApr 27, 2023
@kenjis
kenjis deleted the fix-modifyColumn-SQLite3 branch April 27, 2023 09:18
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking changePull requests that may break existing functionalitiesbugVerified issues on the current code behavior or pull requests that will fix themdatabaseIssues or pull requests that affect the database layer

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kenjis@michalsn@MGatner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectly - #7371

Merged
kenjis merged 15 commits into
codeigniter4:developfrom
kenjis:fix-modifyColumn-SQLite3
Apr 27, 2023
Merged

fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectly#7371
kenjis merged 15 commits into
codeigniter4:developfrom
kenjis:fix-modifyColumn-SQLite3

Conversation

@kenjis

@kenjiskenjis commented Mar 23, 2023

Copy link
Copy Markdown
Member

Description
See #7302

  • The $forge->modifyColumn() has been fixed. Due to a bug, in previous versions, SQLite3/Postgres/SQLSRV might change NULL/NOT NULL unpredictably.
  • In previous versions, the OCI8 driver did not change NULL/NOT NULL when you don’t specify null value.
  • Now in all database drivers $forge->modifyColumn() always sets NULL when you don’t specify null value.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis changed the title fix: SQLite3 Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3] Forge::modifyColumn() changes NULL incorrectlyMar 23, 2023
@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Mar 23, 2023
@kenjis

Copy link
Copy Markdown
MemberAuthor

Because sanity-tests fail, we cannot run database-live-tests...

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 2 times, most recently from 6338612 to 156419aCompareMarch 23, 2023 06:02
@kenjis
kenjis marked this pull request as draft March 23, 2023 06:04
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 2 times, most recently from 6d2bfe1 to 89c4bc8CompareMarch 23, 2023 06:41
@kenjiskenjis mentioned this pull request Mar 23, 2023
5 tasks
@kenjis

Copy link
Copy Markdown
MemberAuthor

Okay. SQLite3 database-live-tests passed.
https://github.com/codeigniter4/CodeIgniter4/actions/runs/4497811722

$this->db->resetDataCache();

$col1 = $this->getMetaData('col1', 'forge_test_modify');
$this->assertTrue($col1->nullable); // Nullable if not specified.

@kenjiskenjisMar 23, 2023

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@codeigniter4/database-team Should this be false? What do you think?

Maybe different databases have different defaults when not specifying null or not null?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have also changed the behavior of other drivers to match the behavior of MySQL.

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 89c4bc8 to 7480fd5CompareMarch 23, 2023 08:11
@kenjis

kenjis commented Mar 23, 2023

Copy link
Copy Markdown
MemberAuthor

I didn't know but the following test passes on MySQL.

$this->forge->dropTable('forge_test_modify', true);
$this->forge->addField([
'col1' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
'col2' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
'col3' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
]);
$this->forge->createTable('forge_test_modify');
$this->forge->modifyColumn('forge_test_modify', [
'col1' => ['name' => 'new_name', 'type' => 'VARCHAR', 'constraint' => 1],
'col2' => ['type' => 'VARCHAR', 'constraint' => 1, 'null' => true],
'col3' => ['type' => 'VARCHAR', 'constraint' => 1, 'null' => false],
]);
$this->db->resetDataCache();
$col1 = $this->getMetaData('new_name', 'forge_test_modify');
$this->assertTrue($col1->nullable); // Nullable if not specified.$col2 = $this->getMetaData('col2', 'forge_test_modify');
$this->assertTrue($col2->nullable);
$col3 = $this->getMetaData('col3', 'forge_test_modify');
$this->assertFalse($col3->nullable);

Added notes in the docs: 3b8a428

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 3 times, most recently from 8068beb to 20cfb13CompareMarch 23, 2023 08:34
@kenjiskenjis added the database Issues or pull requests that affect the database layer label Mar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 20cfb13 to 16177e7CompareMarch 24, 2023 02:24
@kenjiskenjis changed the title fix: [SQLite3] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 07d4457 to 7e13c3aCompareMarch 24, 2023 02:55
@kenjiskenjis changed the title fix: [SQLite3][Postgres] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 4 times, most recently from 9c05b29 to e8e7a6bCompareMarch 24, 2023 04:20
@kenjiskenjis changed the title fix: [SQLite3][Postgres][SQLSRV] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 5c2f42f to 88c087cCompareMarch 24, 2023 06:52
@kenjiskenjis added the breaking change Pull requests that may break existing functionalities label Mar 24, 2023
@kenjiskenjis changed the title fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from e4be766 to 4653dffCompareMarch 24, 2023 07:45
@kenjis

Copy link
Copy Markdown
MemberAuthor

Rebased and add upgrade note.

@kenjis
kenjis marked this pull request as ready for review March 27, 2023 00:38
@kenjis

Copy link
Copy Markdown
MemberAuthor

@codeigniter4/database-team Please review.

@kenjis

Copy link
Copy Markdown
MemberAuthor

Any comment?

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would prefer someone DB to take a look too but the code makes sense and tests look good so I trust this is appropriate.

@kenjis

Copy link
Copy Markdown
MemberAuthor

I believe this code is okay. The issue is that this behavior is okay.

@michalsnmichalsn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that using:

null value

Could be a bit misleading, and some users may think they should define their table fields as null (at least for me). So, we could use something more specific.

Comment threaduser_guide_src/source/dbmgmt/forge.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/installation/upgrade_434.rst Outdated
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from bbbebf7 to 3b416c8CompareApril 26, 2023 23:03
@kenjis

Copy link
Copy Markdown
MemberAuthor

@michalsn Exactly! Applied your suggestions.

@kenjis
kenjis requested a review from michalsnApril 26, 2023 23:04
@kenjis
kenjis merged commit 90762f3 into codeigniter4:developApr 27, 2023
@kenjis
kenjis deleted the fix-modifyColumn-SQLite3 branch April 27, 2023 09:18
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking changePull requests that may break existing functionalitiesbugVerified issues on the current code behavior or pull requests that will fix themdatabaseIssues or pull requests that affect the database layer

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kenjis@michalsn@MGatner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectly - #7371

Merged
kenjis merged 15 commits into
codeigniter4:developfrom
kenjis:fix-modifyColumn-SQLite3
Apr 27, 2023
Merged

fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectly#7371
kenjis merged 15 commits into
codeigniter4:developfrom
kenjis:fix-modifyColumn-SQLite3

Conversation

@kenjis

@kenjiskenjis commented Mar 23, 2023

Copy link
Copy Markdown
Member

Description
See #7302

  • The $forge->modifyColumn() has been fixed. Due to a bug, in previous versions, SQLite3/Postgres/SQLSRV might change NULL/NOT NULL unpredictably.
  • In previous versions, the OCI8 driver did not change NULL/NOT NULL when you don’t specify null value.
  • Now in all database drivers $forge->modifyColumn() always sets NULL when you don’t specify null value.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis changed the title fix: SQLite3 Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3] Forge::modifyColumn() changes NULL incorrectlyMar 23, 2023
@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Mar 23, 2023
@kenjis

Copy link
Copy Markdown
MemberAuthor

Because sanity-tests fail, we cannot run database-live-tests...

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 2 times, most recently from 6338612 to 156419aCompareMarch 23, 2023 06:02
@kenjis
kenjis marked this pull request as draft March 23, 2023 06:04
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 2 times, most recently from 6d2bfe1 to 89c4bc8CompareMarch 23, 2023 06:41
@kenjiskenjis mentioned this pull request Mar 23, 2023
5 tasks
@kenjis

Copy link
Copy Markdown
MemberAuthor

Okay. SQLite3 database-live-tests passed.
https://github.com/codeigniter4/CodeIgniter4/actions/runs/4497811722

$this->db->resetDataCache();

$col1 = $this->getMetaData('col1', 'forge_test_modify');
$this->assertTrue($col1->nullable); // Nullable if not specified.

@kenjiskenjisMar 23, 2023

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@codeigniter4/database-team Should this be false? What do you think?

Maybe different databases have different defaults when not specifying null or not null?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have also changed the behavior of other drivers to match the behavior of MySQL.

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 89c4bc8 to 7480fd5CompareMarch 23, 2023 08:11
@kenjis

kenjis commented Mar 23, 2023

Copy link
Copy Markdown
MemberAuthor

I didn't know but the following test passes on MySQL.

$this->forge->dropTable('forge_test_modify', true);
$this->forge->addField([
'col1' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
'col2' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
'col3' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
]);
$this->forge->createTable('forge_test_modify');
$this->forge->modifyColumn('forge_test_modify', [
'col1' => ['name' => 'new_name', 'type' => 'VARCHAR', 'constraint' => 1],
'col2' => ['type' => 'VARCHAR', 'constraint' => 1, 'null' => true],
'col3' => ['type' => 'VARCHAR', 'constraint' => 1, 'null' => false],
]);
$this->db->resetDataCache();
$col1 = $this->getMetaData('new_name', 'forge_test_modify');
$this->assertTrue($col1->nullable); // Nullable if not specified.$col2 = $this->getMetaData('col2', 'forge_test_modify');
$this->assertTrue($col2->nullable);
$col3 = $this->getMetaData('col3', 'forge_test_modify');
$this->assertFalse($col3->nullable);

Added notes in the docs: 3b8a428

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 3 times, most recently from 8068beb to 20cfb13CompareMarch 23, 2023 08:34
@kenjiskenjis added the database Issues or pull requests that affect the database layer label Mar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 20cfb13 to 16177e7CompareMarch 24, 2023 02:24
@kenjiskenjis changed the title fix: [SQLite3] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 07d4457 to 7e13c3aCompareMarch 24, 2023 02:55
@kenjiskenjis changed the title fix: [SQLite3][Postgres] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 4 times, most recently from 9c05b29 to e8e7a6bCompareMarch 24, 2023 04:20
@kenjiskenjis changed the title fix: [SQLite3][Postgres][SQLSRV] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 5c2f42f to 88c087cCompareMarch 24, 2023 06:52
@kenjiskenjis added the breaking change Pull requests that may break existing functionalities label Mar 24, 2023
@kenjiskenjis changed the title fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from e4be766 to 4653dffCompareMarch 24, 2023 07:45
@kenjis

Copy link
Copy Markdown
MemberAuthor

Rebased and add upgrade note.

@kenjis
kenjis marked this pull request as ready for review March 27, 2023 00:38
@kenjis

Copy link
Copy Markdown
MemberAuthor

@codeigniter4/database-team Please review.

@kenjis

Copy link
Copy Markdown
MemberAuthor

Any comment?

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would prefer someone DB to take a look too but the code makes sense and tests look good so I trust this is appropriate.

@kenjis

Copy link
Copy Markdown
MemberAuthor

I believe this code is okay. The issue is that this behavior is okay.

@michalsnmichalsn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that using:

null value

Could be a bit misleading, and some users may think they should define their table fields as null (at least for me). So, we could use something more specific.

Comment threaduser_guide_src/source/dbmgmt/forge.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/installation/upgrade_434.rst Outdated
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from bbbebf7 to 3b416c8CompareApril 26, 2023 23:03
@kenjis

Copy link
Copy Markdown
MemberAuthor

@michalsn Exactly! Applied your suggestions.

@kenjis
kenjis requested a review from michalsnApril 26, 2023 23:04
@kenjis
kenjis merged commit 90762f3 into codeigniter4:developApr 27, 2023
@kenjis
kenjis deleted the fix-modifyColumn-SQLite3 branch April 27, 2023 09:18
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking changePull requests that may break existing functionalitiesbugVerified issues on the current code behavior or pull requests that will fix themdatabaseIssues or pull requests that affect the database layer

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kenjis@michalsn@MGatner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectly - #7371

Merged
kenjis merged 15 commits into
codeigniter4:developfrom
kenjis:fix-modifyColumn-SQLite3
Apr 27, 2023
Merged

fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectly#7371
kenjis merged 15 commits into
codeigniter4:developfrom
kenjis:fix-modifyColumn-SQLite3

Conversation

@kenjis

@kenjiskenjis commented Mar 23, 2023

Copy link
Copy Markdown
Member

Description
See #7302

  • The $forge->modifyColumn() has been fixed. Due to a bug, in previous versions, SQLite3/Postgres/SQLSRV might change NULL/NOT NULL unpredictably.
  • In previous versions, the OCI8 driver did not change NULL/NOT NULL when you don’t specify null value.
  • Now in all database drivers $forge->modifyColumn() always sets NULL when you don’t specify null value.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@kenjiskenjis changed the title fix: SQLite3 Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3] Forge::modifyColumn() changes NULL incorrectlyMar 23, 2023
@kenjiskenjis added the bug Verified issues on the current code behavior or pull requests that will fix them label Mar 23, 2023
@kenjis

Copy link
Copy Markdown
MemberAuthor

Because sanity-tests fail, we cannot run database-live-tests...

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 2 times, most recently from 6338612 to 156419aCompareMarch 23, 2023 06:02
@kenjis
kenjis marked this pull request as draft March 23, 2023 06:04
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 2 times, most recently from 6d2bfe1 to 89c4bc8CompareMarch 23, 2023 06:41
@kenjiskenjis mentioned this pull request Mar 23, 2023
5 tasks
@kenjis

Copy link
Copy Markdown
MemberAuthor

Okay. SQLite3 database-live-tests passed.
https://github.com/codeigniter4/CodeIgniter4/actions/runs/4497811722

$this->db->resetDataCache();

$col1 = $this->getMetaData('col1', 'forge_test_modify');
$this->assertTrue($col1->nullable); // Nullable if not specified.

@kenjiskenjisMar 23, 2023

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@codeigniter4/database-team Should this be false? What do you think?

Maybe different databases have different defaults when not specifying null or not null?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have also changed the behavior of other drivers to match the behavior of MySQL.

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 89c4bc8 to 7480fd5CompareMarch 23, 2023 08:11
@kenjis

kenjis commented Mar 23, 2023

Copy link
Copy Markdown
MemberAuthor

I didn't know but the following test passes on MySQL.

$this->forge->dropTable('forge_test_modify', true);
$this->forge->addField([
'col1' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
'col2' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
'col3' => ['type' => 'VARCHAR', 'constraint' => 255, 'null' => false],
]);
$this->forge->createTable('forge_test_modify');
$this->forge->modifyColumn('forge_test_modify', [
'col1' => ['name' => 'new_name', 'type' => 'VARCHAR', 'constraint' => 1],
'col2' => ['type' => 'VARCHAR', 'constraint' => 1, 'null' => true],
'col3' => ['type' => 'VARCHAR', 'constraint' => 1, 'null' => false],
]);
$this->db->resetDataCache();
$col1 = $this->getMetaData('new_name', 'forge_test_modify');
$this->assertTrue($col1->nullable); // Nullable if not specified.$col2 = $this->getMetaData('col2', 'forge_test_modify');
$this->assertTrue($col2->nullable);
$col3 = $this->getMetaData('col3', 'forge_test_modify');
$this->assertFalse($col3->nullable);

Added notes in the docs: 3b8a428

@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 3 times, most recently from 8068beb to 20cfb13CompareMarch 23, 2023 08:34
@kenjiskenjis added the database Issues or pull requests that affect the database layer label Mar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 20cfb13 to 16177e7CompareMarch 24, 2023 02:24
@kenjiskenjis changed the title fix: [SQLite3] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 07d4457 to 7e13c3aCompareMarch 24, 2023 02:55
@kenjiskenjis changed the title fix: [SQLite3][Postgres] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch 4 times, most recently from 9c05b29 to e8e7a6bCompareMarch 24, 2023 04:20
@kenjiskenjis changed the title fix: [SQLite3][Postgres][SQLSRV] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from 5c2f42f to 88c087cCompareMarch 24, 2023 06:52
@kenjiskenjis added the breaking change Pull requests that may break existing functionalities label Mar 24, 2023
@kenjiskenjis changed the title fix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL incorrectlyfix: [SQLite3][Postgres][SQLSRV][OCI8] Forge::modifyColumn() changes NULL constraint incorrectlyMar 24, 2023
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from e4be766 to 4653dffCompareMarch 24, 2023 07:45
@kenjis

Copy link
Copy Markdown
MemberAuthor

Rebased and add upgrade note.

@kenjis
kenjis marked this pull request as ready for review March 27, 2023 00:38
@kenjis

Copy link
Copy Markdown
MemberAuthor

@codeigniter4/database-team Please review.

@kenjis

Copy link
Copy Markdown
MemberAuthor

Any comment?

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would prefer someone DB to take a look too but the code makes sense and tests look good so I trust this is appropriate.

@kenjis

Copy link
Copy Markdown
MemberAuthor

I believe this code is okay. The issue is that this behavior is okay.

@michalsnmichalsn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that using:

null value

Could be a bit misleading, and some users may think they should define their table fields as null (at least for me). So, we could use something more specific.

Comment threaduser_guide_src/source/dbmgmt/forge.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/changelogs/v4.3.4.rst Outdated
Comment threaduser_guide_src/source/installation/upgrade_434.rst Outdated
@kenjis
kenjisforce-pushed the fix-modifyColumn-SQLite3 branch from bbbebf7 to 3b416c8CompareApril 26, 2023 23:03
@kenjis

Copy link
Copy Markdown
MemberAuthor

@michalsn Exactly! Applied your suggestions.

@kenjis
kenjis requested a review from michalsnApril 26, 2023 23:04
@kenjis
kenjis merged commit 90762f3 into codeigniter4:developApr 27, 2023
@kenjis
kenjis deleted the fix-modifyColumn-SQLite3 branch April 27, 2023 09:18
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking changePull requests that may break existing functionalitiesbugVerified issues on the current code behavior or pull requests that will fix themdatabaseIssues or pull requests that affect the database layer

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kenjis@michalsn@MGatner