// upsert vs insert

show t:flip`time`sym`price`qty!"PSFJ"$\:()              // simple table
t upsert(.z.p;`IPM;50f;15)                              // upsert a single row
count t                                                 // table is not changed
`t upsert(.z.p;`IPM;50f;15)                             // upsert in place
count t                                                 // table is modified

`t insert(.z.p;`IPM;50f;15)                             // insert in place
show t
// t insert(.z.p;`IPM;50f;15)                           // 'type error, insert cannot accept a table as left arg

// {x insert(.z.p;`IPM;50f;15)}0#t                      // can't use insert with a local variable
{x upsert(.z.p;`IPM;50f;15)}0#t                         // upsert can

show kt:1!flip`ID`time`sym`price`qty!"JPSFJ"$\:()       // keyed table
kt upsert(1;.z.p;`IPM;50f;15)
count kt
`kt upsert(1;.z.p;`IPM;50f;15)
`kt insert(2;.z.p;`IPM;50f;15)
show kt
// kt insert(2;.z.p;`IPM;50f;15)                        // same behaviour vs simple table

`kt upsert(1;.z.p;`NEW;75f;20)                          // upsert record with existing key overwrites old record
show kt
// `kt insert(2;.z.p;`NEW2;30f;75)                      // 'insert error

t:([]time:5?.z.p;sym:upper 5?`3;price:5?50f;qty:5?50)
`:t/ upsert .Q.en[`:.;t]                                // write to disk splayed, will create files
delete t from `.
show get`:t

t2:([]time:5?.z.p;sym:upper 5?`3;price:5?50f;qty:5?50)
`:t upsert .Q.en[`:.;]t2                                // upsert can append to disk
count get`:t