singlestoredb 1.15.1__tar.gz → 1.15.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of singlestoredb might be problematic. Click here for more details.
- {singlestoredb-1.15.1/singlestoredb.egg-info → singlestoredb-1.15.3}/PKG-INFO +1 -1
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/accel.c +70 -22
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/setup.cfg +1 -1
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/__init__.py +1 -1
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/apps/_python_udfs.py +18 -3
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/apps/_stdout_supress.py +1 -1
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/apps/_uvicorn_util.py +4 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/config.py +18 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/converters.py +1 -1
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/functions/ext/asgi.py +209 -23
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/functions/ext/timer.py +2 -11
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/functions/ext/utils.py +55 -6
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/test_ext_func_data.py +18 -18
- {singlestoredb-1.15.1 → singlestoredb-1.15.3/singlestoredb.egg-info}/PKG-INFO +1 -1
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/LICENSE +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/README.md +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/setup.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/ai/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/ai/chat.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/ai/embeddings.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/alchemy/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/apps/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/apps/_cloud_functions.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/apps/_config.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/apps/_connection_info.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/apps/_dashboards.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/apps/_process.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/auth.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/connection.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/docstring/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/docstring/attrdoc.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/docstring/common.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/docstring/epydoc.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/docstring/google.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/docstring/numpydoc.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/docstring/parser.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/docstring/py.typed +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/docstring/rest.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/docstring/tests/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/docstring/tests/_pydoctor.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/docstring/tests/test_epydoc.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/docstring/tests/test_google.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/docstring/tests/test_numpydoc.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/docstring/tests/test_parse_from_object.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/docstring/tests/test_parser.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/docstring/tests/test_rest.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/docstring/tests/test_util.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/docstring/util.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/exceptions.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/functions/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/functions/decorator.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/functions/dtypes.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/functions/ext/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/functions/ext/arrow.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/functions/ext/json.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/functions/ext/mmap.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/functions/ext/rowdat_1.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/functions/signature.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/functions/typing/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/functions/typing/numpy.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/functions/typing/pandas.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/functions/typing/polars.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/functions/typing/pyarrow.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/functions/utils.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/fusion/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/fusion/graphql.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/fusion/handler.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/fusion/handlers/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/fusion/handlers/export.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/fusion/handlers/files.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/fusion/handlers/job.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/fusion/handlers/models.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/fusion/handlers/stage.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/fusion/handlers/utils.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/fusion/handlers/workspace.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/fusion/registry.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/fusion/result.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/http/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/http/connection.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/magics/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/magics/run_personal.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/magics/run_shared.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/management/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/management/billing_usage.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/management/cluster.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/management/export.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/management/files.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/management/inference_api.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/management/job.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/management/manager.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/management/organization.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/management/region.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/management/utils.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/management/workspace.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/_auth.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/charset.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/connection.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/constants/CLIENT.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/constants/COMMAND.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/constants/CR.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/constants/ER.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/constants/EXTENDED_TYPE.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/constants/FIELD_TYPE.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/constants/FLAG.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/constants/SERVER_STATUS.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/constants/VECTOR_TYPE.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/constants/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/converters.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/cursors.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/err.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/optionfile.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/protocol.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/tests/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/tests/base.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/tests/conftest.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/tests/test_DictCursor.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/tests/test_SSCursor.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/tests/test_basic.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/tests/test_connection.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/tests/test_converters.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/tests/test_cursor.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/tests/test_err.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/tests/test_issues.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/tests/test_load_local.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/tests/test_nextset.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/tests/test_optionfile.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/tests/thirdparty/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/capabilities.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/dbapi20.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_capabilities.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_dbapi20.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_nonstandard.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/mysql/times.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/notebook/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/notebook/_objects.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/notebook/_portal.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/py.typed +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/pytest.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/server/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/server/docker.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/server/free_tier.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/empty.sql +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/ext_funcs/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/local_infile.csv +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/test.ipynb +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/test.sql +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/test2.ipynb +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/test2.sql +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/test_basics.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/test_config.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/test_connection.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/test_dbapi.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/test_exceptions.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/test_ext_func.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/test_fusion.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/test_http.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/test_management.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/test_plugin.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/test_results.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/test_types.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/test_udf.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/test_udf_returns.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/test_vectorstore.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/test_xdict.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/tests/utils.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/types.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/utils/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/utils/config.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/utils/convert_rows.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/utils/debug.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/utils/dtypes.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/utils/events.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/utils/mogrify.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/utils/results.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/utils/xdict.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb/vectorstore.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb.egg-info/SOURCES.txt +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb.egg-info/dependency_links.txt +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb.egg-info/entry_points.txt +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb.egg-info/requires.txt +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/singlestoredb.egg-info/top_level.txt +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/sqlx/__init__.py +0 -0
- {singlestoredb-1.15.1 → singlestoredb-1.15.3}/sqlx/magic.py +0 -0
|
@@ -1950,7 +1950,6 @@ static PyObject *read_row_from_packet(
|
|
|
1950
1950
|
case ACCEL_OUT_DICTS:
|
|
1951
1951
|
case ACCEL_OUT_ARROW:
|
|
1952
1952
|
PyDict_SetItem(py_result, py_state->py_names[i], py_item);
|
|
1953
|
-
Py_INCREF(py_state->py_names[i]);
|
|
1954
1953
|
Py_DECREF(py_item);
|
|
1955
1954
|
break;
|
|
1956
1955
|
default:
|
|
@@ -2678,8 +2677,19 @@ static PyObject *load_rowdat_1_numpy(PyObject *self, PyObject *args, PyObject *k
|
|
|
2678
2677
|
|
|
2679
2678
|
exit:
|
|
2680
2679
|
if (ctypes) free(ctypes);
|
|
2681
|
-
if (out_cols)
|
|
2682
|
-
|
|
2680
|
+
if (out_cols) {
|
|
2681
|
+
for (i = 0; i < n_cols; i++) {
|
|
2682
|
+
if (out_cols[i]) free(out_cols[i]);
|
|
2683
|
+
}
|
|
2684
|
+
free(out_cols);
|
|
2685
|
+
}
|
|
2686
|
+
if (mask_cols) {
|
|
2687
|
+
for (i = 0; i < n_cols; i++) {
|
|
2688
|
+
if (mask_cols[i]) free(mask_cols[i]);
|
|
2689
|
+
}
|
|
2690
|
+
free(mask_cols);
|
|
2691
|
+
}
|
|
2692
|
+
if (out_row_ids) free(out_row_ids);
|
|
2683
2693
|
if (data_formats) free(data_formats);
|
|
2684
2694
|
if (item_sizes) free(item_sizes);
|
|
2685
2695
|
|
|
@@ -2943,11 +2953,17 @@ static PyObject *dump_rowdat_1_numpy(PyObject *self, PyObject *args, PyObject *k
|
|
|
2943
2953
|
out_l = 256 * n_cols;
|
|
2944
2954
|
out_idx = 0;
|
|
2945
2955
|
out = malloc(out_l);
|
|
2946
|
-
if (!out)
|
|
2956
|
+
if (!out) {
|
|
2957
|
+
PyErr_SetString(PyExc_MemoryError, "failed to allocate output buffer");
|
|
2958
|
+
goto error;
|
|
2959
|
+
}
|
|
2947
2960
|
|
|
2948
2961
|
// Get return types
|
|
2949
2962
|
returns = malloc(sizeof(int) * n_cols);
|
|
2950
|
-
if (!returns)
|
|
2963
|
+
if (!returns) {
|
|
2964
|
+
PyErr_SetString(PyExc_MemoryError, "failed to allocate returns array");
|
|
2965
|
+
goto error;
|
|
2966
|
+
}
|
|
2951
2967
|
|
|
2952
2968
|
for (i = 0; i < n_cols; i++) {
|
|
2953
2969
|
PyObject *py_item = PySequence_GetItem(py_returns, i);
|
|
@@ -2959,11 +2975,20 @@ static PyObject *dump_rowdat_1_numpy(PyObject *self, PyObject *args, PyObject *k
|
|
|
2959
2975
|
|
|
2960
2976
|
// Get column array memory
|
|
2961
2977
|
cols = calloc(sizeof(char*), n_cols);
|
|
2962
|
-
if (!cols)
|
|
2978
|
+
if (!cols) {
|
|
2979
|
+
PyErr_SetString(PyExc_MemoryError, "failed to allocate cols array");
|
|
2980
|
+
goto error;
|
|
2981
|
+
}
|
|
2963
2982
|
col_types = calloc(sizeof(NumpyColType), n_cols);
|
|
2964
|
-
if (!col_types)
|
|
2983
|
+
if (!col_types) {
|
|
2984
|
+
PyErr_SetString(PyExc_MemoryError, "failed to allocate col_types array");
|
|
2985
|
+
goto error;
|
|
2986
|
+
}
|
|
2965
2987
|
masks = calloc(sizeof(char*), n_cols);
|
|
2966
|
-
if (!masks)
|
|
2988
|
+
if (!masks) {
|
|
2989
|
+
PyErr_SetString(PyExc_MemoryError, "failed to allocate masks array");
|
|
2990
|
+
goto error;
|
|
2991
|
+
}
|
|
2967
2992
|
for (i = 0; i < n_cols; i++) {
|
|
2968
2993
|
PyObject *py_item = PyList_GetItem(py_cols, i);
|
|
2969
2994
|
if (!py_item) goto error;
|
|
@@ -2996,8 +3021,12 @@ static PyObject *dump_rowdat_1_numpy(PyObject *self, PyObject *args, PyObject *k
|
|
|
2996
3021
|
#define CHECKMEM(x) \
|
|
2997
3022
|
if ((out_idx + x) > out_l) { \
|
|
2998
3023
|
out_l = out_l * 2 + x; \
|
|
2999
|
-
|
|
3000
|
-
if (!
|
|
3024
|
+
char *new_out = realloc(out, out_l); \
|
|
3025
|
+
if (!new_out) { \
|
|
3026
|
+
PyErr_SetString(PyExc_MemoryError, "failed to reallocate output buffer"); \
|
|
3027
|
+
goto error; \
|
|
3028
|
+
} \
|
|
3029
|
+
out = new_out; \
|
|
3001
3030
|
}
|
|
3002
3031
|
|
|
3003
3032
|
for (j = 0; j < n_rows; j++) {
|
|
@@ -4079,10 +4108,10 @@ static PyObject *dump_rowdat_1_numpy(PyObject *self, PyObject *args, PyObject *k
|
|
|
4079
4108
|
}
|
|
4080
4109
|
}
|
|
4081
4110
|
|
|
4082
|
-
py_out =
|
|
4083
|
-
if (!py_out) goto error;
|
|
4111
|
+
py_out = PyBytes_FromStringAndSize(out, out_idx);
|
|
4084
4112
|
|
|
4085
4113
|
exit:
|
|
4114
|
+
if (out) free(out);
|
|
4086
4115
|
if (returns) free(returns);
|
|
4087
4116
|
if (masks) free(masks);
|
|
4088
4117
|
if (cols) free(cols);
|
|
@@ -4091,7 +4120,6 @@ exit:
|
|
|
4091
4120
|
return py_out;
|
|
4092
4121
|
|
|
4093
4122
|
error:
|
|
4094
|
-
if (!py_out && out) free(out);
|
|
4095
4123
|
Py_XDECREF(py_out);
|
|
4096
4124
|
py_out = NULL;
|
|
4097
4125
|
|
|
@@ -4471,8 +4499,12 @@ static PyObject *dump_rowdat_1(PyObject *self, PyObject *args, PyObject *kwargs)
|
|
|
4471
4499
|
#define CHECKMEM(x) \
|
|
4472
4500
|
if ((out_idx + x) > out_l) { \
|
|
4473
4501
|
out_l = out_l * 2 + x; \
|
|
4474
|
-
|
|
4475
|
-
if (!
|
|
4502
|
+
char *new_out = realloc(out, out_l); \
|
|
4503
|
+
if (!new_out) { \
|
|
4504
|
+
PyErr_SetString(PyExc_MemoryError, "failed to reallocate output buffer"); \
|
|
4505
|
+
goto error; \
|
|
4506
|
+
} \
|
|
4507
|
+
out = new_out; \
|
|
4476
4508
|
}
|
|
4477
4509
|
|
|
4478
4510
|
py_rows_iter = PyObject_GetIter(py_rows);
|
|
@@ -4483,12 +4515,20 @@ static PyObject *dump_rowdat_1(PyObject *self, PyObject *args, PyObject *kwargs)
|
|
|
4483
4515
|
|
|
4484
4516
|
while ((py_row = PyIter_Next(py_rows_iter))) {
|
|
4485
4517
|
py_row_iter = PyObject_GetIter(py_row);
|
|
4486
|
-
if (!py_row_iter)
|
|
4518
|
+
if (!py_row_iter) {
|
|
4519
|
+
Py_DECREF(py_row);
|
|
4520
|
+
goto error;
|
|
4521
|
+
}
|
|
4487
4522
|
|
|
4488
4523
|
// First item is always a row ID
|
|
4489
4524
|
py_item = PyIter_Next(py_row_ids_iter);
|
|
4490
|
-
if (!py_item)
|
|
4525
|
+
if (!py_item) {
|
|
4526
|
+
Py_DECREF(py_row_iter);
|
|
4527
|
+
Py_DECREF(py_row);
|
|
4528
|
+
goto error;
|
|
4529
|
+
}
|
|
4491
4530
|
row_id = (int64_t)PyLong_AsLongLong(py_item);
|
|
4531
|
+
Py_DECREF(py_item);
|
|
4492
4532
|
|
|
4493
4533
|
CHECKMEM(8);
|
|
4494
4534
|
memcpy(out+out_idx, &row_id, 8);
|
|
@@ -4631,12 +4671,16 @@ static PyObject *dump_rowdat_1(PyObject *self, PyObject *args, PyObject *kwargs)
|
|
|
4631
4671
|
out_idx += 8;
|
|
4632
4672
|
} else {
|
|
4633
4673
|
PyObject *py_bytes = PyUnicode_AsEncodedString(py_item, "utf-8", "strict");
|
|
4634
|
-
if (!py_bytes)
|
|
4674
|
+
if (!py_bytes) {
|
|
4675
|
+
Py_DECREF(py_item);
|
|
4676
|
+
goto error;
|
|
4677
|
+
}
|
|
4635
4678
|
|
|
4636
4679
|
char *str = NULL;
|
|
4637
4680
|
Py_ssize_t str_l = 0;
|
|
4638
4681
|
if (PyBytes_AsStringAndSize(py_bytes, &str, &str_l) < 0) {
|
|
4639
4682
|
Py_DECREF(py_bytes);
|
|
4683
|
+
Py_DECREF(py_item);
|
|
4640
4684
|
goto error;
|
|
4641
4685
|
}
|
|
4642
4686
|
|
|
@@ -4671,6 +4715,7 @@ static PyObject *dump_rowdat_1(PyObject *self, PyObject *args, PyObject *kwargs)
|
|
|
4671
4715
|
char *str = NULL;
|
|
4672
4716
|
Py_ssize_t str_l = 0;
|
|
4673
4717
|
if (PyBytes_AsStringAndSize(py_item, &str, &str_l) < 0) {
|
|
4718
|
+
Py_DECREF(py_item);
|
|
4674
4719
|
goto error;
|
|
4675
4720
|
}
|
|
4676
4721
|
|
|
@@ -4684,6 +4729,7 @@ static PyObject *dump_rowdat_1(PyObject *self, PyObject *args, PyObject *kwargs)
|
|
|
4684
4729
|
break;
|
|
4685
4730
|
|
|
4686
4731
|
default:
|
|
4732
|
+
Py_DECREF(py_item);
|
|
4687
4733
|
goto error;
|
|
4688
4734
|
}
|
|
4689
4735
|
|
|
@@ -4693,14 +4739,17 @@ static PyObject *dump_rowdat_1(PyObject *self, PyObject *args, PyObject *kwargs)
|
|
|
4693
4739
|
i++;
|
|
4694
4740
|
}
|
|
4695
4741
|
|
|
4742
|
+
Py_DECREF(py_row_iter);
|
|
4696
4743
|
Py_DECREF(py_row);
|
|
4744
|
+
py_row_iter = NULL;
|
|
4697
4745
|
py_row = NULL;
|
|
4698
4746
|
}
|
|
4699
4747
|
|
|
4700
|
-
|
|
4701
|
-
|
|
4748
|
+
// Convert the output buffer to a Python bytes object and free the buffer
|
|
4749
|
+
py_out = PyBytes_FromStringAndSize(out, out_idx);
|
|
4702
4750
|
|
|
4703
4751
|
exit:
|
|
4752
|
+
if (out) free(out);
|
|
4704
4753
|
if (returns) free(returns);
|
|
4705
4754
|
|
|
4706
4755
|
Py_XDECREF(py_item);
|
|
@@ -4712,7 +4761,6 @@ exit:
|
|
|
4712
4761
|
return py_out;
|
|
4713
4762
|
|
|
4714
4763
|
error:
|
|
4715
|
-
if (!py_out && out) free(out);
|
|
4716
4764
|
Py_XDECREF(py_out);
|
|
4717
4765
|
py_out = NULL;
|
|
4718
4766
|
|
|
@@ -4839,7 +4887,7 @@ PyMODINIT_FUNC PyInit__singlestoredb_accel(void) {
|
|
|
4839
4887
|
|
|
4840
4888
|
PyObj.create_numpy_array_kwargs = PyDict_New();
|
|
4841
4889
|
if (!PyObj.create_numpy_array_kwargs) goto error;
|
|
4842
|
-
if (PyDict_SetItemString(PyObj.create_numpy_array_kwargs, "copy",
|
|
4890
|
+
if (PyDict_SetItemString(PyObj.create_numpy_array_kwargs, "copy", Py_True)) {
|
|
4843
4891
|
goto error;
|
|
4844
4892
|
}
|
|
4845
4893
|
|
|
@@ -13,6 +13,9 @@ if typing.TYPE_CHECKING:
|
|
|
13
13
|
# Keep track of currently running server
|
|
14
14
|
_running_server: 'typing.Optional[AwaitableUvicornServer]' = None
|
|
15
15
|
|
|
16
|
+
# Maximum number of UDFs allowed
|
|
17
|
+
MAX_UDFS_LIMIT = 10
|
|
18
|
+
|
|
16
19
|
|
|
17
20
|
async def run_udf_app(
|
|
18
21
|
log_level: str = 'error',
|
|
@@ -44,20 +47,32 @@ async def run_udf_app(
|
|
|
44
47
|
udf_suffix = ''
|
|
45
48
|
if app_config.running_interactively:
|
|
46
49
|
udf_suffix = '_test'
|
|
47
|
-
app = Application(
|
|
50
|
+
app = Application(
|
|
51
|
+
url=base_url,
|
|
52
|
+
app_mode='managed',
|
|
53
|
+
name_suffix=udf_suffix,
|
|
54
|
+
log_level=log_level,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
if not app.endpoints:
|
|
58
|
+
raise ValueError('You must define at least one function.')
|
|
59
|
+
if len(app.endpoints) > MAX_UDFS_LIMIT:
|
|
60
|
+
raise ValueError(
|
|
61
|
+
f'You can only define a maximum of {MAX_UDFS_LIMIT} functions.',
|
|
62
|
+
)
|
|
48
63
|
|
|
49
64
|
config = uvicorn.Config(
|
|
50
65
|
app,
|
|
51
66
|
host='0.0.0.0',
|
|
52
67
|
port=app_config.listen_port,
|
|
53
|
-
|
|
68
|
+
log_config=app.get_uvicorn_log_config(),
|
|
54
69
|
)
|
|
55
|
-
_running_server = AwaitableUvicornServer(config)
|
|
56
70
|
|
|
57
71
|
# Register the functions only if the app is running interactively.
|
|
58
72
|
if app_config.running_interactively:
|
|
59
73
|
app.register_functions(replace=True)
|
|
60
74
|
|
|
75
|
+
_running_server = AwaitableUvicornServer(config)
|
|
61
76
|
asyncio.create_task(_running_server.serve())
|
|
62
77
|
await _running_server.wait_for_startup()
|
|
63
78
|
|
|
@@ -30,3 +30,7 @@ class AwaitableUvicornServer(uvicorn.Server):
|
|
|
30
30
|
|
|
31
31
|
async def wait_for_startup(self) -> None:
|
|
32
32
|
await self._startup_future
|
|
33
|
+
|
|
34
|
+
async def shutdown(self, sockets: Optional[list[socket.socket]] = None) -> None:
|
|
35
|
+
if self.started:
|
|
36
|
+
await super().shutdown(sockets)
|
|
@@ -407,6 +407,12 @@ register_option(
|
|
|
407
407
|
environ=['SINGLESTOREDB_EXT_FUNC_LOG_LEVEL'],
|
|
408
408
|
)
|
|
409
409
|
|
|
410
|
+
register_option(
|
|
411
|
+
'external_function.log_file', 'string', check_str, None,
|
|
412
|
+
'File path to write logs to instead of console.',
|
|
413
|
+
environ=['SINGLESTOREDB_EXT_FUNC_LOG_FILE'],
|
|
414
|
+
)
|
|
415
|
+
|
|
410
416
|
register_option(
|
|
411
417
|
'external_function.name_prefix', 'string', check_str, '',
|
|
412
418
|
'Prefix to add to external function names.',
|
|
@@ -450,6 +456,18 @@ register_option(
|
|
|
450
456
|
environ=['SINGLESTOREDB_EXT_FUNC_TIMEOUT'],
|
|
451
457
|
)
|
|
452
458
|
|
|
459
|
+
register_option(
|
|
460
|
+
'external_function.disable_metrics', 'bool', check_bool, False,
|
|
461
|
+
'Disable logging of function call metrics.',
|
|
462
|
+
environ=['SINGLESTOREDB_EXT_FUNC_DISABLE_METRICS'],
|
|
463
|
+
)
|
|
464
|
+
|
|
465
|
+
register_option(
|
|
466
|
+
'external_function.app_name', 'string', check_str, None,
|
|
467
|
+
'Name for the external function application instance.',
|
|
468
|
+
environ=['SINGLESTOREDB_EXT_FUNC_APP_NAME'],
|
|
469
|
+
)
|
|
470
|
+
|
|
453
471
|
#
|
|
454
472
|
# Debugging options
|
|
455
473
|
#
|