Addons/data/sqlite/Nulls

From J Wiki
Jump to navigation Jump to search
Overview | Basic Usage | Create | Definitions | zFns | Installation | Nulls | Examples | Quirks

User-defined nulls were added in v1.0.23.

Null values

To allow for nulls in data, the addon defines three "null value" globals in the psqlite locale. These are set whenever a database is opened. The default values are as follows, where the integer null is the largest possible negative integer:

SQLITE_NULL_INTEGER=: _2147483648            NB. J32
SQLITE_NULL_INTEGER=: _9223372036854775808   NB. J64
SQLITE_NULL_FLOAT=: __
SQLITE_NULL_TEXT=: 'NULL'                    NB. used for text and blob

For example, create a table:

   load 'data/sqlite/sqlitez'
   dbcreate jpath '~temp/test.db'
   dbcmd 'create table tab (a int,b float,c text, d blob)'
   t=. 'one';'two'
   s=. t;<t rplc each <'o',{.a.
   dbinsert 'tab';(;:'a b c d');<1 2;3.1 5.4;s
   dbreads 'tab'
β”Œβ”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”
β”‚aβ”‚b  β”‚c  β”‚d  β”‚
β”œβ”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€
β”‚1β”‚3.1β”‚oneβ”‚ neβ”‚
β”‚2β”‚5.4β”‚twoβ”‚tw β”‚
β””β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”˜

Now update the second row with a command to set SQL nulls, and then insert a new row using J nulls:

   dbcmd 'update tab set a=NULL,b=NULL,c=NULL,d=NULL where rowid=2'
   dat=. SQLITE_NULL_INTEGER;SQLITE_NULL_FLOAT;;~SQLITE_NULL_TEXT
   dbinsert 'tab';(;/'abcd');<dat

The read shows the null rows:

   dbreads 'tab'
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”
β”‚a                   β”‚b  β”‚c   β”‚d   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€
β”‚                   1β”‚3.1β”‚one β”‚ ne β”‚
β”‚_9223372036854775808β”‚ __β”‚NULLβ”‚NULLβ”‚
β”‚_9223372036854775808β”‚ __β”‚NULLβ”‚NULLβ”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”˜

Changing null values

Try a different set of J nulls. Note that this does not change the nulls in the database, but just the null values used by J:

   dbclose''
   SQLITE_NULL_INTEGER_psqlite_=: 23
   SQLITE_NULL_FLOAT_psqlite_=: 234.56
   SQLITE_NULL_TEXT_psqlite_=: 'Nullah'
   dbopen jpath '~temp/test.db'
   dbreads 'tab'
β”Œβ”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”
β”‚a β”‚b     β”‚c     β”‚d     β”‚
β”œβ”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€
β”‚ 1β”‚   3.1β”‚one   β”‚ ne   β”‚
β”‚23β”‚234.56β”‚Nullahβ”‚Nullahβ”‚
β”‚23β”‚234.56β”‚Nullahβ”‚Nullahβ”‚
β””β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”˜

Restore J default nulls by reloading sqlite:

   dbclose ''
   load 'data/sqlite/sqlitez'
   dbopen jpath '~temp/test.db'
   dbreads 'tab'
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”
β”‚a                   β”‚b  β”‚c   β”‚d   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”Όβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€
β”‚                   1β”‚3.1β”‚one β”‚ ne β”‚
β”‚_9223372036854775808β”‚ __β”‚NULLβ”‚NULLβ”‚
β”‚_9223372036854775808β”‚ __β”‚NULLβ”‚NULLβ”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”˜