A mock driver for ADBC.
The query result can be specified by providing a CSV list of types in the query. For instance, if the query is int8, string, the resulting table will have two columns—a column for int8 and a column for string.
import pyarrow
import adbc_driver_manager
import adbc_driver_mocks
with adbc_driver_mocks.connect() as db:
with adbc_driver_manager.AdbcConnection(db) as conn:
with adbc_driver_manager.AdbcStatement(conn) as stmt:
stmt.set_sql_query("int8,string")
stream, _ = stmt.execute_query()
reader = pyarrow.RecordBatchReader._import_from_c(stream.address)
print(reader.read_all())Run the above code and observe the result:
pyarrow.Table
int8: int8 not null
string: string not null
----
int8: [[0]]
string: [["abcdefghij"]]
The number of rows can be specified by adding <rows>: at the beginning of the query. For example, 7:int32,bool will generate a table with 7 rows of int32 and bool values.
If the query string is passthrough, the query will return anything that was passed to Bind or BindStream as the query result. This is useful for testing the Bind and BindStream functions.
Here is a list of supported DataTypes in the query. For some types it is possible to use the aliases instead of full type string, multiple aliases are seperated by comma.
| Type String | Alias |
|---|---|
| null | n |
| bool | boolean,b |
| int8 | i8,c |
| uint8 | u8,C |
| int16 | i16,s |
| uint16 | u16,S |
| int32 | i32,i |
| uint32 | u32,I |
| int64 | i64,l |
| uint64 | u64,L |
| float16 | f16,e |
| float32 | f32,f |
| float64 | f64,g |
| binary | z |
| string | str |
| date32 | d32,tdD |
| date64 | d64,tdm |
| time32s | t32s,tts |
| time32ms | t32ms,ttm |
| time64us | t64us,ttu |
| time64ns | t64ns,ttn |
| timestamp_s | |
| timestamp_ms | |
| timestamp_us | |
| timestamp_ns | |
| duration_s | |
| duration_ms | |
| duration_us | |
| duration_ns | |
| interval_month | |
| interval_daytime | |
| interval_monthdaynano | |
| list | |
| struct | |
| run_end_encoded | |
| dictionary_encoded_array | |
| dense_union | |
| sparse_union |
Null types will always return rows numbers of nulls.
Bool types will alternate between true and false.
Example:
3: bool->True,False,True
The integer types include: int8, uint8, int16, uint16, int32, uint32, int64, uint64.
- First two values: Minimum and maximum values when the integer is at the top level of the query (i.e. not inside a list, struct, union...), otherwise
0, 1. - Subsequent values:
-2, 3, -4, 5..., overflows ifrowsexceeded maximum value.
- First two values:
0and maximum value when the integer is at the top level of the query (i.e. not inside a list, struct, union...), otherwise0, 1. - Subsequent values:
2, 3, 4, 5..., overflows ifrowsexceeded maximum value.
Examples:
4: int16->-32768,32767,-2,3
4: uint8->0,255,2,3
list<3: int8>->[0, 1, -2]
The floating point types include: float16, float32, float64.
The first 9 values for all floating point types are:
- Smallest negative finite value
- Largest finite value
- Infinity
- Negative Infinity
- NaN
- Positive zero
- Negative zero
- Smallest positive non-zero value (i.e. precision limit)
- Largest negative non-zero value (negative of the above)
Binary types are a byte array of rows amount of rows-1.
The value inside the byte array overflows if exceeded 255.
Example:
5: binary->[0x0],[0x1,0x1],[0x2,0x2,0x2],[0x3,0x3,0x3,0x3],[0x4,0x4,0x4,0x4,0x4]
mocked value is a string of rows with rows-1 number of zeros to the left.
Example:
3: string->0,01,002
days since the UNIX epoch in int32.
Example:
3: date32->1970-01-01,1970-01-02,1970-01-03
milliseconds since the UNIX epoch in int64.
Example:
3: date64->1970-01-01 00:00:00,1970-01-02 00:00:00.001,1970-01-03 00:00:00.002
either seconds since midnight.
Example:
3: time32s->00:00:00,00:00:01,00:00:02
milliseconds since midnight.
Example:
3: time32ms->00:00:00,00:00:00.001,00:00:00.002
microseconds since midnight.
Example:
3: time64us->00:00:00,00:00:00.000001,00:00:00.000002
nanoseconds since midnight.
Example:
3: time64ns->00:00:00,00:00:00.000000001,00:00:00.000000002
seconds since the UNIX epoch in int64. in this mock driver the timezone is always UTC.
Example:
3: timestamp_s->1970-01-01 00:00:00,1970-01-01 00:00:01,1970-01-01 00:00:02
miliseconds since the UNIX epoch in int64. in this mock driver the timezone is always UTC.
Example:
3: timestamp_ms->1970-01-01 00:00:00,1970-01-01 00:00:00.001,1970-01-01 00:00:00.002
microseconds since the UNIX epoch in int64. in this mock driver the timezone is always UTC.
Example:
3: timestamp_ms->1970-01-01 00:00:00,1970-01-01 00:00:00.000001,1970-01-01 00:00:00.000002
nanoseconds since the UNIX epoch in int64. in this mock driver the timezone is always UTC.
Example:
3: timestamp_ms->1970-01-01 00:00:00,1970-01-01 00:00:00.000000001,1970-01-01 00:00:00.000000002
measure of elapsed time in seconds in int64.
Example:
3: duration_s->0s,1s,2s
measure of elapsed time in miliseconds in int64.
Example:
3: duration_ms->0ms,1ms,2ms
measure of elapsed time in microseconds in int64.
Example:
3: duration_us->0us,1us,2us
measure of elapsed time in nanoseconds in int64.
Example:
3: duration_ns->0ns,1ns,2ns
number of months.
Example:
3: interval_month->months:0,months:1,months:2
number of days and miliseconds(fraction of day).
Example:
3: interval_daytime->days:0,ms:0,days:1,ms:1,days:2,ms:2
number of months, days and nanoseconds.
Example:
3: interval_monthdaynano->months:0,days:0,ns:0,months:1,days:1,ns:1,months:2,days:2,ns:2
To indicate a list type, signify the length and element type within angle brackets.
A list without angle brackets will default to list<1:int8>.
Example:
2: list<2: uint8>->[0,1],[2,3]
Structs operate similarly to lists but without a specified length. For instance, to define a struct containing an int8 and a boolean value, use the query: struct<int8,bool>.
Example:
2: struct<int8,bool>->{0,True},{1,False}