A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://cloud.google.com/spanner/docs/reference/postgresql/data-definition-language below:

PostgreSQL data definition language | Spanner

This page defines the syntax of the SQL data definition language (DDL) statements supported for PostgreSQL-dialect databases.

Notations used in the syntax Names

Naming rules in PostgreSQL-dialect databases are the same as those used in open source PostgreSQL, except for the following:

SCHEMA statements

This section has information about SCHEMA statements.

CREATE SCHEMA

Creates a new schema and assigns a name.

CREATE SCHEMA [schema_name]
Spanner differences from open source PostgreSQL

schema_name

DROP SCHEMA

Removes a named schema.

DROP SCHEMA schema_name [, ...]
Spanner differences from open source PostgreSQL

schema_name

DATABASE statements

This section has information about DATABASE statements.

CREATE DATABASE

Creates a new database and assigns an ID.

CREATE DATABASE name
ALTER DATABASE

Changes the definition of a database.

ALTER DATABASE name SET configuration_parameter_def

ALTER DATABASE name RESET configuration_parameter

where the configuration_parameter_def is:

    {
        spanner.default_leader { TO | = } { 'region' | DEFAULT }
        | spanner.optimizer_version { TO | = } { 1 ... 8 | DEFAULT }
        | spanner.optimizer_statistics_package { TO | = } { 'package_name' | DEFAULT }
        | spanner.version_retention_period { TO | = } { 'duration' | DEFAULT }
        | spanner.default_sequence_kind { TO | = } { 'bit_reversed_positive' | DEFAULT }
        | spanner.default_time_zone { TO | = } { 'time_zone_name' | DEFAULT }
        
    }

and the configuration_parameter is:

    {
        spanner.default_leader
        | spanner.optimizer_version
        | spanner.optimizer_statistics_package
        | spanner.version_retention_period
        | spanner.default_sequence_kind
        | spanner.default_time_zone
    }
Spanner differences from open source PostgreSQL

spanner.default_leader { TO | = } { 'region' | DEFAULT }

spanner.optimizer_version { TO | = } { 1 ... 8 | DEFAULT }

spanner.optimizer_statistics_package { TO | = } { 'package_name' | DEFAULT }

spanner.version_retention_period { TO | = } { 'duration' | DEFAULT }

spanner.default_sequence_kind { TO | = } { 'bit_reversed_positive' | DEFAULT }

spanner.default_time_zone { TO | = } { 'time_zone_name' | DEFAULT }

PLACEMENT statements

Preview — Geo-partitioning

This feature is subject to the "Pre-GA Offerings Terms" in the General Service Terms section of the Service Specific Terms. Pre-GA features are available "as is" and might have limited support. For more information, see the launch stage descriptions.

This section has information about PLACEMENT statements.

CREATE PLACEMENT

Use the CREATE PLACEMENT statement to define a placement to partition row data in your database. For more information, see Geo-partitioning overview.

Syntax
CREATE PLACEMENT placement_name WITH [ partition_def ]

where partition_def is:
    { ( instance_partition='partition_id' [, default_leader='leader_region_id' ] ) }
Description

CREATE PLACEMENT defines a new placement in the current database.

Parameters

placement_name

partition_id

leader_region_id

DROP PLACEMENT

Use the DROP PLACEMENT statement to delete a placement.

Syntax
DROP PLACEMENT placement_name
Description

DROP PLACEMENT drops a placement.

Parameters

placement_name

LOCALITY GROUP statements

This section has information about LOCALITY GROUP statements.

CREATE LOCALITY GROUP

Use the CREATE LOCALITY GROUP statement to define a locality group to store some columns separately or to use tiered storage. For more information, see Locality groups and Tiered storage overview.

Syntax
CREATE LOCALITY GROUP locality_group_name [ storage_def ]

where storage_def is:
    { STORAGE '{ ssd | hdd }' [, SSD_TO_HDD_SPILL_TIMESPAN 'duration' ] }
Description

CREATE LOCALITY GROUP defines a new locality group in the current database.

Parameters

locality_group_name

storage_def

ALTER LOCALITY GROUP

Use the ALTER LOCALITY GROUP statement to change the storage option or age-based policy of a locality group.

Syntax
ALTER LOCALITY GROUP locality_group_name [ storage_def ]

where storage_def is:
    { STORAGE '{ ssd | hdd }' SSD_TO_HDD_SPILL_TIMESPAN 'duration' }
Description

ALTER LOCALITY GROUP changes the storage option or age-based policy of a locality group. You can change these options together or individually.

Parameters

locality_group_name

storage_def

DROP LOCALITY GROUP

Use the DROP LOCALITY GROUP statement to drop the locality group. You can't drop a locality group if it contains data. You must first move all data that's in the locality group to another locality group.

Syntax
DROP LOCALITY GROUP locality_group_name
Description

DROP LOCALITY GROUP drops the locality group.

INDEX statements

This section has information about INDEX statements.

CREATE INDEX
CREATE [ UNIQUE ] INDEX [ IF NOT EXISTS ] name ] ON table_name
    ( { column_name } [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )
    [ INCLUDE ( column_name [, ...] ) ]
    [ INTERLEAVE IN parent_table_name ]
    [ WHERE predicate ]
    [ LOCALITY GROUP locality_group_name ]

where predicate is:

    column_name IS NOT NULL
        [ AND column_name IS NOT NULL ] [ ... ]
Spanner differences from open source PostgreSQL

[ ASC | DESC ] [ NULLS { FIRST | LAST } ]

[ WHERE predicate ]

ALTER INDEX

Adds or removes a non-key column from an index.

ALTER INDEX index_name {ADD|DROP} INCLUDE COLUMN column_name
DROP INDEX

Removes a secondary index.

DROP INDEX [ IF EXISTS ] name
SEARCH INDEX statements

This section has information about SEARCH INDEX statements.

CREATE SEARCH INDEX

Use the CREATE SEARCH INDEX statement to define search indexes. For more information, see Search indexes.

Syntax
CREATE SEARCH INDEX index_name
ON table_name(tokenlist_column_name *)
  [INCLUDE(column_name [, ...])]
  [PARTITION BY column_name[, ...] 
  [ORDER BY column_name [ ASC | DESC ]
  [INTERLEAVE IN parent_table_name]
  [WHERE column_name IS NOT NULL [AND ...]]
  [WITH(search_index_options)])

where index_name is:
    {az|AZ}[{az|AZ|09|_}+]

and tokenlist_column is:
    column_name [, ...]

and search_index_options are:
    {sort_order_sharding = {true|false}}
Description

You can use CREATE SEARCH INDEX to create search indexes for TOKENLIST columns. Adding a search index on a column makes it more efficient to search data in the source column of the TOKENLIST.

Parameters

index_name

table_name

tokenlist_column_name

INCLUDE

PARTITION BY

ORDER BY

WHERE column_name IS NOT NULL

INTERLEAVE IN

WITH

ALTER SEARCH INDEX

Use the ALTER SEARCH INDEX statement to add or remove columns from the search indexes.

Syntax
ALTER SEARCH INDEX index_name {ADD|DROP} INCLUDE COLUMN column_name
Description

Add a TOKENLIST column into a search index or remove an existing TOKENLIST column from a search index. Use INCLUDE COLUMN to add or remove stored columns from a search index.

Parameters

index_name

column_name

DROP SEARCH INDEX

Removes a search index.

Syntax
DROP SEARCH INDEX [ IF EXISTS ] index_name
Description

Use the DROP SEARCH INDEX statement to drop a search index.

Parameters

IF EXISTS

index_name

SEQUENCE statements

This section describes SEQUENCE statements.

CREATE SEQUENCE

Creates a sequence object with the specified attributes.

CREATE SEQUENCE [ IF NOT EXISTS ] sequence_name
[ sequence_kind ]
[ NO MINVALUE ]
[ NO MAXVALUE ]
[ SKIP RANGE skip_range_min skip_range_max ]
[ START COUNTER [ WITH ] start_with_counter ]
[ NO CYCLE ]
[ OWNED BY NONE ]
Spanner differences from open source PostgreSQL

Bit-reversed positive sequences don't support the following open source PostgreSQL SEQUENCE clauses:

Spanner extends open source PostgreSQL with the following:

sequence_kind

[ SKIP RANGE skip_range_min skip_range_max ]

[ START COUNTER [ WITH ] start_with_counter ]

Examples

In the following example, you create a positive bit-reversed positive sequence. When you create a table, you can use nextval, the sequence generator function, as the default value of the primary key column, SingerId. Values the sequence generates are positive and bit-reversed.

CREATE SEQUENCE mysequence bit_reversed_positive;

CREATE TABLE singers (
  singerid bigint DEFAULT nextval('mysequence'),
  name bigint,
  PRIMARY KEY (singerid)
);
ALTER SEQUENCE

ALTER SEQUENCE makes changes to the specified sequence. Executing this statement doesn't affect values that the sequence previously generated. If the ALTER SEQUENCE statement doesn't include an option, the current value of the option remains the same.

After you execute ALTER SEQUENCE, the specified sequence uses the new schema options.

ALTER SEQUENCE [ IF EXISTS ] sequence_name
[ NO MINVALUE ]
[ NO MAXVALUE ]
[ SKIP RANGE skip_range_min skip_range_max ]
[ RESTART COUNTER [ WITH ] counter_restart ]
[ NO CYCLE ]
Spanner differences from open source PostgreSQL

Bit-reversed positive sequences don't support the following open source PostgreSQL ALTER SEQUENCE clauses:

Spanner extends open source PostgreSQL with the following:

[ SKIP RANGE skip_range_min skip_range_max ]

[ RESTART COUNTER [WITH] counter_restart ]

Examples

Alter a sequence to include an skipped range.

ALTER SEQUENCE mysequence SKIP RANGE 1 1234567;

Set the current sequence counter to 1000.

ALTER SEQUENCE mysequence RESTART COUNTER WITH 1000;
DROP SEQUENCE

Drops a sequence.

Syntax
DROP SEQUENCE [IF EXISTS] sequence_name
Spanner differences from open source PostgreSQL

Bit-reversed positive sequences don't support the following open source PostgreSQL DROP SEQUENCE clauses:

Description

DROP SEQUENCE drops a specific sequence. Spanner can't drop a sequence if its name appears in a sequence function used in a column default value or view.

STATISTICS statements

This section has information about STATISTICS statements.

ALTER STATISTICS

Sets optional attributes of a query optimizer statistics package.

Syntax
ALTER STATISTICS spanner."<package_name>"
    action

where package_name is:
    {a—z}[{a—z|0—9|_|-}+]{a—z|0—9}

and action is:
    SET OPTIONS ( options_def )

and options_def is:
    { allow_gc = { true | false } }
Description

ALTER STATISTICS sets optional attributes of a query optimizer statistics package.

SET OPTIONS

Parameters

package_name

options_def

ANALYZE

Starts a new query optimizer statistics package construction.

Syntax
ANALYZE
Description

ANALYZE starts a new query optimizer statistics package construction.

TABLE statements

This section has information about TABLE statements.

CREATE TABLE

Defines a new table.

CREATE TABLE [ IF NOT EXISTS ] table_name (

      {
        column_name data_type
        [ column_constraint [ ... ] ] | table_constraint
        | synonym_definition
      } [, ... ],
      PRIMARY KEY (column_name)
    )
    [ { LOCALITY GROUP locality_group_name
    | INTERLEAVE IN [ PARENT ] parent_table_name
    [ ON DELETE ( CASCADE | NO ACTION ) ]
    | TTL INTERVAL interval_spec ON timestamp_column_name } ]

where column_constraint is:

    [ CONSTRAINT constraint_name ] {
        NOT NULL
        | NULL
        | CHECK ( expression )
        | DEFAULT expression
        | GENERATED ALWAYS AS ( expression ) { STORED | VIRTUAL}
        | GENERATED BY DEFAULT AS IDENTITY [ ( sequence_option_clause ... ) ]
        | PRIMARY KEY
        | REFERENCES reftable ( refcolumn )
            [ ON DELETE {CASCADE | NO ACTION} ]
    }

and table_constraint is:

    [ CONSTRAINT constraint_name ] {
        CHECK ( expression )
        | PRIMARY KEY ( column_name [, ... ] )
        | FOREIGN KEY ( column_name [, ... ] )
        REFERENCES reftable ( refcolumn [, ... ] )
            [ ON DELETE {CASCADE | NO ACTION} ]
    }

and synonym_definition is:

    [ SYNONYM (synonym) ]

and sequence_option_clause is:
    { BIT_REVERSED_POSITIVE
    | NO MINVALUE
    | NO MAXVALUE
    | SKIP RANGE skip_range_min skip_range_max
    | START COUNTER [ WITH ] start_with_counter
    | NO CYCLE }

PRIMARY KEY (column_name)

In Spanner a primary key is required when creating a new table.

DEFAULT expression

GENERATED BY DEFAULT AS IDENTITY [ (sequence_option_clause... )]

GENERATED ALWAYS AS (expression) { STORED | VIRTUAL }

Spanner differences from open source PostgreSQL

Spanner might choose a different name for an anonymous constraint than would open source PostgreSQL. Therefore, if you depend on constraint names, use CONSTRAINT constraint_name to specify them explicitly.

Spanner extends open source PostgreSQL with the following:

INTERLEAVE IN PARENT parent_table_name [ ON DELETE ( CASCADE | NO ACTION ) ]

INTERLEAVE IN parent_table_name

TTL INTERVAL interval_spec ON timestamp_column_name

LOCALITY GROUP locality_group_name

[ SYNONYM (synonym)]

ALTER TABLE

Changes the definition of a table.

ALTER TABLE [ IF EXISTS ] [ ONLY ] name action

where action is one of:

    ADD SYNONYM synonym
    DROP SYNONYM synonym
    RENAME TO new_table_name
      [, ALTER TABLE [ IF EXISTS ] [ ONLY ] new_table_name RENAME TO new_table_name ...]
    RENAME WITH SYNONYM TO new_table_name
    SET LOCALITY GROUP locality_group_name
    ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ column_expression ]
    DROP [ COLUMN ] column_name
    ADD table_constraint
    DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]
    ALTER COLUMN column_name
      {
        [ SET DATA ] TYPE data_type
        | { SET | DROP } NOT NULL
        | SET  DEFAULT expression
        | DROP DEFAULT
        | SET {
                NO MINVALUE
                | NO MAXVALUE
                | { SKIP RANGE skip_range_min skip_range_max | NO SKIP RANGE }
                | NO CYCLE
                | LOCALITY GROUP locality_group_name
              }
        | RESTART COUNTER [ WITH ] counter_restart
      }
    ADD TTL INTERVAL interval_spec ON timestamp_column_name 
    ALTER TTL INTERVAL interval_spec ON timestamp_column_name 
    SET INTERLEAVE IN [ PARENT ] parent_table_name [ ON DELETE { CASCADE | NO ACTION } ]

and column_expression is:
    [ NOT NULL ] { DEFAULT expression
    | GENERATED ALWAYS AS ( expression ) STORED
    | GENERATED BY DEFAULT AS IDENTITY [ ( sequence_option_clause ... ) ] }

and table_constraint is:

    [ CONSTRAINT constraint_name ] {
        CHECK ( expression ) |
        FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable ( refcolumn [, ... ] )
            [ ON DELETE {CASCADE | NO ACTION} ]
    }

and sequence_option_clause is:
    { BIT_REVERSED_POSITIVE
    | NO MINVALUE
    | NO MAXVALUE
    | SKIP RANGE skip_range_min skip_range_max
    | START COUNTER [ WITH ] start_with_counter
    | NO CYCLE }
Spanner differences from open source PostgreSQL

Spanner extends open source PostgreSQL with the following:

ADD TTL INTERVAL, ALTER TTL INTERVAL

ADD SYNONYM

DROP SYNONYM

RENAME TO

RENAME WITH SYNONYM TO

SET INTERLEAVE IN

DROP TABLE

Removes a table.

DROP TABLE [ IF EXISTS ] name
Spanner differences from open source PostgreSQL

Spanner can't drop a table that has indexes. However, in open source PostgreSQL, when you drop a table, all related indexes are also dropped.

VIEW statements

This section has information about VIEW statements.

CREATE OR REPLACE VIEW

Defines a new view or replaces an existing view. If CREATE VIEW is used and the view already exists, the statement fails. Use CREATE OR REPLACE VIEW to replace the view or security type of a view. For more information, see About views.

{ CREATE | CREATE OR REPLACE } VIEW view_name
  SQL SECURITY { INVOKER | DEFINER }
  AS query
DROP VIEW

Removes a view. Only the view is dropped; the objects that it references are not.

DROP VIEW name
CHANGE STREAM statements

This section has information about CHANGE STREAM statements.

CREATE CHANGE STREAM

Defines a new change stream. For more information, see Create a change stream.

CREATE CHANGE STREAM change_stream_name
[ FOR { table_columns [, ... ] | ALL } ]
[ WITH ( configuration_parameter_def [, ... ] ) ]

where table_columns is:
    table_name [ ( [ column_name, ... ] ) ]

and configuration_parameter_def is:
    { retention_period = 'duration'
      | value_capture_type = { 'OLD_AND_NEW_VALUES'
      | 'NEW_ROW' |'NEW_VALUES'
      | 'NEW_ROW_AND_OLD_VALUES' }
      | exclude_ttl_deletes = { false | true }
      | exclude_insert = { false | true }
      | exclude_update = { false | true }
      | exclude_delete = { false | true } }

FOR {table_columns[, ... ] | ALL }

WITH (configuration_parameter_def[, ... ] )

ALTER CHANGE STREAM

Changes the definition of a change stream. For more information, see Modify a change stream.

ALTER CHANGE STREAM name action

where action is:
    { SET FOR { table_columns [, ... ] | ALL } |
      DROP FOR ALL |
      SET ( configuration_parameter_def [, ... ] ) |
      RESET ( configuration_parameter [, ... ] ) }

and table_columns is:
    table_name [ ( [ column_name, ... ] ) ]

and configuration_parameter_def is:
    { retention_period = { 'duration' | null } |
      value_capture_type = { 'OLD_AND_NEW_VALUES' | 'NEW_ROW' | 'NEW_VALUES' | 'NEW_ROW_AND_OLD_VALUES' | null } |
      exclude_ttl_deletes = { false | true | null } |
      exclude_insert = { false | true | null } |
      exclude_update = { false | true | null } |
      exclude_delete = { false | true | null } }

and configuration_parameter is:
    { retention_period | value_capture_type | exclude_ttl_deletes
    | exclude_insert | exclude_update | exclude_delete }

SET FOR {table_columns[, ... ] | ALL }

DROP FOR ALL

SET

RESET

DROP CHANGE STREAM

Removes a change stream and deletes its data change records.

DROP CHANGE STREAM name
ROLE statements

This section has information about ROLE statements.

CREATE ROLE

Defines a new database role.

Syntax
CREATE ROLE database_role_name
Description

CREATE ROLE defines a new database role. Database roles are collections of fine-grained access control privileges. You can create only one role with this statement.

Parameters

database_role_name

Example

This example creates the database role hr_manager.

CREATE ROLE hr_manager;
DROP ROLE

Drops a database role.

Syntax
DROP ROLE database_role_name
Description

DROP ROLE drops a database role. You can drop only one role with this statement.

You can't drop a database role if it has any privileges granted to it. All privileges granted to a database role must be revoked before the role can be dropped. You can drop a database role whether or not access to it is granted to IAM principals.

Dropping a role automatically revokes its membership in other roles and revokes the membership of its members.

You can't drop system roles.

Parameters

database_role_name

Example

This example drops the database role hr_manager.

DROP ROLE hr_manager;
GRANT and REVOKE statements

This section has information about GRANT and REVOKE statements.

GRANT

Grants roles to database objects.

Syntax
GRANT { SELECT | INSERT | UPDATE | DELETE } ON [TABLE] table_list TO role_list

GRANT { SELECT | INSERT | UPDATE }(column_list) ON [TABLE] table_list TO role_list

GRANT SELECT ON [TABLE] view_list TO role_list

GRANT SELECT ON CHANGE STREAM change_stream_list TO role_list

GRANT EXECUTE ON FUNCTION function_list TO role_list

GRANT role_list TO role_list

GRANT USAGE ON SCHEMA schema_name_list TO role_list

where table_list is:
      table_name [, ...]

and column_list is:
    column_name [,...]

and view_list is:
    view_name [, ...]

and change_stream_list is:
    change_stream_name [, ...]

and function_list is:
    change_stream_read_function_name [, ...]

and schema_name_list is:
    schema_name [, ...]

and role_list is:
    database_role_name [, ...]
Description

For fine-grained access control, grants privileges on one or more tables, views, change streams, or change stream read functions to database roles. Also grants database roles to other database roles to create a database role hierarchy with inheritance. When granting SELECT, INSERT, or UPDATE on a table, optionally grants privileges on only a subset of table columns.

Parameters

table_name

column_name

view_name

change_stream_name

change_stream_read_function_name

database_role_name

Notes and restrictions Examples

The following example grants SELECT on the employees table to the hr_rep role. Grantees of the hr_rep role can read all columns of employees.

GRANT SELECT ON TABLE employees TO hr_rep;

The next example is the same as the previous example, but with the optional TABLE keyword omitted.

GRANT SELECT ON employees TO hr_rep;

The next example grants SELECT on a subset of columns of the contractors table to the hr_rep role. Grantees of the hr_rep role can only read the named columns.

GRANT SELECT(name, address, phone) ON TABLE contractors TO hr_rep;

The next example mixes table-level and column-level grants. hr_manager can read all table columns, but can update only the location column.

GRANT SELECT, UPDATE(location) ON TABLE employees TO hr_manager;

The next example makes column-level grants on two tables. Both tables must contain the name, level, and location columns.

GRANT SELECT (name, level, location), UPDATE (location)
ON TABLE employees, contractors
TO hr_manager;

The next example grants INSERT on a subset of columns of the employees table.

GRANT INSERT(name, cost_center, location, manager) ON TABLE employees TO hr_manager;

The next example grants the database role pii_access to the roles hr_manager and hr_director. The hr_manager and hr_director roles are members of pii_access and inherit the privileges that were granted to pii_access. For more information, see Database role hierarchies and inheritance.

GRANT pii_access TO hr_manager, hr_director;
REVOKE

Revokes privileges on one or more tables, views, change streams, or change stream read functions.

Syntax
REVOKE { SELECT | INSERT | UPDATE | DELETE } ON [TABLE] table_list FROM role_list

REVOKE { SELECT | INSERT | UPDATE }(column_list) ON [TABLE] table_list FROM role_list

REVOKE SELECT ON [TABLE] view_list FROM role_list

REVOKE SELECT ON CHANGE STREAM change_stream_list FROM role_list

REVOKE EXECUTE ON FUNCTION function_list FROM role_list

REVOKE role_list FROM role_list

and table_list is:
    table_name [, ...]

and column_list is:
    column_name [,...]

and view_list is:
    view_name [, ...]

and change_stream_list is:
    change_stream_name [, ...]

and function_list is:
    change_stream_read_function_name [, ...]

and role_list is:
    database_role_name [, ...]
Description

For fine-grained access control, revokes privileges on one or more tables, views, change streams, or change stream read functions from database roles. Also revokes database roles from other database roles. When revoking SELECT, INSERT, or UPDATE on a table, optionally revokes privileges on only a subset of table columns.

Parameters

table_name

column_name

view_name

change_stream_name

change_stream_read_function_name

database_role_name

Notes and restrictions Examples

The following example revokes SELECT on the employees table from the role hr_rep.

REVOKE SELECT ON TABLE employees FROM hr_rep;

The next example is the same as the previous example, but with the optional TABLE keyword omitted.

REVOKE SELECT ON employees FROM hr_rep;

The next example revokes SELECT on a subset of columns of the contractors table from the role hr_rep.

REVOKE SELECT(name, address, phone) ON TABLE contractors FROM hr_rep;

The next example shows revoking both table-level and column-level privileges in a single statement.

REVOKE SELECT, UPDATE(location) ON TABLE employees FROM hr_manager;

The next example revokes column-level grants on two tables. Both tables must contain the name, level, and location columns.

REVOKE
  SELECT (name, level, location),
  UPDATE (location)
ON TABLE employees, contractors

The next example revokes INSERT on a subset of columns.

REVOKE INSERT(name, cost_center, location, manager) ON TABLE employees FROM
hr_manager;

The following example revokes the database role pii_access from the hr_manager and hr_director database roles. The hr_manager and hr_director roles lose any privileges that they inherited from pii_access.

REVOKE pii_access FROM hr_manager, hr_director;

RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4