diff --git a/frictionless/query.py b/frictionless/query.py
index 3315f852..247992c2 100644
--- a/frictionless/query.py
+++ b/frictionless/query.py
@@ -170,11 +170,11 @@ class Query(Metadata):
         "properties": {
             "pickFields": {"type": "array"},
             "skipFields": {"type": "array"},
-            "limitFields": {"type": "number"},
-            "offsetFields": {"type": "number"},
+            "limitFields": {"type": "number", "minimum": 1},
+            "offsetFields": {"type": "number", "minimum": 1},
             "pickRows": {"type": "array"},
             "skipRows": {"type": "array"},
-            "limitRows": {"type": "number"},
-            "offsetRows": {"type": "number"},
+            "limitRows": {"type": "number", "minimum": 1},
+            "offsetRows": {"type": "number", "minimum": 1},
         },
     }

diff --git a/tests/test_table.py b/tests/test_table.py
index 97d23601..f269c50c 100644
--- a/tests/test_table.py
+++ b/tests/test_table.py
@@ -851,6 +851,50 @@ def test_table_limit_offset_rows():
         assert table.read_data() == [["3", "c"], ["4", "d"]]
 
 
+def test_table_limit_fields_error_zero_issue_521():
+    source = "data/long.csv"
+    query = Query(limit_fields=0)
+    table = Table(source, query=query)
+    with pytest.raises(exceptions.FrictionlessException) as excinfo:
+        table.open()
+    error = excinfo.value.error
+    assert error.code == "query-error"
+    assert error.note.count('minimum of 1" at "limitFields')
+
+
+def test_table_offset_fields_error_zero_issue_521():
+    source = "data/long.csv"
+    query = Query(offset_fields=0)
+    table = Table(source, query=query)
+    with pytest.raises(exceptions.FrictionlessException) as excinfo:
+        table.open()
+    error = excinfo.value.error
+    assert error.code == "query-error"
+    assert error.note.count('minimum of 1" at "offsetFields')
+
+
+def test_table_limit_rows_error_zero_issue_521():
+    source = "data/long.csv"
+    query = Query(limit_rows=0)
+    table = Table(source, query=query)
+    with pytest.raises(exceptions.FrictionlessException) as excinfo:
+        table.open()
+    error = excinfo.value.error
+    assert error.code == "query-error"
+    assert error.note.count('minimum of 1" at "limitRows')
+
+
+def test_table_offset_rows_error_zero_issue_521():
+    source = "data/long.csv"
+    query = Query(offset_rows=0)
+    table = Table(source, query=query)
+    with pytest.raises(exceptions.FrictionlessException) as excinfo:
+        table.open()
+    error = excinfo.value.error
+    assert error.code == "query-error"
+    assert error.note.count('minimum of 1" at "offsetRows')
+
+
 # Header
 
 

Query(limit_rows=0) doesn't limit rows
# Overview

From here - https://github.com/frictionlessdata/frictionless-py/issues/516. Also the same must be for limit_fields

tests/test_table.py::test_table_limit_fields_error_zero_issue_521 tests/test_table.py::test_table_offset_fields_error_zero_issue_521 tests/test_table.py::test_table_limit_rows_error_zero_issue_521 tests/test_table.py::test_table_offset_rows_error_zero_issue_521
tests/test_table.py::test_table tests/test_table.py::test_table_read_data tests/test_table.py::test_table_data_stream tests/test_table.py::test_table_data_stream_iterate tests/test_table.py::test_table_read_rows tests/test_table.py::test_table_row_stream tests/test_table.py::test_table_row_stream_iterate tests/test_table.py::test_table_row_stream_error_cells tests/test_table.py::test_table_row_stream_blank_cells tests/test_table.py::test_table_empty tests/test_table.py::test_table_without_rows tests/test_table.py::test_table_without_headers tests/test_table.py::test_table_error_read_closed tests/test_table.py::test_table_source_error_data tests/test_table.py::test_table_scheme_file tests/test_table.py::test_table_scheme_stream tests/test_table.py::test_table_scheme_text tests/test_table.py::test_table_scheme_error_bad_scheme tests/test_table.py::test_table_scheme_error_bad_scheme_and_format tests/test_table.py::test_table_scheme_error_file_not_found tests/test_table.py::test_table_scheme_error_file_not_found_bad_format tests/test_table.py::test_table_scheme_error_file_not_found_bad_compression tests/test_table.py::test_table_format_csv tests/test_table.py::test_table_format_ndjson tests/test_table.py::test_table_format_xls tests/test_table.py::test_table_format_xlsx tests/test_table.py::test_table_format_error_bad_format tests/test_table.py::test_table_format_error_non_matching_format tests/test_table.py::test_table_hashing tests/test_table.py::test_table_hashing_provided tests/test_table.py::test_table_hashing_error_bad_hashing tests/test_table.py::test_table_encoding tests/test_table.py::test_table_encoding_explicit_utf8 tests/test_table.py::test_table_encoding_explicit_latin1 tests/test_table.py::test_table_encoding_utf_16 tests/test_table.py::test_table_encoding_error_bad_encoding tests/test_table.py::test_table_encoding_error_non_matching_encoding tests/test_table.py::test_table_compression_local_csv_zip tests/test_table.py::test_table_compression_local_csv_zip_multiple_files tests/test_table.py::test_table_compression_local_csv_zip_multiple_files_compression_path tests/test_table.py::test_table_compression_local_csv_zip_multiple_open tests/test_table.py::test_table_compression_local_csv_gz tests/test_table.py::test_table_compression_filelike_csv_zip tests/test_table.py::test_table_compression_filelike_csv_gz tests/test_table.py::test_table_compression_error_bad tests/test_table.py::test_table_compression_error_invalid_zip tests/test_table.py::test_table_compression_error_invalid_gz tests/test_table.py::test_table_control tests/test_table.py::test_table_control_bad_property tests/test_table.py::test_table_dialect tests/test_table.py::test_table_dialect_csv_delimiter tests/test_table.py::test_table_dialect_json_property tests/test_table.py::test_table_dialect_bad_property tests/test_table.py::test_table_dialect_header_case_default tests/test_table.py::test_table_dialect_header_case_is_false tests/test_table.py::test_table_pick_fields tests/test_table.py::test_table_pick_fields_position tests/test_table.py::test_table_pick_fields_regex tests/test_table.py::test_table_pick_fields_position_and_prefix tests/test_table.py::test_table_skip_fields tests/test_table.py::test_table_skip_fields_position tests/test_table.py::test_table_skip_fields_regex tests/test_table.py::test_table_skip_fields_position_and_prefix tests/test_table.py::test_table_skip_fields_blank_header tests/test_table.py::test_table_skip_fields_blank_header_notation tests/test_table.py::test_table_skip_fields_keyed_source tests/test_table.py::test_table_limit_fields tests/test_table.py::test_table_offset_fields tests/test_table.py::test_table_limit_offset_fields tests/test_table.py::test_table_pick_rows tests/test_table.py::test_table_pick_rows_number tests/test_table.py::test_table_pick_rows_regex tests/test_table.py::test_table_skip_rows tests/test_table.py::test_table_skip_rows_excel_empty_column tests/test_table.py::test_table_skip_rows_with_headers tests/test_table.py::test_table_skip_rows_with_headers_example_from_readme tests/test_table.py::test_table_skip_rows_regex tests/test_table.py::test_table_skip_rows_preset tests/test_table.py::test_table_limit_rows tests/test_table.py::test_table_offset_rows tests/test_table.py::test_table_limit_offset_rows tests/test_table.py::test_table_header tests/test_table.py::test_table_header_unicode tests/test_table.py::test_table_header_stream_context_manager tests/test_table.py::test_table_header_inline tests/test_table.py::test_table_header_json_keyed tests/test_table.py::test_table_header_inline_keyed tests/test_table.py::test_table_header_inline_keyed_headers_is_none tests/test_table.py::test_table_header_xlsx_multiline tests/test_table.py::test_table_header_csv_multiline_headers_join tests/test_table.py::test_table_header_csv_multiline_headers_duplicates tests/test_table.py::test_table_header_strip_and_non_strings tests/test_table.py::test_table_schema tests/test_table.py::test_table_schema_provided tests/test_table.py::test_table_sync_schema tests/test_table.py::test_table_schema_patch_schema tests/test_table.py::test_table_schema_patch_schema_missing_values tests/test_table.py::test_table_schema_infer_type tests/test_table.py::test_table_schema_infer_names tests/test_table.py::test_table_schema_lookup_foreign_keys tests/test_table.py::test_table_schema_lookup_foreign_keys_error tests/test_table.py::test_table_stats_hash tests/test_table.py::test_table_stats_hash_md5 tests/test_table.py::test_table_stats_hash_sha1 tests/test_table.py::test_table_stats_hash_sha256 tests/test_table.py::test_table_stats_hash_sha512 tests/test_table.py::test_table_stats_hash_compressed tests/test_table.py::test_table_stats_bytes tests/test_table.py::test_table_stats_bytes_compressed tests/test_table.py::test_table_stats_fields tests/test_table.py::test_table_stats_rows tests/test_table.py::test_table_stats_rows_significant tests/test_table.py::test_table_reopen tests/test_table.py::test_table_reopen_and_infer_volume tests/test_table.py::test_table_reopen_generator tests/test_table.py::test_table_write tests/test_table.py::test_table_write_format_error_bad_format tests/test_table.py::test_table_integrity_onerror tests/test_table.py::test_table_integrity_onerror_header_warn tests/test_table.py::test_table_integrity_onerror_header_raise tests/test_table.py::test_table_integrity_onerror_row_warn tests/test_table.py::test_table_integrity_onerror_row_raise tests/test_table.py::test_table_integrity_unique tests/test_table.py::test_table_integrity_unique_error tests/test_table.py::test_table_integrity_primary_key tests/test_table.py::test_table_integrity_primary_key_error tests/test_table.py::test_table_integrity_foreign_keys tests/test_table.py::test_table_integrity_foreign_keys_error tests/test_table.py::test_table_reset_on_close_issue_190 tests/test_table.py::test_table_skip_blank_at_the_end_issue_bco_dmo_33 tests/test_table.py::test_table_not_existent_local_file_with_no_format_issue_287 tests/test_table.py::test_table_skip_rows_non_string_cell_issue_320 tests/test_table.py::test_table_skip_rows_non_string_cell_issue_322