> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kinetica.com/llms.txt
> Use this file to discover all available pages before exploring further.

# /insert/records/fromquery

```
URL: http://<db.host>:<db.port>/insert/records/fromquery
```

Computes remote query result and inserts the result data into a new or existing
table.

## Input Parameter Description

<ParamField body="table_name" type="string">
  Name of the table into which the data will be inserted, in \[schema\_name.]table\_name format, using standard [name resolution rules](../../concepts/tables/#table-name-resolution). If the table does not exist, the table will be created using either an existing *type\_id* or the type inferred from the remote query, and the new table name will have to meet standard [table naming criteria](../../concepts/tables/#table-naming-criteria).
</ParamField>

<ParamField body="remote_query" type="string">
  Query for which result data needs to be imported.
</ParamField>

<ParamField body="modify_columns" type="map of string to maps of string to strings">
  Not implemented yet.

  The default value is an empty map ( \{} ).
</ParamField>

<ParamField body="create_table_options" type="map of string to strings">
  Options used when creating the target table.

  The default value is an empty map ( \{} ).

  <Expandable title="create_table_options">
    <ParamField body="type_id">
      ID of a currently registered [type](../../concepts/types/).

      The default value is ''.
    </ParamField>

    <ParamField body="no_error_if_exists">
      If *true*, prevents an error from occurring if the table already exists and is of the given type.  If a table with the same ID but a different type exists, it is still an error.

      The default value is `false`.

      The supported values are:

      * true
      * false
    </ParamField>

    <ParamField body="is_replicated">
      Affects the [distribution scheme](../../concepts/tables/#distribution) for the table's data.  If *true* and the given type has no explicit [shard key](../../concepts/tables/#shard-key) defined, the table will be [replicated](../../concepts/tables/#replication). If *false*, the table will be [sharded](../../concepts/tables/#sharding) according to the shard key specified in the given *type\_id*, or [randomly sharded](../../concepts/tables/#random-sharding), if no shard key is specified.  Note that a type containing a shard key cannot be used to create a replicated table.

      The default value is `false`.

      The supported values are:

      * true
      * false
    </ParamField>

    <ParamField body="foreign_keys">
      Semicolon-separated list of [foreign keys](../../concepts/tables/#foreign-keys), of the format '(source\_column\_name \[, ...]) references target\_table\_name(primary\_key\_column\_name \[, ...]) \[as foreign\_key\_name]'.
    </ParamField>

    <ParamField body="foreign_shard_key">
      Foreign shard key of the format 'source\_column references shard\_by\_column from target\_table(primary\_key\_column)'.
    </ParamField>

    <ParamField body="partition_type">
      [Partitioning](../../concepts/tables/#partitioning) scheme to use.

      * **RANGE**: Use [range partitioning](../../concepts/tables/#partitioning-by-range).
      * **INTERVAL**: Use [interval partitioning](../../concepts/tables/#partitioning-by-interval).
      * **LIST**: Use [list partitioning](../../concepts/tables/#partitioning-by-list).
      * **HASH**: Use [hash partitioning](../../concepts/tables/#partitioning-by-hash).
      * **SERIES**: Use [series partitioning](../../concepts/tables/#partitioning-by-series).
    </ParamField>

    <ParamField body="partition_keys">
      Comma-separated list of partition keys, which are the columns or column expressions by which records will be assigned to partitions defined by *partition\_definitions*.
    </ParamField>

    <ParamField body="partition_definitions">
      Comma-separated list of partition definitions, whose format depends on the choice of *partition\_type*.  See [range partitioning](../../concepts/tables/#partitioning-by-range), [interval partitioning](../../concepts/tables/#partitioning-by-interval), [list partitioning](../../concepts/tables/#partitioning-by-list), [hash partitioning](../../concepts/tables/#partitioning-by-hash), or [series partitioning](../../concepts/tables/#partitioning-by-series) for example formats.
    </ParamField>

    <ParamField body="is_automatic_partition">
      If *true*, a new partition will be created for values which don't fall into an existing partition.  Currently only supported for [list partitions](../../concepts/tables/#partitioning-by-list).

      The default value is `false`.

      The supported values are:

      * true
      * false
    </ParamField>

    <ParamField body="ttl">
      Sets the [TTL](../../concepts/ttl/) of the table specified in input parameter *table\_name*.
    </ParamField>

    <ParamField body="chunk_size">
      Indicates the number of records per chunk to be used for this table.
    </ParamField>

    <ParamField body="is_result_table">
      Indicates whether the table is a [memory-only table](../../concepts/tables_memory_only/). A result table cannot contain columns with text\_search [data-handling](../../concepts/types/#data-handling), and it will not be retained if the server is restarted.

      The default value is `false`.

      The supported values are:

      * true
      * false
    </ParamField>

    <ParamField body="strategy_definition">
      The [tier strategy](../../rm/concepts/#tier-strategies) for the table and its columns.
    </ParamField>

    <ParamField body="compression_codec">
      The default [compression codec](../../concepts/column_compression/) for this table's columns.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="options" type="map of string to strings">
  Optional parameters.

  The default value is an empty map ( \{} ).

  <Expandable title="options">
    <ParamField body="bad_record_table_name">
      Name of a table to which records that were rejected are written.  The bad-record-table has the following columns: line\_number (long), line\_rejected (string), error\_message (string). When error handling is Abort, bad records table is not populated.
    </ParamField>

    <ParamField body="bad_record_table_limit">
      A positive integer indicating the maximum number of records that can be written to the bad-record-table. Default value is 10000.
    </ParamField>

    <ParamField body="batch_size">
      Number of records per batch when inserting data.
    </ParamField>

    <ParamField body="datasource_name">
      Name of an existing external data source from which table will be loaded.
    </ParamField>

    <ParamField body="error_handling">
      Specifies how errors should be handled upon insertion.

      The default value is `abort`.

      * **permissive**: Records with missing columns are populated with nulls if possible; otherwise, the malformed records are skipped.
      * **skip**: Malformed records are skipped.
      * **ignore\_bad\_records**: Deprecated. Alias for *skip*.
      * **abort**: Stops current insertion and aborts entire operation when an error is encountered.  Primary key collisions are considered abortable errors in this mode.
    </ParamField>

    <ParamField body="pk_conflict_predicate_higher">
      The record with higher value for the column resolves the primary-key insert conflict.

      The default value is ''.
    </ParamField>

    <ParamField body="pk_conflict_predicate_lower">
      The record with lower value for the column resolves the primary-key insert conflict.

      The default value is ''.
    </ParamField>

    <ParamField body="ignore_existing_pk">
      Specifies the record collision error-suppression policy for inserting into a table with a [primary key](../../concepts/tables/#primary-keys), only used when not in upsert mode (upsert mode is disabled when *update\_on\_existing\_pk* is *false*).  If set to *true*, any record being inserted that is rejected for having primary key values that match those of an existing table record will be ignored with no error generated.  If *false*, the rejection of any record for having primary key values matching an existing record will result in an error being reported, as determined by *error\_handling*.  If the specified table does not have a primary key or if upsert mode is in effect (*update\_on\_existing\_pk* is *true*), then this option has no effect.

      The default value is `false`.

      * **true**: Ignore new records whose primary key values collide with those of existing records.
      * **false**: Treat as errors any new records whose primary key values collide with those of existing records.
    </ParamField>

    <ParamField body="ingestion_mode">
      Whether to do a full load, dry run, or perform a type inference on the source data.

      The default value is `full`.

      * **full**: Run a type inference on the source data (if needed) and ingest.
      * **dry\_run**: Does not load data, but walks through the source data and determines the number of valid records, taking into account the current mode of *error\_handling*.
      * **type\_inference\_only**: Infer the type of the source data and return, without ingesting any data.  The inferred type is returned in the response.
    </ParamField>

    <ParamField body="jdbc_fetch_size">
      The JDBC fetch size, which determines how many rows to fetch per round trip.
    </ParamField>

    <ParamField body="jdbc_session_init_statement">
      Executes the statement per each JDBC session before doing actual load.

      The default value is ''.
    </ParamField>

    <ParamField body="num_splits_per_rank">
      Number of splits for reading data per rank. Default will be [external\_file\_reader\_num\_tasks](../../config/#config-main-external-files).

      The default value is ''.
    </ParamField>

    <ParamField body="num_tasks_per_rank">
      Number of tasks for reading data per rank. Default will be [external\_file\_reader\_num\_tasks](../../config/#config-main-external-files).
    </ParamField>

    <ParamField body="primary_keys">
      Comma separated list of column names, to set as primary keys, when not specified in the type.

      The default value is ''.
    </ParamField>

    <ParamField body="shard_keys">
      Comma separated list of column names, to set as shard keys, when not specified in the type.

      The default value is ''.
    </ParamField>

    <ParamField body="subscribe">
      Continuously poll the data source to check for new data and load it into the table.

      The default value is `false`.

      The supported values are:

      * true
      * false
    </ParamField>

    <ParamField body="truncate_table">
      If set to *true*, truncates the table specified by input parameter *table\_name* prior to loading the data.

      The default value is `false`.

      The supported values are:

      * true
      * false
    </ParamField>

    <ParamField body="remote_query">
      Remote SQL query from which data will be sourced.
    </ParamField>

    <ParamField body="remote_query_order_by">
      Name of column to be used for splitting the query into multiple sub-queries using ordering of given column.

      The default value is ''.
    </ParamField>

    <ParamField body="remote_query_filter_column">
      Name of column to be used for splitting the query into multiple sub-queries using the data distribution of given column.

      The default value is ''.
    </ParamField>

    <ParamField body="remote_query_increasing_column">
      Column on subscribed remote query result that will increase for new records (e.g., TIMESTAMP).

      The default value is ''.
    </ParamField>

    <ParamField body="remote_query_partition_column">
      Alias name for *remote\_query\_filter\_column*.

      The default value is ''.
    </ParamField>

    <ParamField body="truncate_strings">
      If set to *true*, truncate string values that are longer than the column's type size.

      The default value is `false`.

      The supported values are:

      * true
      * false
    </ParamField>

    <ParamField body="enable_inplace_updates">
      Applies only when upserting (when update\_on\_existing\_pk is true). If set to true (the default), an existing record matched by primary key is modified in place. If set to false, the matched record is updated by deleting it and inserting a replacement (delete and insert), which prevents the change from being reflected in dependent materialized views until they are refreshed.

      The default value is `true`.

      The supported values are:

      * true
      * false
    </ParamField>

    <ParamField body="update_on_existing_pk">
      Specifies the record collision policy for inserting into a table with a [primary key](../../concepts/tables/#primary-keys). If set to *true*, any existing table record with primary key values that match those of a record being inserted will be replaced by that new record (the new data will be "upserted"). If set to *false*, any existing table record with primary key values that match those of a record being inserted will remain unchanged, while the new record will be rejected and the error handled as determined by *ignore\_existing\_pk* and *error\_handling*.  If the specified table does not have a primary key, then this option has no effect.

      The default value is `false`.

      * **true**: Upsert new records when primary keys match existing records.
      * **false**: Reject new records when primary keys match existing records.
    </ParamField>
  </Expandable>
</ParamField>

## Output Parameter Description

The Kinetica server embeds the endpoint response inside a standard response structure which contains status information and the actual response to the query.  Here is a description of the various fields of the wrapper:

<ResponseField name="status" type="String">
  'OK' or 'ERROR'
</ResponseField>

<ResponseField name="message" type="String">
  Empty if success or an error message
</ResponseField>

<ResponseField name="data_type" type="String">
  'insert\_records\_from\_query\_response' or 'none' in case of an error
</ResponseField>

<ResponseField name="data" type="String">
  Empty string
</ResponseField>

<ResponseField name="data_str" type="JSON or String">
  This embedded JSON represents the result of the /insert/records/fromquery endpoint:

  <Expandable title="data_str">
    <ResponseField name="table_name" type="string">
      Value of input parameter *table\_name*.
    </ResponseField>

    <ResponseField name="type_id" type="string">
      ID of the currently registered table structure [type](../../concepts/types/) for the target table.
    </ResponseField>

    <ResponseField name="type_definition" type="string">
      A JSON string describing the columns of the target table.
    </ResponseField>

    <ResponseField name="type_label" type="string">
      The user-defined description associated with the target table's structure.
    </ResponseField>

    <ResponseField name="type_properties" type="map of string to arrays of strings">
      A mapping of each target table column name to an array of column properties associated with that column.
    </ResponseField>

    <ResponseField name="count_inserted" type="long">
      Number of records inserted into the target table.
    </ResponseField>

    <ResponseField name="count_skipped" type="long">
      Number of records skipped, when not running in *abort* error handling mode.
    </ResponseField>

    <ResponseField name="count_updated" type="long">
      \[Not yet implemented]  Number of records updated within the target table.
    </ResponseField>

    <ResponseField name="info" type="map of string to strings">
      Additional information.
    </ResponseField>
  </Expandable>

  Empty string in case of an error.
</ResponseField>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.