Database Variances
Understanding Search and Stop Word Differences Across Databases
Overview
In Innoslate v4.15 and later, search functionality across PostgreSQL 18 and Microsoft SQL Server 2022 is functionally unified. Prior releases exhibited dialect variances between database engines for full-text search, stop words, and wildcard evaluation. These behaviors now produce identical results across both supported engines.
Core Query Parity (PostgreSQL 18 & SQL Server 2022)
Across all qualified search fields (Name:, Number:, Description:, and custom schema attributes), both database engines enforce identical rules:
- Whole-Value Anchoring: Qualified searches compare against the complete field value. An unqualified exact phrase match (such as
Name:InnoslateorDescription:Innoslate) matches only when the stored field equals that exact string. -
Wildcard Semantics:
- Asterisk (*) and percent (%) function interchangeably as multi-character wildcards.
- Underscore (_) functions as a single-character wildcard (including punctuation like .).
- Substring matches require leading and trailing wildcards (e.g., *MBSE* or %MBSE%).
- Stripped Markup for Descriptions: Rich-text descriptions evaluate against raw text (
description_text). Search terms match rendered content rather than HTML tags. - Stop Words: Field-specific qualified searches (
Name:,Number:,Description:) execute directly against database columns and bypass stop-word filters entirely. SearchingName:isis treated as a literal search for the exact value"is".
Index Timing Variance: Asynchronous Crawl (SQL Server Only)
The only functional difference between PostgreSQL and Microsoft SQL Server is the index update mechanism for unqualified global full-text queries.
| Search Type | Example Syntax | PostgreSQL 18 Availability | SQL Server 2022 Availability |
| Qualified Attribute Search |
|
Immediate (Evaluates directly against table columns) |
Immediate (Evaluates directly against table columns) |
| Wildcard Unqualified Search |
|
Immediate | Immediate |
| Unqualified Global Full-Text Search |
|
Immediate (Synchronous index update) |
Delayed until crawl completes (Asynchronous background crawl) |
Operational Impact on SQL Server: Wildcard-free, unqualified searches rely on SQL Server's full-text catalog. When creating or modifying entities in SQL Server environments, these specific queries will not return newly saved entities until the asynchronous crawl cycle completes. If instant query evaluation is required immediately after saving, use qualified searches (
Name:,Number:,Description:) or include wildcard syntax.
Verified Search Behavior Matrix (93 Test Suite)
All 93 standard search permutations yield matching results on PostgreSQL 18 and Microsoft SQL Server 2022:
- Entity A Test Value:
Name/Number/Description="Innoslate is a MBSE tool"(Rows 1–67) - Entity B Test Value:
Number="I.1.12"(Rows 68–93)
1. Unqualified Searches (Rows 1–17)
Searches across Name, Number, and Description simultaneously.
| Query | Result | Engine Behavior |
is, Innoslate, "MBSE", "MBSE tool", Innoslate is a MBSE tool |
Found | Substring/token match across fields. (Delayed on SQL Server until crawl completes) |
"is%", "%is%", Inn*, Inn%, _n*, _%, "MB*", "MB%", "%MB%" |
Found | Immediate match via wildcard evaluation. |
_.*, _.% |
Not found | Leading single character followed by literal dot does not match target text. |
2. Qualified Name: Searches (Rows 18–34)
| Query | Result | Reason |
Name:is, Name:Innoslate, Name:"MBSE", Name:"MBSE tool", Name:Innoslate is a MBSE tool |
Not found | Unquoted or partial terms fail whole-value anchoring. |
Name:"is%", Name:"MB*", Name:"MB%" |
Not found | Missing leading wildcard to reach interior terms. |
Name:Inn*, Name:Inn%, Name:_n*, Name:_%, Name:I__oslate*, Name:_nnoslate* |
Found | Prefix wildcard matches text starting at position 0. |
Name:"%is%", Name:"%MB%" |
Found | Bounded wildcard matches interior text. |
Name:"Innoslate is a MBSE tool" |
Found | Exact match against full string. |
3. Qualified Number: Searches (Rows 35–51)
| Query | Result | Reason |
Number:is, Number:Innoslate, Number:"MBSE", Number:"MBSE tool", Number:_.*, Number:_.% |
Not found | Fails exact whole-value match. |
Number:Inn*, Number:Inn%, Number:_n*, Number:_%, Number:"%is%", Number:"%MB%" |
Found | Wildcard syntax matches target value. |
Number:"Innoslate is a MBSE tool" |
Found | Exact match against full string. |
4. Qualified Description: Searches (Rows 52–67)
Evaluates against description_text with HTML markup removed.
| Query | Result | Reason |
Description:is, Description:Innoslate, Description:"MBSE", Description:"MBSE tool", Description:"MB*" |
Not found | Partial values without leading/trailing wildcards fail anchoring. |
Description:Inn*, Description:Inn%, Description:%Inn%, Description:_n*, Description:_% |
Found | Prefix wildcard matches beginning of stripped description. |
Description:"%is%", Description:"%MB%" |
Found | Interior wildcard matches substring. |
Description:"Innoslate is a MBSE tool" |
Found | Exact match against full rendered text. |
5. Hierarchical Number Matching: I.1.12 (Rows 68–93)
| Pattern Type | Query | Result | Notes |
| Exact Equality | Number:I.1.12 |
Found | Exact match. |
| Exact Equality (Non-matches) | Number:I.1, Number:I.1.1, Number:12 |
Not found | Sub-levels and suffixes no longer match exact number queries. |
| Prefix Matching | Number:I*, Number:I.1*, Number:I.1%, Number:I.1.12* |
Found | Trailing wildcard captures full sequence. |
| Out-of-Bounds Prefix | Number:I.1.123*, Number:1* |
Not found | Does not match starting sequence. |
| Suffix Matching | Number:*12, Number:%12, Number:*.12, Number:*1.12, Number:*I.1.12 |
Found | Leading wildcard matches end of sequence. |
| Interior / Substring | Number:*I.1*, Number:*1.1*, Number:%1.1%, Number:*.1.* |
Found | Bounded wildcard matches sequence interior. |
Single-Character Wildcard (_) |
|
Found | _ matches single characters, digits, and literal dots (.). |
| Single-Character Mismatch | Number:I.1._ |
Not found | Requires exactly two characters (12), but only one placeholder provided. |
For a full Test Suite download of these test cases download 'SQLVPOSTGRESQLTESTSEARCHV4.15.INNO' and import into an Innoslate project for the full 93 cases.
Overview
Below is for Innoslate v4.14.3 and below.
Innoslate is compatible with both SQL and PostgreSQL databases.
While Innoslate supports multiple database backends, each handles full-text search and stop words slightly differently. The table below highlights these behavioral differences.
Search Behavior Example
To demonstrate these differences, we created four test entities:
Entity 1: Name = "Innoslate is an MBSE tool"
Entity 2: Number = "Innoslate is an MBSE tool"
Entity 3: Description = "Innoslate is an MBSE tool"
Entity 4: Number = I.1.12
Table illustrating search results across databases follows below
| Without Stop Words | With Stop Words | |||
| Microsoft SQL | PostgreSQL | Microsoft SQL | PostgreSQL | |
| Name: | ||||
| Name:is | X | X | E | E |
| Name:"is*" | X | X | P | X |
| Name:"is%" | X | X | P | X |
| Name:"%is%" | X | X | X | X |
| Name:"*is*" | X | X | X | X |
| Name:Innoslate | X | X | X | X |
| Name:Inn* | X | X | X | X |
| Name:Inn% | X | X | X | X |
| Name:_n* | X | X | X | X |
| Name:_n% | X | X | X | X |
| Name:"MB*" | X | X | X | X |
| Name:"MB%" | X | X | X | X |
| Name:"*MB*" | X | X | X | X |
| Name:"%MB%" | X | X | X | X |
| Name:"MBSE" | X | X | X | X |
| Name:"MBSE tool" | X | X | X | X |
| Name:"Innoslate is a MBSE tool" | X | X | X | X |
| Number: | ||||
| Number:2 | X | X | X | X |
| Number:2. | X | X | X | X |
| Number:2* | X | X | * | X |
| Number:2% | X | X | * | X |
| Number:is | X | X | X | X |
| Number:"is*" | X | X | X | X |
| Number:"is%" | X | X | * | X |
| Number:"*is*" | X | X | X | X |
| Number:"%is%" | X | X | X | X |
| Number:_.* | X | X | X | X |
| Number:_.% | X | X | X | X |
| Number:Innoslate | X | X | X | X |
| Number:Inn* | X | X | X | X |
| Number:Inn% | X | X | X | X |
| Number:_n* | X | X | X | X |
| Number:_n% | X | X | X | X |
| Number:"MB*" | X | X | X | X |
| Number:"MB%" | X | X | X | X |
| Number:"*MB*" | X | X | X | X |
| Number:"%MB%" | X | X | X | X |
| Number:"MBSE" | ** | X | ** | X |
| Number:"MBSE tool" | ** | X | ** | X |
| Number:"Innoslate is a MBSE tool" | X | X | X | X |
| Description: | ||||
| Description:is | X | X | E | E |
| Description:"is*" | X | X | X | X |
| Description:"is%" | X | X | X | X |
| Description:"*is*" | X | X | X | X |
| Description:"%is%" | X | X | X | X |
| Description:Innoslate | X | X | X | X |
| Description:Inn* | X | X | X | X |
| Description:Inn% | X | X | X | X |
| Description:*Inn* | ** | ** | ** | ** |
| Description:%Inn% | X | X | X | X |
| Description:_n* | ** | X | ** | X |
| Description:_n% | ** | X | ** | X |
| Description:"MB*" | X | X | X | X |
| Description:"MB%" | X | X | X | X |
| Description:"*MB*" | X | X | X | X |
| Description:"%MB%" | X | X | X | X |
| Description:"MBSE" | X | X | X | X |
| Description:"MBSE tool" | X | X | X | X |
| Description:"Innoslate is a MBSE tool" | X | X | X | X |
| ALL: | ||||
| is | X | X | E | E |
| "is*" | X | X | X | X |
| "is%" | X | X | X | X |
| "*is*" | X | X | X | X |
| "%is%" | X | X | X | X |
| Innoslate | X | X | X | X |
| Inn* | X | X | X | X |
| Inn% | X | X | X | X |
| *Inn* | ** | ** | ** | ** |
| %Inn% | X | X | X | X |
| _n* | X | X | X | X |
| _n% | X | X | X | X |
| "MB*" | X | X | X | X |
| "MB%" | X | X | X | X |
| "*MB*" | X | X | X | X |
| "%MB%" | X | X | X | X |
| MBSE | X | X | X | X |
| "MBSE" | X | X | X | X |
| "MBSE tool" | X | X | X | X |
| Innoslate is a MBSE tool | X | X | X | X |
| "Innoslate is a MBSE tool" | X | X | X | X |
| _.* | X | X | X | X |
| _.% | X | X | X | X |
| Innoslate is a MB* | X | X | X | X |
| Innoslate is a MB% | X | X | X | X |
|
E: Stop word, so all results are true
|
|
P: Partial with words that start with word, but wont contain the stop words itself
|
|
* Give less than original version
|
| ** Invalid Searches |