What’s new in dbForge 2026.2: New PostgreSQL Debugger, visual editors, broader context for AI Assistant, and much more

https://www.devart.com/blog/wp-content/uploads/2026/08/dbforge-2026-2-release.jpg

Here comes dbForge 2026.2, a new release of our ever-evolving ecosystem of AI-powered database lifecycle management solutions—and it’s packed with useful updates you definitely shouldn’t miss! These include a brand-new embedded PostgreSQL Debugger in dbForge Studio, handy visual object editors for PostgreSQL, broader context awareness in dbForge AI Assistant, enhanced SQL development and schema comparison capabilities, and a new, simplified product activation flow. It’s all here to make the daily work of developers, architects, and analysts much easier.

Without further ado, let’s get started!

What’s in the box?

Embedded PostgreSQL Debugger in dbForge Studio

First and foremost, we’re glad to introduce a brand-new PostgreSQL Debugger in dbForge Studio. With its help, you will no longer need to scrutinize your code in order to find potential performance bottlenecks and other possible issues. The Debugger will help you do the following:

  • Set breakpoints in your code to pause the execution at specific lines
  • Step through code line by line to see how each line is executed
  • Monitor the current values of variables, expressions, and query results to analyze how data changes during the execution process
  • Handle exceptions by highlighting the exact line where the error occurs

One of the best things about our new PostgreSQL Debugger is that it’s integrated into dbForge Studio, so you won’t have to deal with any extensions or manual setups at all.

New visual object editors for PostgreSQL

The same dbForge Studio for PostgreSQL has received new visual object editors for event triggers, functions, and procedures. These editors eliminate the need to manage these objects with raw code, bringing the convenience of a visual interface into your daily operations.

You can invoke them in multiple ways:

  • On the Start Page, go to the Database Design tab > New Database Object
  • Go to the Database menu > New Database Object
  • Click the New Database Object icon on the application toolbar
  • In Database Explorer, double-click the required object to open it in the editor
  • In Database Explorer, create a new event trigger/function or open the existing one from the context menu

This is what the editor looks like for event triggers.

This is what the editor looks like for functions.

This is what the editor looks like for procedures.

Also note that dbForge Studio for PostgreSQL now lets you configure the default action performed when you double-click database objects in Database Explorer. Separate default actions can be set for tables and views, and for procedures and functions. You can do it in Tools > Options.

Broader context awareness in dbForge AI Assistant

Another key goal of this release was to make dbForge AI Assistant smarter and more flexible than ever, allowing you to tailor it to your workflows and standards as precisely as possible. To achieve this, your control over the context has been greatly expanded, most notably with the ability to attach files. For instance:

  • You can freely select to auto-attach your currently active document to the AI chat
  • You can attach ready-made files instead of manually copying SQL code into your prompts
  • You can provide the Assistant with sample code to help it learn your coding style and standards—and thus generate code that consistently adheres to them
  • You can attach two scripted databases and have the Assistant compare them
  • You can attach multiple databases to the same chat
  • Generally, you can give the Assistant any files (e.g., application code, database projects/diagrams, or custom instructions) as an additional source of context

Another useful addition to the AI Assistant is the ability to select an AI model to be used. Now you can configure it from the Tools menu > Options > AI Assistant > General. The available models include the following:

  • Anthropic: Claude Haiku 4.5, Claude Sonnet 4.6, Claude Sonnet 5
  • OpenAI: GPT-5.4, GPT-5.5

Free Express edition of dbForge AI Assistant

This release makes dbForge AI Assistant even more accessible by introducing a long-awaited free Express edition. It provides a limited number of tokens and 14-day storage of chat history, which is still a great way to explore the Assistant’s capabilities and try it out in your daily work.

In case you need more extensive AI assistance, with a considerably larger token allowance and unlimited chat history, you can upgrade to a paid plan at any moment.

SQL development enhancements

From now on, you can apply object and column name qualification to code that is already written. Previously, the qualification settings in Options > Text Editor > Code Completion > Advanced applied only while you typed. Now, the new refactoring command uses the same settings and qualifies names in an entire pre-written SQL document or a selected fragment of code.

We have also implemented wildcard expansion for all supported contexts, whether in the entire SQL document or in a selected fragment of code.

These enhancements have been implemented in dbForge SQL Complete and three dbForge Studios: for SQL Server, MySQL, and Oracle. And if you’re dealing with multiple database systems on different projects, you may want to try dbForge Edge, a suite of four Studios that works across a huge number of databases and cloud services.

Quick data generation from Database Explorer

If you need to generate data for a table (or several tables) quickly, just go to Database Explorer, right-click the required table(s), and select Generate Data from the shortcut menu. You will immediately proceed to configure your generation without any unnecessary steps.

New “Last modified” column in schema comparison documents and reports

Schema comparison documents, as well as all three types of comparison reports, now include a handy Last modified column.

This feature has been implemented across dbForge for SQL Server and dbForge for Oracle.

Support for MySQL 26.7 and MariaDB 13.x

Finally, all dbForge tools for MySQL are now seamlessly compatible with MySQL 26.7 and MariaDB 13.x.

Get your dbForge 2026.2 update today!

The update is already available, so you can open your dbForge product, proceed to Help > Check for Updates, and get your dbForge 2026.2 right away.

If you’re not a user of dbForge yet, we gladly invite you to download any product for a free trial and give it a go in your daily work.

For extra convenience, we have introduced product activation via a simple sign-in, now available alongside the traditional methods: entering an activation key and generating an activation request.

And, like we said previously, if you’re dealing with multiple database systems on different projects, you can try dbForge Edge, an AI-powered multidatabase solution that helps you cover the entire database lifecycle—including database design, development, management, and administration—across SQL Server, MySQL, MariaDB, Oracle, PostgreSQL, and a vast number of related database systems and cloud services.

Planet for the MySQL Community

Chart of Accounts Professional-grade, production-ready & double-entry Accounting module for Laravel

https://opengraph.githubassets.com/5f86d273fb5ea7c4aba684c9b835365d2cdc94c88444cbf16125197728d92098/alimarchal/laravel-chart-of-accounts-package

Laravel Chart of Accounts

Latest Version on Packagist
Total Downloads
License
PHP Version

Professional-grade, production-ready Chart of Accounts and double-entry Accounting module for Laravel.
One-command install. Works with Jetstream (Blade/Livewire) and Breeze (Inertia/React).

Author: Ali Raza Marchal — kh.marchal@gmail.com
Package: alimarchal/laravel-chart-of-accounts
Source: github.com/alimarchal/laravel-chart-of-accounts-package


Dimension Score Notes
Architecture 9.5/10 Clean service-layer, Actions pattern, no God classes
Double-Entry Correctness 10/10 Balance enforced at DB and application layer + UI
API Coverage 9/10 Full versioned REST API with Eloquent resources
Frontend Flexibility 10/10 Dual-stack: one env switch (ACCOUNTING_UI_DRIVER)
Reporting Depth 9/10 10 financial reports covering all standard statements
Security 9/10 Spatie Permission RBAC, route middleware, @can guards
Developer Experience 9.5/10 One-command install, JournalEntry::record() helper, Select2 UI
Test Coverage 8/10 Feature tests for posting, reversals, voids, edge cases
Documentation 9.5/10 Full README, CHANGELOG, PHPDoc, API examples

  • PHP ^8.2
  • Laravel ^10.0 | ^11.0 | ^12.0 | ^13.0

composer require alimarchal/laravel-chart-of-accounts

Blade/Livewire apps (Jetstream): add ACCOUNTING_UI_DRIVER=blade to .env before installing.
Inertia/React apps (Breeze): leave default (inertia).

php artisan accounting:install

accounting:install does automatically (11 steps):

  1. Publishes accounting migrations
  2. Publishes accounting config (config/accounting.php)
  3. Publishes Blade views (resources/views/vendor/accounting/)
  4. Publishes public assets — jQuery 3.5.1 + Select2 4.1.0 → public/vendor/accounting/
  5. Publishes spatie/laravel-permission migrations (if not present)
  6. Publishes spatie/laravel-activitylog migrations (if not present)
  7. Runs php artisan migrate
  8. Seeds all master data (account types, currencies, COA, permissions, tax codes, periods)
  9. Syncs database objects (stored procedures, views, triggers)
  10. Assigns super-admin role to first user
  11. Verifies the installation

After install — add HasRoles to your User model:

use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;
}

Available roles: super-admin (all), admin, accountant, viewer.


After composer update alimarchal/laravel-chart-of-accounts:

php artisan accounting:update

Re-publishes views, assets, config, JS; runs new migrations; syncs DB objects.


By default the package uses the /accounting/ URL prefix. To change it:

# .env
ACCOUNTING_ROUTE_PREFIX=settings        # URLs: /settings/journal-entries, /settings/reports/...
ACCOUNTING_ROUTE_NAME_PREFIX=accounting # Route names stay: accounting.dashboard, accounting.journal-entries.index

Route names stay as accounting.* regardless of the URL prefix, so views and redirects work without changes.

Settings-style routes example (used in our demo):

URL Route Name
/settings accounting.dashboard
/settings/journal-entries accounting.journal-entries.index
/settings/reports/general-ledger accounting.reports.general-ledger
/settings/chart-of-accounts accounting.chart-of-accounts.index
/settings/periods accounting.periods.index
/settings/users settings.users.index
/settings/roles settings.roles.index
/settings/permissions settings.permissions.index

Creating Journal Entries — Three Ways

1. Static Helper — JournalEntry::record()

The fastest way to create a balanced GL entry programmatically:

use Alimarchal\LaravelChartOfAccounts\Models\JournalEntry;

// Create a draft entry
$entry = JournalEntry::record(
    description: 'Office rent payment',
    debitAccountCode: '5101',   // Rent Expense
    creditAccountCode: '1101',  // Cash
    amount: 150000,
    post: false,                // save as draft
);

// Create and post immediately
$entry = JournalEntry::record(
    description: 'Salary payment — June 2026',
    debitAccountCode: '6101',   // Salaries Expense
    creditAccountCode: '1101',  // Cash
    amount: 500000,
    post: true,                 // post immediately
    reference: 'SAL-2026-06',
);

echo $entry->status;      // 'posted'
echo $entry->reference;   // 'SAL-2026-06'
echo $entry->id;          // auto-assigned ID

Parameters:

Parameter Type Required Description
description string Yes Human-readable transaction description
debitAccountCode string Yes Account code for the debit line (e.g. '6101')
creditAccountCode string Yes Account code for the credit line (e.g. '1101')
amount float Yes Amount — same value debited AND credited
post bool No true = post immediately, false = draft (default)
reference string|null No Optional voucher/invoice reference number

What it does automatically:

  • Resolves account codes to IDs via ChartOfAccount
  • Finds active base currency
  • Finds currently open accounting period
  • Creates entry header + two perfectly balanced lines
  • Optionally posts via JournalEntryService::post()
  • Wraps in a DB transaction

Returns: Fresh JournalEntry model.
Throws: ModelNotFoundException if account code or open period not found.


Create a draft entry:

POST /api/accounting/v1/journal-entries
Authorization: Bearer {token}
Content-Type: application/json

{
  "entry_date": "2026-06-04",
  "accounting_period_id": 1,
  "currency_id": 1,
  "fx_rate_to_base": 1,
  "reference": "SAL-2026-06",
  "description": "Salary payment June 2026",
  "lines": [
    { "chart_of_account_id": 42, "debit": 500000, "credit": 0, "description": "Salaries Expense" },
    { "chart_of_account_id": 11, "debit": 0, "credit": 500000, "description": "Cash" }
  ]
}

Post entry:

POST /api/accounting/v1/journal-entries/{id}/post
Authorization: Bearer {token}

Reverse entry:

POST /api/accounting/v1/journal-entries/{id}/reverse
Authorization: Bearer {token}
Content-Type: application/json

{ "description": "Reversal of SAL-2026-06" }

Void entry:

POST /api/accounting/v1/journal-entries/{id}/void
Authorization: Bearer {token}

List with filters:

GET /api/accounting/v1/journal-entries?filter[status]=posted&filter[entry_date_from]=2026-06-01&sort=-entry_date

3. Web UI (Blade/Livewire)

Visit /settings/journal-entries/create (or /accounting/journal-entries/create).

UI features:

  • All account and cost center dropdowns use Select2 with search
  • Real-time balance status badge (green = balanced, red = not balanced)
  • Save Draft button is disabled until debits = credits — prevents unbalanced saves
  • Live debit/credit totals update as you type

Base URL: /api/accounting/v1

Method Endpoint Description
GET/POST /account-types List / Create
GET/PUT/DELETE /account-types/{id} Show / Update / Delete
GET/POST /chart-of-accounts List / Create
GET/PUT/DELETE /chart-of-accounts/{id} Show / Update / Delete
GET/POST /currencies List / Create
GET /accounting-periods List periods
GET/POST /journal-entries List / Create
GET /journal-entries/{id} Show with lines
PUT /journal-entries/{id} Update draft
POST /journal-entries/{id}/post Post draft
POST /journal-entries/{id}/void Void
POST /journal-entries/{id}/reverse Reverse
GET/POST /reconciliations List / Create
GET /bank-accounts List
GET /cost-centers List
GET /tax-codes List
GET /tax-rates List
GET /account-balance-snapshots Period-end snapshots

All list endpoints support ?filter[field]=value, ?sort=field, ?page=N.


php artisan vendor:publish --tag=accounting-config
// config/accounting.php
return [
    'ui_driver'              => env('ACCOUNTING_UI_DRIVER', 'inertia'),   // 'inertia' or 'blade'
    'route_prefix'           => env('ACCOUNTING_ROUTE_PREFIX', 'accounting'),
    'route_name_prefix'      => env('ACCOUNTING_ROUTE_NAME_PREFIX', 'accounting'),
    'settings_route_prefix'  => env('SETTINGS_ROUTE_PREFIX', 'settings'),
    'api_prefix'             => env('ACCOUNTING_API_PREFIX', 'api/v1/accounting'),
    'middleware'             => ['web', 'auth'],
    'use_permissions'        => true,
    'defaults' => [
        'currency_code'                     => env('ACCOUNTING_BASE_CURRENCY', 'PKR'),
        'cash_account_code'                 => env('ACCOUNTING_CASH_ACCOUNT_CODE', '1101'),
        'bank_account_code'                 => env('ACCOUNTING_BANK_ACCOUNT_CODE', '1102'),
        'retained_earnings_account_code'    => env('ACCOUNTING_RETAINED_EARNINGS_ACCOUNT_CODE', '3101'),
        'rounding_account_code'             => env('ACCOUNTING_ROUNDING_ACCOUNT_CODE', '5201'),
    ],
];

Command Description
accounting:install Full setup: publish all assets, migrate, seed, sync, verify
accounting:update Re-publish assets + sync DB after package upgrade
accounting:seed Seed account types, currencies, COA, permissions, periods
accounting:sync-db-objects Sync database views, triggers, stored procedures
accounting:verify Verify accounting data integrity
accounting:health-check Run accounting health checks
accounting:rebuild-snapshots Rebuild account balance snapshots
accounting:close-fiscal-year Close the current fiscal year
accounting:close-period Close the current accounting period
accounting:open-period Open a new accounting period

Model Table Description
AccountType accounting_account_types Asset, Liability, Equity, Revenue, Expense
ChartOfAccount accounting_chart_of_accounts Hierarchical account tree
Currency accounting_currencies Currencies and exchange rates
AccountingPeriod accounting_periods Fiscal periods with open/close state
JournalEntry accounting_journal_entries Entry header (draft/posted/void/reversed)
JournalEntryLine accounting_journal_entry_lines Debit/credit lines
BankAccount accounting_bank_accounts Bank account register
Reconciliation accounting_reconciliations Bank reconciliation records
TaxCode accounting_tax_codes Tax code definitions
TaxRate accounting_tax_rates Tax rates per code
AccountingAuditLog accounting_audit_logs Full change audit trail
AccountBalanceSnapshot accounting_account_balance_snapshots Period-end snapshots
CostCenter accounting_cost_centers Departmental cost centers

Permission Description
accounting.view View all accounting screens
accounting.manage-settings Manage roles, users, periods
account-types.view/create/update/delete Account type CRUD
currencies.view/create/update/delete Currency CRUD
periods.view/create/update/delete/close/reopen Period management
chart-of-accounts.view/create/update/delete COA CRUD
cost-centers.view/create/update/delete Cost center CRUD
journal-entries.view/create/update/delete/post/reverse/void Journal entry workflow
bank-accounts.view/create/update/delete Bank account CRUD
reconciliations.view/create/update/delete Reconciliation CRUD
tax-codes.view/create/update/delete Tax code CRUD
tax-rates.view/create/update/delete Tax rate CRUD
account-balance-snapshots.view View balance snapshots
reports.*.view View individual reports (GL, TB, BS, IS, CF, AR, AP, BB, CB, AB)
audit-logs.view View audit trail
user.view/create/update/delete/assign-role/assign-permission User management

Roles: super-admin (all), admin, accountant, viewer.


All <select> elements use Select2 4.1.0 served from public/vendor/accounting/:

public/vendor/accounting/jquery.min.js       — jQuery 3.5.1
public/vendor/accounting/select2.min.js      — Select2 4.1.0
public/vendor/accounting/select2.min.css     — Select2 CSS

Falls back to CDN if assets not published.

Journal entry line dropdowns use Select2 with full Livewire compatibility:

  • Destroyed and re-initialized on every livewire:updated event
  • Native change event fired after Select2 selection to sync with Livewire state

To re-publish:

php artisan vendor:publish --tag=accounting-assets --force

Status Description
Draft Editable, not in balances
Posted Locked, balances updated, period must be open
Reversed Counter-entry with swapped debits/credits (GAAP method)
Voided Cancelled without counter-entry

Balance is enforced at three layers:

  1. UI — Save button disabled until balanced; real-time status badge
  2. Applicationsave() rejects if |debits − credits| ≥ 0.01
  3. ServiceJournalEntryService::post() validates before posting

Q: How do I change the URL from /accounting/ to /settings/?
A: Add ACCOUNTING_ROUTE_PREFIX=settings to .env. Route names stay accounting.* so no view changes needed.

Q: Does this work with Jetstream (Livewire)?
A: Yes. Set ACCOUNTING_UI_DRIVER=blade in .env before accounting:install.

Q: How do I update after a package upgrade?
A: Run php artisan accounting:update.

Q: Can I create GL entries without the UI?
A: Yes — use JournalEntry::record(description, debitCode, creditCode, amount, post: true).

Q: Why is the Save button disabled?
A: Debits and credits must be equal before saving. Enter matching amounts in the debit/credit columns.

Q: What is accounting:update?
A: Re-publishes views, assets, config with --force, runs new migrations, syncs DB objects. Run after every composer update.


See CHANGELOG.md for full version history.


MIT — see LICENSE.



laravel accounting · laravel chart of accounts · laravel double-entry bookkeeping ·
laravel journal entries · laravel general ledger · laravel trial balance ·
laravel balance sheet · laravel income statement · laravel cash flow ·
laravel bank reconciliation · laravel ERP · laravel GAAP · laravel IFRS ·
double entry bookkeeping php · accounting package for laravel · laravel COA ·
laravel multi-currency · laravel financial reports · laravel accounting module

Laravel News Links

Live Stream: Building a Social Network in PHP in 48 Hours

https://laravelnews.s3.amazonaws.com/featured-images/2026-09-22-social-network-php-48-hours.png

Live Stream: Building a Social Network in PHP in 48 Hours

Nuno Maduro, Brent Roose, and Matthieu Napoli spent two days at the JetBrains office building a full social network in PHP, and recorded all of it.


The post Live Stream: Building a Social Network in PHP in 48 Hours appeared first on Laravel News.

Join the Laravel Newsletter to get all the latest
Laravel articles like this directly in your inbox.

Laravel News

On JSONPath in MariaDB and MySQL

JSONPath is a part of SQL Standard. MySQL and MariaDB support a subset of it: “lax mode” only, no support for predicates, etc. But even the lax mode implementation has behavior different from the standard: MDEV-40746: JSON Path computation doesn’t do lax mode unboxing. The same non-standard behavior can be observed in MariaDB, MySQL, and […]Planet for the MySQL Community

Postgres follows the SQL standard for UPDATE statements, unlike MySQL

https://static.dolthub.com/blogimages/Blog_shared_SQL_engine.png/108b51e0eecbd3a4058aea1b377c5923f3f5be2dccdbcbc9c5d0c58e6e0d415d.webp

Doltgres, the world’s first version-controlled Postgres-compatible database,
just hit 1.0, meaning that it’s ready for
production use. We want Doltgres to be a drop-in replacement for Postgres so that customers can use
the entire ecosystem of Postgres-compatible tools and libraries, or port their existing database
application to Doltgres without changing any code. This means getting all the nuanced semantics of
Postgres’s behavior correct in our emulation. And we think we’ve done pretty well here — our
compatibility tests encompass over two dozen tools and
languages
.

But Doltgres shares the same SQL engine Dolt uses, which was built to emulate MySQL semantics. For
most queries this works fine, but MySQL plays famously fast and loose with the SQL standard, while
Postgres takes it much more seriously. And because we take client compatibility very, very
seriously, that means that we need an engine that reproduces all of MySQL’s wacky non-standard
behavior
for Dolt and
Postgres’s dignified, correct behavior for Doltgres.

Today’s blog is a case study of one area where the engine’s behavior differs to match the emulation
target, and a look under the hood for how we manage these differences internally in our interfaces.

UPDATE with column values from the same row#

This issue was brought to our attention by an
early adopter customer: Doltgres had the wrong behavior when an UPDATE statement referenced table
columns in its update expressions.

CREATE TABLE t_seq (a int, b int);
INSERT INTO t_seq VALUES (1, 0);
UPDATE t_seq SET a = 2, b = CASE WHEN a = 1 THEN 100 ELSE -1 END;
SELECT a, b FROM t_seq;

The SQL standard says that an UPDATE statement that references column values should use the value
from the pre-update row, in all cases. So the SELECT query in the above block should return this:

 a | b
---+-----
 2 | 100 -- per the SQL standard, every assignment reads the pre-update row

But MySQL doesn’t behave this way for an UPDATE. It ignores the SQL standard and uses the new,
updated column values in every UPDATE expression as it executes them one by one, left to right, on
each row. So in MySQL, and Dolt, the above select returns this:

 a | b
---+-----
 2 | -1 -- the CASE saw the NEW value of a (=2)

And until earlier this week, Doltgres behaved this way too. But that’s wrong, and breaks client
expectations for Postgres application developers. We needed to change this behavior in the engine,
but only when running in Postgres emulation mode.

How do we do that?

Introducing engine overrides#

During development of Doltgres, we experimented with a lot of different mechanisms to vary the
engine’s behavior for Doltgres, either to reflect needed differences for Postgres compatibility or
to implement features that MySQL doesn’t have. These include new rules during query analysis, new
plan nodes that wrap or otherwise alter existing ones, as well as more hacky fixes like swapping
function pointers during program init. For something like this divergence in behavior, there wasn’t
an existing extension point in the query engine. We designed the
engine
to make the database
backend swappable, as well as some of the query planning logic. But for something as fundamental as
applying updates to a row, we had not bothered to make the behavior pluggable.

Our current approach in this kind of situation is to provide the engine with a set of well-defined
behavioral extension points at construction. Unlike the interfaces that define tables, databases,
functions, etc. that allow integrators to implement a custom database storage backend, these
extension points alter the query-time behavior of the engine itself, independent of the storage
backend. They’re currently stored in a struct called EngineOverrides. To solve this particular
problem, we introduced the new UpdateExpressionApplier interface at the bottom of the struct.

type EngineOverrides struct {
	// Builder contains functions and variables that can replace, supplement, or override functionality within the builder.
	Builder BuilderOverrides
	// SchemaFormatter is the formatter for schema string creation. If nil, this will format in MySQL's style.
	SchemaFormatter SchemaFormatter
	// Hooks contain various hooks that are called within a statement's lifecycle.
	Hooks ExecutionHooks
	// CostedIndexScanExpressionFilter is used to walk expression trees in order to apply index scans based on
	// filter expressions. Some expressions may need to be modified or skipped in order to properly apply indexes
	// for all integrators.
	CostedIndexScanExpressionFilter ExpressionTreeFilter
	// UpdateExpressionApplier evaluates UPDATE assignments. If nil, the engine uses
	// MySQL's sequential assignment evaluation and IGNORE conversion handling.
	UpdateExpressionApplier UpdateExpressionApplier
}

The new interface looks like this:

// UpdateExpressionApplier evaluates the assignments for a row in an UPDATE statement.
// It does not apply to procedural SET or INSERT ON DUPLICATE KEY UPDATE statements.
type UpdateExpressionApplier interface {
	ApplyRowUpdate(ctx *Context, updateExprs *UpdateExprs, tableSchema Schema, oldRow Row, ignore bool) (Row, error)
}

For MySQL behavior, we have a simple interface that applies updates the same way it always has
(matching MySQL, not Postgres). For Doltgres, we implemented a new one that we plug in at engine
construction time.

func (UpdateExpressionApplier) ApplyRowUpdate(ctx *sql.Context, updateExprs *sql.UpdateExprs, tableSchema sql.Schema, oldRow sql.Row, _ bool) (sql.Row, error) {
	newRow := oldRow.Copy()
	for _, expr := range updateExprs.ExplicitUpdateExprs() {
	assignment, ok := expr.(*gmsexpression.SetField)
	if !ok {
	return nil, fmt.Errorf("UPDATE: expected SetField, found %T", expr)
	}
	// SetField performs assignment conversion and returns a copy of oldRow.
	// Merge only its target, so later assignments cannot undo earlier writes.
	value, err := assignment.Eval(ctx, oldRow)
	if err != nil {
	return nil, err
	}
	...
}

Now Doltgres returns the expected result, the same as Postgres.

a | b
---+-----
2 | 100 -- per the SQL standard, every assignment reads the pre-update row

Check out these two
PRs for the full details.

Conclusion#

Doltgres 1.0 already launched, but Doltgres’s compatibility story is definitely not over. Keep the
issues coming and we’ll keep knocking them down in 24
hours
.

Have a divergence in Postgres behavior to report? Want to learn more about Doltgres? Visit us on the
DoltHub Discord where our engineering team hangs out all day. Hope
to see you there.

Planet for the MySQL Community

Five Things to Try in MySQL Workbench 26.7

With MySQL Workbench 26.7, we introduced a new generation of MySQL Workbench, built on updated technology and on the MySQL Shell foundation. Alfredo Kojima’s post, Introducing MySQL Workbench 26, provides a great overview of the new architecture and the capabilities available in this release. Rather than repeat that overview, I wanted to share a few things […]Planet MySQL

Life Hack: Avoid Leaving Your Wallet At Home By Sitting It Next To Your Katana

https://media.babylonbee.com/articles/6aa43dce484a66aa43dce484a7.jpg

Don’t you just hate it when you’re out buying Pokémon cards, only to discover that you left your wallet at home? Well, with an exciting new life hack, you’ll never forget your wallet again.

To avoid the hassle and embarrassment that result from leaving your wallet at home, try sitting it next to your katana. You never forget to leave home without your trusty katana, so when you gear up to leave the house, your wallet will be right there waiting for you. It works every time!

All you have to do is find a nice, convenient place for your katana that also has a spot for your wallet. And for an extra tip, try engraving your katana with a helpful message. "Don’t forget your wallet!" It’s helpful for you, and for your enemies who will need that extra cash to pay the boatman for passage to cross the River Styx.

You’re always going to need your katana with you, so it just makes sense to keep all your daily essentials together. Wallet, keys, phone, Tamagotchi. If you keep everything with your katana, you’ll never be disappointed.

Start today by letting your honor for your katana protect you from leaving your wallet behind ever again.


The Babylon Bee finally exposes everything about the Jews in this documentary of hard-hitting investigative journalism.

Babylon Bee

Introducing MySQL Workbench 26

https://blogs.oracle.com/mysql/wp-content/uploads/sites/102/2026/08/workbench-announce.png

The MySQL team at Oracle is excited to announce MySQL Workbench 26.7, the first of a new generation of the GUI administration and development tool for MySQL.

A New Workbench

MySQL Workbench 8 has served the community well, but it’s now old and has reached end of life. Its architecture, built on C++ and platform specific front-ends for Windows, macOS and Linux, has become increasingly difficult to extend and maintain.

MySQL Workbench 26 obsoletes MySQL Workbench 8.0. If you’re still running the old Workbench, now is the time to make the switch. MySQL Workbench 8.0 is no longer maintained and will have no new releases.

In order to better focus our efforts, the MySQL Shell for VS Code extension is discontinued as well.

Its capabilities are being carried forward into the new Workbench.

Built on MySQL Shell

The biggest change under the hood: the new Workbench is a desktop application built on top of MySQL Shell, using modern web frameworks and ElectronJS. Rather than reinventing core database functionality, Workbench now leverages the same battle-tested engine that powers MySQL Shell’s extensive scripting and admin capabilities.

From this shared foundation we get:

  • Functional consistency between the CLI (MySQL Shell) and the desktop app
  • Faster iteration on new features across the whole toolchain
  • A modern, HTML and JavaScript based UI that’s easier to theme, extend, and maintain

Server Compatibility

MySQL Workbench 26.7 supports MySQL 8.4 LTS and newer, MySQL 9.7 LTS, the latest MySQL 26.7 and innovation releases in between.

MySQL 8.0 and older EOL versions of MySQL may work, but are not officially supported. YMMV.

As with MySQL Shell, and unlike the MySQL server, MySQL Workbench follows a single version series model. This means there is a single latest version of MySQL Workbench, which is backwards compatible and supports all currently supported versions of the MySQL server. Users are recommended to always use the latest version.

What’s New (and What’s Coming)

The new Workbench ships with many of the features you already know from Workbench 8.0, alongside new capabilities enabled by the MySQL Shell foundation.

Development

SQL Script Editor – the traditional SQL script editor, with full or step-by-step execution, syntax highlighting, code-completion, result viewer and editor view and more

SQL Notebooks — a new, notebook-style way of working with SQL, mixing queries, results, and notes in a single interactive document

Updated Visual Explain — a redesigned graphical representation of query execution plans, supporting new MySQL features like the hyper-graph optimizer and HeatWave query plans

SQL Formatter — automatically clean up and reformat SQL into a more readable format

Auto-completion – SQL completion now supports expanding table and object names, @@variable names and more

Administration

Server Status and Overview — an at-a-glance view of your server’s status and configuration

Performance Reports — including slow query analysis, memory usage, and database size reporting

User and Grants Management — create, edit, and audit users and privileges through a visual interface

MySQL Enterprise Backup integration, for creating, scheduling and restoring full and incremental MySQL backups

Client Connection Browser – view active MySQL client connections and dig down into what they’re doing. Inspect locks that they’re blocked on waiting or locks they’re holding themselves

Cloud Migration

HeatWave Migration Assistant — a guided, wizard-driven UI for migrating on-premises and cloud (AWS RDS, Aurora etc) databases to OCI, taking you step by step through the process of moving your data to MySQL HeatWave

Because this is a from-the-ground-up rebuild, the new Workbench is in active development. Some features found in Workbench 8 may not be available yet but the team is working to bring them to you as quickly as we can, along with entirely new functionality that wasn’t possible before.

In the following weeks we’ll be publishing more detailed posts on individual features. In the meantime, we encourage you to try the new Workbench, see what’s there today, and let us know what matters most to you as we prioritize the roadmap.

Open Source and Built to Extend

MySQL Workbench 26.7 is open source, and it’s been designed from the start to be easy to extend. Whether you want to add a new panel, integrate with another tool, or customize a workflow, the new architecture makes that far more approachable than it ever was in the old codebase.

Get Involved

This is a community effort, and we want you in it. Whether that means filing issues, contributing code, testing early features, or just telling us what you’d like to see next. Check out the project repository, join the discussion, and help shape where MySQL Workbench goes from here.

Downloads and More

Download MySQL Workbench 26.7 packages for Windows, macOS and Linux

Bugs and Feature Suggestions

File bugs and feature suggestions at https://bugs.mysql.com or the GitHub project issues page

Show me the code

Source code for Workbench and Shell plugins can be found at GitHub, as well as MySQL Shell sources.

Planet for the MySQL Community

Zippo Tool Kit Mod

https://theawesomer.com/photos/2026/09/zippo_tool_kit_t.jpg

Zippo Tool Kit Mod

Tiny Tool Shop shows off a cool use for a Zippo lighter. Their 3D-printed insert replaces the lighter’s guts with a tool storage tray. It holds a micro ratchet and extension, along with two driver bits. They’ve got links to buy the individual items on YouTube, and plan to post an STL file for DIYers. If you like tiny tools, their MOD-GRID system is worth checking out.

The Awesomer