{"record":{"id":"f68bb3094fe08992","repo":"mem0ai/mem0","slug":"payloads-and-vectors-must-have-the-same-length","errorCode":null,"errorMessage":"payloads and vectors must have the same length","messagePattern":"payloads and vectors must have the same length","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"mem0-ts/src/oss/src/vector_stores/oracledb.ts","lineNumber":580,"sourceCode":"      type: this.oracledb.DB_TYPE_VECTOR,\n      val: new Float32Array(vector),\n    };\n  }\n\n  private payloadBind(payload: Record<string, any>) {\n    return { type: this.oracledb.DB_TYPE_JSON, val: payload };\n  }\n\n  async insert(\n    vectors: number[][],\n    ids: string[],\n    payloads: Record<string, any>[],\n  ): Promise<void> {\n    if (ids.length !== vectors.length) {\n      throw new Error(\"ids and vectors must have the same length\");\n    }\n    if (payloads.length !== vectors.length) {\n      throw new Error(\"payloads and vectors must have the same length\");\n    }\n\n    if (vectors.length === 0) return;\n\n    await this.initialize();\n\n    await this.withConnection(async (connection) => {\n      await connection.executeMany(\n        `INSERT INTO ${this.collectionName} (id, vector, payload) VALUES (:id, :vector, :payload)`,\n        vectors.map((vector, i) => ({\n          id: ids[i],\n          vector: new Float32Array(vector),\n          payload: payloads[i] ?? {},\n        })) as BindParameters[],\n        {\n          bindDefs: {\n            id: { type: this.oracledb.DB_TYPE_VARCHAR, maxSize: 36 },\n            vector: { type: this.oracledb.DB_TYPE_VECTOR },","sourceCodeStart":562,"sourceCodeEnd":598,"githubUrl":"https://github.com/mem0ai/mem0/blob/001c235229be8795e3834520467bd0d661ed8f34/mem0-ts/src/oss/src/vector_stores/oracledb.ts#L562-L598","documentation":"The second arity guard in insert(): the payloads array must also be exactly as long as vectors, since each INSERT row binds one payload JSON per vector. As with ids, a mismatch means some rows would get undefined payloads, so it is rejected before touching the database.","triggerScenarios":"Calling insert(vectors, ids, payloads) where payloads were built per successfully-embedded item but vectors include failures, or vice versa; memory.add() paths that build payloads from metadata where some items lacked metadata and were skipped.","commonSituations":"Partial-failure ingestion loops that push to vectors on success but push to payloads only when metadata exists (or the reverse); mapping/filter steps applied to only one of the arrays; defaulting payloads to [] thinking it will be filled in.","solutions":["Construct payloads with a default ({}) for every item: items.map((i) => i.metadata ?? {}).","Keep id/vector/payload as row tuples through the whole pipeline and unzip only at insert time.","Add a pre-insert assertion covering all three arrays: equal lengths, non-zero unless intentionally empty.","Audit ingestion loops for pushes into one array inside conditionals that skip the others."],"exampleFix":"// before\nconst payloads = items.filter((i) => i.metadata).map((i) => i.metadata); // shorter than vectors\nawait store.insert(vectors, ids, payloads);\n\n// after\nawait store.insert(vectors, ids, items.map((i) => i.metadata ?? {}));","handlingStrategy":"validation","validationCode":"const payloads = items.map((i) => i.payload ?? {}); // guaranteed 1:1 with vectors\nif (payloads.length !== vectors.length) throw new RangeError('payload/vector mismatch');","typeGuard":null,"tryCatchPattern":"try { await store.insert(vectors, ids, payloads); } catch (e) { if (e instanceof Error && e.message.includes('payloads and vectors')) { /* default missing payloads to {} and re-align arrays */ } else throw e; }","preventionTips":["Default payload to {} instead of skipping items without metadata.","Push to id/vector/payload arrays together in the same loop iteration or not at all.","Wrap store.insert() in one helper that validates all three lengths."],"tags":["oracle","insert","batching","validation","invariant"],"backgroundTag":null,"analyzedSha":"001c235229be8795e3834520467bd0d661ed8f34","analyzedAt":"2026-08-15T01:55:42.685Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}