{"record":{"id":"3543d179255a589c","repo":"phalcon/cphalcon","slug":"returning-requires-at-least-one-column-or-3543d1","errorCode":null,"errorMessage":"RETURNING requires at least one column or '*'","messagePattern":"RETURNING requires at least one column or '\\*'","errorType":"exception","errorClass":"Phalcon\\Db\\Exceptions\\ReturningRequiresColumn","httpStatus":null,"severity":"error","filePath":"phalcon/Db/Dialect/Sqlite.zep","lineNumber":669,"sourceCode":"    /**\n     * Generates SQL to modify a column in a table\n     */\n    public function modifyColumn( string tableName,  string schemaName, <ColumnInterface> column, <ColumnInterface> currentColumn = null) -> string\n    {\n        throw new SqliteAlterColumnNotSupported();\n    }\n\n    /**\n     * Appends a `RETURNING` clause to the supplied INSERT/UPDATE/DELETE\n     * statement. Supported by SQLite 3.35+. Pass `[\"*\"]` for `RETURNING *`,\n     * or a list of column names.\n     */\n    public function returning( string sqlQuery,  array columns) -> string\n    {\n        var first;\n\n        if unlikely empty columns {\n            throw new ReturningRequiresColumn();\n        }\n\n        if count(columns) == 1 {\n            let first = (string) columns[0];\n\n            if first == \"*\" {\n                return sqlQuery . \" RETURNING *\";\n            }\n        }\n\n        return sqlQuery . \" RETURNING \" . this->getColumnList(columns);\n    }\n\n    /**\n     * SQLite cannot modify existing columns or add/drop foreign keys, primary\n     * keys, or check constraints through `ALTER TABLE`; those operations throw\n     * a dedicated `Sqlite*NotSupported` exception.\n     */","sourceCodeStart":651,"sourceCodeEnd":687,"githubUrl":"https://github.com/phalcon/cphalcon/blob/b7419de9cd0a8a3f48441ead84c9f8415d463e25/phalcon/Db/Dialect/Sqlite.zep#L651-L687","documentation":"Phalcon\\Db\\Dialect\\Sqlite::returning() appends a RETURNING clause (SQLite 3.35+) to an INSERT/UPDATE/DELETE statement and requires at least one column name or '*'. An empty array throws ReturningRequiresColumn because a bare RETURNING keyword is not valid SQL.","triggerScenarios":"Forwarding an optional list that defaulted to []: $dialect->returning($insert, $options['returning'] ?? []); wrappers that translate 'no columns selected' into an empty array; refactors that turned a null default into [].","commonSituations":"Optional RETURNING support behind a feature flag; query-builder wrappers that pass through caller-supplied column lists unchecked; code ported from dialects where the empty case was tolerated.","solutions":["Pass ['*'] when all columns are wanted: $dialect->returning($sql, ['*'])","Guard the call: only invoke returning() when count($columns) > 0","In your wrapper, normalize null/[] to ['*'] or skip the clause entirely"],"exampleFix":"// before\n$sql = $dialect->returning($insert, $options['returning'] ?? []);\n\n// after\n$cols = $options['returning'] ?? null;\n$sql  = empty($cols) ? $insert : $dialect->returning($insert, $cols);","handlingStrategy":"validation","validationCode":"$cols = $columns ?? [];\nif ([] !== $cols) {\n    $sql = $dialect->returning($sql, $cols);\n}\n// or, when the caller always wants values back: $dialect->returning($sql, ['*'])","typeGuard":null,"tryCatchPattern":"try {\n    $sql = $dialect->returning($insert, $columns);\n} catch (\\Phalcon\\Db\\Exceptions\\ReturningRequiresColumn $e) {\n    $sql = $dialect->returning($insert, ['*']);\n}","preventionTips":["Default optional RETURNING lists to ['*'], not []","Skip the clause when no columns are selected instead of passing an empty array","Verify the runtime SQLite is >= 3.35 before emitting RETURNING clauses"],"tags":["sqlite","phalcon-db","returning","dml","sqlite-3-35"],"backgroundTag":"empty-required-parameter","analyzedSha":"b7419de9cd0a8a3f48441ead84c9f8415d463e25","analyzedAt":"2026-08-21T06:21:18.811Z","schemaVersion":2},"datasetVersion":"2026-08-21T11:28:35.574Z"}