InariSystems opened a new issue, #2671:
URL: https://github.com/apache/arrow-adbc/issues/2671

   ### What feature or improvement would you like to see?
   
   Within sqlite, according to the documentation, user defined functions (UDFs) 
are connection-specific:
   
   >  If an application uses more than one database connection then 
application-defined SQL functions must be added to each database connection 
separately.
   
   [source](https://www.sqlite.org/c3ref/create_function.html)
   
   As such, for any system using adbc's sqlite driver, if a UDF is to be used, 
currently there's no method, as far as I can see, of being able to register a 
UDF. To do so, the underlying sqlite3 class structure would need to be 
accessed, which doesn't seem to exist at current. 
   
   To showcase this, you can look to the example code below where you can see a 
failure. To explain the code beforehand, a Database is created in memory, and a 
connection to that database is shared between a sqlite3 connection, and an 
adbc-sqlite connection. a table is created, and a trigger is created for this 
table, where upon insertion of data onto the table, a UDF called world will be 
used to add a "world" string to the world column. 
   
   This UDF will be only registered on the sqlite3 connection, and the insert 
will be done by a adbc_ingest() function call. This will lead to a failure, as 
the adbc connection does not have that function. 
   
   
   
   ```
   import adbc_driver_sqlite.dbapi as adbc
   import sqlite3
   import pyarrow as pa
   
   #creating in memory connection string
   db="file::memory:?cache=shared"
   
   
   #making connections/cursor
   sqlite_conn=sqlite3.connect(database=db,autocommit=True)
   arrow_conn=adbc.connect(db,autocommit=True)
   arrow_cursor=arrow_conn.cursor()
   
   
   #making pyarrow table to ingest
   schema=pa.schema([("hello",pa.string())])
   table=pa.table(["hello"],schema=schema)
   
   #setup for the UDF, note only sqlite3 connection gets the UDF
   def world():
       return "world"
   
   sqlite_conn.create_function('world',1,world)
   
   
   #generating database table
   sqlite_conn.execute("""CREATE TABLE hello_world(
                       hello TEXT,
                       world TEXT
                       );""")
   
   
   #making the trigger
   sqlite_conn.execute("""
                       CREATE TRIGGER table_update
                       AFTER INSERT ON hello_world
   
                       BEGIN
   
                       UPDATE hello_world
                       SET world = world();
   
                       END;
                       """)
   
   #ingesting the data, error will happen here
   arrow_cursor.adbc_ingest('hello_world',table,'append')
   
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscr...@arrow.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to