Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix typos in the pointer-passing document. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
2c7e1e0effbe02a2ca5cf410d08a9df9 |
User & Date: | drh 2017-07-24 15:15:06.845 |
Context
2017-07-24
| ||
15:19 | Add a couple of sentences to the pointer-passing document to try to clarify that the caller owns the passed pointers. (check-in: 74ab40f1f1 user: drh tags: trunk) | |
15:15 | Fix typos in the pointer-passing document. (check-in: 2c7e1e0eff user: drh tags: trunk) | |
14:17 | Update the performance graphs for version 3.20.0. (check-in: 5f75ab8f7e user: drh tags: trunk) | |
Changes
Changes to pages/bindptr.in.
︙ | ︙ | |||
49 50 51 52 53 54 55 | <p> The traditional way of communicating this information was to transform a C-language pointer into a BLOB or a 64-bit integer, then move that BLOB or integer through SQLite using the usual interfaces like [sqlite3_bind_blob()], [sqlite3_result_blob()], [sqlite3_value_blob()] or the integer equivalents. | | | 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | <p> The traditional way of communicating this information was to transform a C-language pointer into a BLOB or a 64-bit integer, then move that BLOB or integer through SQLite using the usual interfaces like [sqlite3_bind_blob()], [sqlite3_result_blob()], [sqlite3_value_blob()] or the integer equivalents. <h2>Upping The Threat Level</h2> <p> Passing around pointers as if they were integers or BLOBs is easy, effective, and works well in an environment where the application components are all friendly toward one another. However, passing pointers as integers and BLOBs allows hostile SQL text to forge invalid pointers that can carry out mischief. |
︙ | ︙ | |||
264 265 266 267 268 269 270 | the pointer type on the [sqlite3_value_pointer()] call, [sqlite3_value_pointer()] returns NULL in carray() and thus signals the CARRAY extension that it has been passed and invalid pointer. <p> Pointer types are static strings, which ideally should be string literals embedded directly in the SQLite API call, not parameters passed in from | | | 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 | the pointer type on the [sqlite3_value_pointer()] call, [sqlite3_value_pointer()] returns NULL in carray() and thus signals the CARRAY extension that it has been passed and invalid pointer. <p> Pointer types are static strings, which ideally should be string literals embedded directly in the SQLite API call, not parameters passed in from other functions. Consideration was given to using integer values as the pointer type, but static strings provides a much larger name space which reduces the chance of accidental type-name collisions between unrelated extensions. <p> Because pointer types must be static strings, and because string values in SQLite are dynamic strings, that means that SQL values cannot be used |
︙ | ︙ | |||
289 290 291 292 293 294 295 | [sqlite3_bind_pointer()], [sqlite3_result_pointer()], and [sqlite3_value_pointer()] interface are transient and ephemeral. The pointers are never written into the database. The pointers will not survive sorting. The latter fact is why there is no sqlite3_column_pointer() interface, since it is impossible to predict whether or not the query planner will insert a sort operating prior to returning a value from a query, so it would be impossible to | | | 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 | [sqlite3_bind_pointer()], [sqlite3_result_pointer()], and [sqlite3_value_pointer()] interface are transient and ephemeral. The pointers are never written into the database. The pointers will not survive sorting. The latter fact is why there is no sqlite3_column_pointer() interface, since it is impossible to predict whether or not the query planner will insert a sort operating prior to returning a value from a query, so it would be impossible to know if a pointer value inserted into a query by [sqlite3_bind_pointer()] or [sqlite3_result_pointer()] would survive through to the result set. <p> Pointer values must flow directly from their producer into their consumer, with no intermediate operators or functions. Any transformation of a pointer value destroys the pointer and transforms the value into |
︙ | ︙ |