SQLite Forum

string concatenation issue in prepared statement
Login
There seems to be a limit to the use of bounded variables mixed with string concatenation operator. 
With "myvar" set to B:

>SELECT 'A' \|\| :myvar \|\| 'C'

returns 'AB'

whereas this:

>SELECT printf("A%sC",:myvar)

correctly returns ABC

I couldn't find anywhere in the doc an explanation for this limitation. I'm using sqlite shipped with iOS (14), called from swift 5.3.  



Full code (using swift, to be used in a XCTest) : 

```swift
func testSqliteConcat() {
        var db: OpaquePointer?
        guard sqlite3_open(dbUrl.path, &db) == SQLITE_OK else {
            return XCTFail()
        }
        var statement: OpaquePointer?
        /* */
        XCTAssertEqual(
            sqlite3_prepare_v2(db, """
                    SELECT 'A' || :myvar || 'C'
                """, -1, &statement, nil
            ),

            SQLITE_OK
        )

        /* query that works
         XCTAssertEqual(
             sqlite3_prepare_v2(db, """
                     SELECT printf("A%sC",:myvar)
                 """, -1, &statement, nil
             ),

             SQLITE_OK
         )
         */
        XCTAssertEqual("B".utf8CString.withUnsafeBufferPointer { (buffer) -> Int32 in
            return sqlite3_bind_text(
                statement,
                1,
                buffer.baseAddress,
                Int32(buffer.count),
                unsafeBitCast(-1, to: sqlite3_destructor_type.self)
            )
        }, SQLITE_OK)

        while sqlite3_step(statement) == SQLITE_ROW {
        guard let cString = sqlite3_column_text(statement, 0) else {
            XCTFail("no column result")
            return
        }
            print("result: ", String(cString:cString))
        }
    }
```