Athena
Amazon Athena interactive SQL query service for analyzing data in S3 using standard SQL.
Configuration
| Property | Value |
|---|---|
| Protocol | AwsJson1_1 |
| Signing Name | athena |
| Target Prefix | AmazonAthena |
| Persistence | No |
Quick Start
Submit a query, poll for completion, then retrieve results:
# Start a query execution
EXEC_ID=$(curl -s http://localhost:4566 \
-H "Content-Type: application/x-amz-json-1.1" \
-H "X-Amz-Target: AmazonAthena.StartQueryExecution" \
-H "Authorization: AWS4-HMAC-SHA256 Credential=test/20260421/us-east-1/athena/aws4_request, SignedHeaders=host, Signature=fake" \
-d '{"QueryString":"SELECT * FROM my_table LIMIT 10","QueryExecutionContext":{"Database":"my_db"},"ResultConfiguration":{"OutputLocation":"s3://my-bucket/results/"}}' \
| jq -r '.QueryExecutionId')
echo "Execution ID: $EXEC_ID"
# Get query status (returns SUCCEEDED immediately in AWSim)
curl -s http://localhost:4566 \
-H "Content-Type: application/x-amz-json-1.1" \
-H "X-Amz-Target: AmazonAthena.GetQueryExecution" \
-H "Authorization: AWS4-HMAC-SHA256 Credential=test/20260421/us-east-1/athena/aws4_request, SignedHeaders=host, Signature=fake" \
-d "{\"QueryExecutionId\":\"$EXEC_ID\"}"Operations
Workgroups
CreateWorkGroup— create a workgroup with configuration settings- Input:
Name(required),Configuration(output location, encryption, query result settings),Description,Tags - Returns: empty response
- Input:
DeleteWorkGroup— delete a workgroup (must be empty of active queries)- Input:
WorkGroup,RecursiveDeleteOption(boolean, delete all contained queries)
- Input:
GetWorkGroup— get workgroup details and configuration- Input:
WorkGroup - Returns:
WorkGroupobject withState(ENABLEDorDISABLED),Configuration
- Input:
ListWorkGroups— list all workgroups- Returns: paginated
WorkGroupslist;primaryis always present
- Returns: paginated
UpdateWorkGroup— update workgroup description, state, or output location- Input:
WorkGroup, optionalDescription,State(ENABLED/DISABLED),ConfigurationUpdates.ResultConfigurationUpdates.OutputLocation
- Input:
Query Executions
StartQueryExecution— submit a SQL query for execution- Input:
QueryString(SQL),QueryExecutionContext(Database),ResultConfiguration(OutputLocationass3://URI), optionalWorkGroup - Returns:
QueryExecutionId(UUID)
- Input:
GetQueryExecution— get the status and metadata of a query execution- Input:
QueryExecutionId - Returns:
QueryExecutionwithStatus.State(QUEUED,RUNNING,SUCCEEDED,FAILED),Statistics(execution time, data scanned)
- Input:
GetQueryResults— retrieve the result set of a completed query- Input:
QueryExecutionId, optionalMaxResults,NextToken - Returns:
ResultSetwithRowsandResultSetMetadata.ColumnInfo
- Input:
ListQueryExecutions— list query execution IDs- Input: optional
WorkGroup,MaxResults,NextToken - Returns: paginated
QueryExecutionIdslist
- Input: optional
StopQueryExecution— cancel a running query- Input:
QueryExecutionId
- Input:
BatchGetQueryExecution— retrieve multiple query executions in a single call- Input:
QueryExecutionIds(list of UUIDs) - Returns:
QueryExecutions(found),UnprocessedQueryExecutionIds(not found)
- Input:
Named Queries
CreateNamedQuery— save a named SQL query for reuse- Input:
Name,Database,QueryString, optionalDescription,WorkGroup - Returns:
NamedQueryId
- Input:
GetNamedQuery— retrieve a named query by ID- Input:
NamedQueryId - Returns: full query object
- Input:
ListNamedQueries— list named queries- Input: optional
WorkGroup,MaxResults,NextToken
- Input: optional
DeleteNamedQuery— delete a named query- Input:
NamedQueryId
- Input:
BatchGetNamedQuery— retrieve multiple named queries in a single call- Input:
NamedQueryIds(list of UUIDs) - Returns:
NamedQueries(found),UnprocessedNamedQueryIds(not found)
- Input:
Databases
ListDatabases— list databases in a data catalog- Input:
CatalogName(useAwsDataCatalog) - Returns:
DatabaseList
- Input:
GetDatabase— get details of a specific database- Input:
CatalogName,DatabaseName
- Input:
Data Catalogs
ListDataCatalogs— list available data catalogs- Returns:
DataCatalogsSummary; always includes the built-inAwsDataCatalog(typeGLUE)
- Returns:
GetDataCatalog— get details of a data catalog- Input:
Name - Returns:
DataCatalogwithCatalogName,Type,Description,Parameters
- Input:
CreateDataCatalog— create a custom data catalog- Input:
Name,Type(LAMBDA,GLUE, orHIVE), optionalDescription,Parameters
- Input:
DeleteDataCatalog— delete a data catalog- Input:
Name
- Input:
Prepared Statements
CreatePreparedStatement— save a parameterized SQL statement for reuse- Input:
StatementName,WorkGroup,QueryStatement, optionalDescription - Returns: empty response
- Input:
GetPreparedStatement— retrieve a prepared statement- Input:
StatementName,WorkGroup - Returns:
PreparedStatementwithQueryStatement,LastModifiedTime
- Input:
ListPreparedStatements— list prepared statements in a workgroup- Input:
WorkGroup - Returns:
PreparedStatementslist with name and modification time
- Input:
DeletePreparedStatement— delete a prepared statement- Input:
StatementName,WorkGroup
- Input:
Table Metadata
GetTableMetadata— retrieve metadata for a table in a catalog (stub)- Input:
CatalogName,DatabaseName,TableName - Returns:
TableMetadatawithName,TableType, emptyColumnsandPartitionKeys
- Input:
ListTableMetadata— list table metadata for a database (stub returning empty list)- Input:
CatalogName,DatabaseName
- Input:
Curl Examples
# 1. Start a query
curl -s http://localhost:4566 \
-H "Content-Type: application/x-amz-json-1.1" \
-H "X-Amz-Target: AmazonAthena.StartQueryExecution" \
-H "Authorization: AWS4-HMAC-SHA256 Credential=test/20260421/us-east-1/athena/aws4_request, SignedHeaders=host, Signature=fake" \
-d '{"QueryString":"SELECT count(*) as cnt FROM events","QueryExecutionContext":{"Database":"analytics"},"ResultConfiguration":{"OutputLocation":"s3://my-results/"}}'
# 2. Create a named query for repeated use
curl -s http://localhost:4566 \
-H "Content-Type: application/x-amz-json-1.1" \
-H "X-Amz-Target: AmazonAthena.CreateNamedQuery" \
-H "Authorization: AWS4-HMAC-SHA256 Credential=test/20260421/us-east-1/athena/aws4_request, SignedHeaders=host, Signature=fake" \
-d '{"Name":"daily-event-count","Database":"analytics","QueryString":"SELECT date, count(*) FROM events GROUP BY date","Description":"Daily event count rollup"}'
# 3. List all query executions
curl -s http://localhost:4566 \
-H "Content-Type: application/x-amz-json-1.1" \
-H "X-Amz-Target: AmazonAthena.ListQueryExecutions" \
-H "Authorization: AWS4-HMAC-SHA256 Credential=test/20260421/us-east-1/athena/aws4_request, SignedHeaders=host, Signature=fake" \
-d '{}'SDK Example
import {
AthenaClient,
StartQueryExecutionCommand,
GetQueryExecutionCommand,
GetQueryResultsCommand,
} from '@aws-sdk/client-athena';
const athena = new AthenaClient({
region: 'us-east-1',
endpoint: 'http://localhost:4566',
credentials: { accessKeyId: 'test', secretAccessKey: 'test' },
});
// Start a query
const { QueryExecutionId } = await athena.send(new StartQueryExecutionCommand({
QueryString: 'SELECT * FROM events LIMIT 100',
QueryExecutionContext: { Database: 'analytics' },
ResultConfiguration: { OutputLocation: 's3://my-bucket/results/' },
}));
// Check status
const { QueryExecution } = await athena.send(new GetQueryExecutionCommand({
QueryExecutionId,
}));
console.log('State:', QueryExecution?.Status?.State); // SUCCEEDED
// Retrieve results
const { ResultSet } = await athena.send(new GetQueryResultsCommand({
QueryExecutionId,
}));
console.log('Columns:', ResultSet?.ResultSetMetadata?.ColumnInfo?.map(c => c.Name));
console.log('Rows:', ResultSet?.Rows?.length);Behavior Notes
- AWSim's Athena does not execute SQL — queries are accepted, recorded as
SUCCEEDED, and return empty or mock result sets immediately. - A built-in
primaryworkgroup is always available and cannot be deleted. - The
OutputLocationinResultConfigurationis recorded but no files are written to S3. ListDatabasesandGetDatabaseare stubs returning minimal metadata.- Query execution times in
Statisticsare simulated (not real measurements). ListDataCatalogsalways includes the built-inAwsDataCatalog(typeGLUE).GetTableMetadataandListTableMetadataare stubs; real table schemas are not tracked.- Prepared statements are scoped by workgroup — the same name can exist in different workgroups.
- State is in-memory only and lost on restart.