@@ -163,7 +163,42 @@ title: 'Rules: domain logic'
163163 молча отбрасывает дробную часть;
164164 правильная форма — ` NUMERIC[16,4](a) * b / c ` .
165165
166- 17 . Класс в объявлении параметра (` prop(SubClass x) ` ) — это
166+ 17 . Класс результата выражения может оказаться шире классов,
167+ из которых оно построено, и ассистент ОБЯЗАН учитывать
168+ это везде, где требуется более узкий класс, — прежде
169+ всего в реализации ` += ` , где это ошибка старта сервера.
170+
171+ Арифметика расширяет класс сильнее, чем кажется:
172+
173+ - ` + ` и ` - ` — как ` MIN ` / ` MAX ` и операторы выбора —
174+ дают общего предка, расширяя целую часть и шкалу
175+ независимо, поэтому результат может оказаться шире
176+ любого из операндов:
177+ ` NUMERIC[16,2] + NUMERIC[10,4] ` — это ` NUMERIC[18,4] ` ;
178+ - ` * ` складывает и целые части, и шкалы:
179+ ` NUMERIC[16,2] * NUMERIC[10,4] ` — это ` NUMERIC[26,6] ` ;
180+ - ` / ` расширяет катастрофически: при настройках
181+ по умолчанию его шкала всегда равна максимальной шкале
182+ ` NUMERIC ` (` 32 ` ), поэтому
183+ ` NUMERIC[16,2] / NUMERIC[16,2] ` — это ` NUMERIC[48,32] ` .
184+
185+ Агрегат ` GROUP ` в основном сохраняет класс того, что
186+ агрегирует, — ` GROUP SUM ` , ` GROUP MAX ` или ` GROUP LAST `
187+ по ` NUMERIC[16,2] ` дают ` NUMERIC[16,2] ` , — но выносит
188+ наружу то, до чего расширилось агрегируемое выражение.
189+ Сам по себе расширяет ` GROUP CONCAT ` : его результат —
190+ строка неограниченной длины. Конкатенация строк тоже
191+ расширяет, складывая длины операндов:
192+ ` ISTRING[200] + ISTRING[126] ` — это ` ISTRING[326] ` .
193+
194+ Более узкий класс получается только явным приведением
195+ всего выражения. Для операндов целочисленных классов
196+ приведение операнда из правила 16 не ограничивает
197+ результат (деление всё равно расширяется до шкалы ` 32 ` ),
198+ поэтому нужны оба приведения:
199+ ` NUMERIC[16,2](NUMERIC[16,2](a(x)) / b(x)) ` .
200+
201+ 18 . Класс в объявлении параметра (` prop(SubClass x) ` ) — это
167202 сигнатура, а не фильтр времени выполнения: он разрешает
168203 одноимённые свойства и задаёт сигнатуру, но вычисляемое
169204 множество определяется свойствами, использованными
@@ -176,7 +211,7 @@ title: 'Rules: domain logic'
176211 добавить явное условие ` x IS SubClass ` (или использовать
177212 свойство, объявленное на этом классе-потомке).
178213
179- 18 . В операторе ` GROUP ... BY ` ассистент НЕ ДОЛЖЕН
214+ 19 . В операторе ` GROUP ... BY ` ассистент НЕ ДОЛЖЕН
180215 перечислять в блоке ` BY ` верхние параметры,
181216 использованные в выражениях оператора: каждый такой
182217 параметр уже неявно является группировкой — параметром
@@ -188,7 +223,7 @@ title: 'Rules: domain logic'
188223 не использованные в выражениях; несовпадение
189224 количества или классов даёт ошибку.
190225
191- 19 . ` MAX ` и ` MIN ` — префиксные операторы над списком
226+ 20 . ` MAX ` и ` MIN ` — префиксные операторы над списком
192227 операндов через запятую (` MAX a, b ` ), а не инфиксные:
193228 ` a MAX b ` не разбирается — платформа выдаёт
194229 ` no viable alternative at input 'MAX' ` .
@@ -214,43 +249,13 @@ title: 'Rules: domain logic'
214249 ` specified ` и ` expected ` которой указаны класс реализации
215250 и объявленный класс.
216251
217- Чаще всего класс расширяет арифметика, причём сильнее,
218- чем кажется:
219-
220- - ` + ` и ` - ` — как ` MIN ` / ` MAX ` и операторы выбора —
221- дают общего предка, расширяя целую часть и шкалу
222- независимо, поэтому результат может оказаться шире
223- любого из операндов:
224- ` NUMERIC[16,2] + NUMERIC[10,4] ` — это ` NUMERIC[18,4] ` ;
225- - ` * ` складывает и целые части, и шкалы:
226- ` NUMERIC[16,2] * NUMERIC[10,4] ` — это ` NUMERIC[26,6] ` ;
227- - ` / ` расширяет катастрофически: при настройках
228- по умолчанию его шкала всегда равна максимальной
229- шкале ` NUMERIC ` (` 32 ` ), поэтому
230- ` NUMERIC[16,2] / NUMERIC[16,2] ` — это ` NUMERIC[48,32] ` .
231-
232- Агрегат ` GROUP ` в основном сохраняет класс того, что
233- агрегирует, — ` GROUP SUM ` , ` GROUP MAX ` или ` GROUP LAST `
234- по ` NUMERIC[16,2] ` дают ` NUMERIC[16,2] ` , — но выносит
235- наружу то, до чего расширилось агрегируемое выражение.
236- Сам по себе расширяет ` GROUP CONCAT ` : его результат —
237- строка неограниченной длины (` ISTRING ` при объявленном
238- ` ISTRING[250] ` ). Обычная конкатенация строк тоже
239- расширяет, складывая длины операндов (` ISTRING[326] `
240- при объявленном ` ISTRING[250] ` ).
241-
242- Любое такое выражение ассистент ОБЯЗАН обернуть в явное
243- приведение к объявленному классу:
252+ Выражение, расширяющее класс значения, — прежде всего
253+ арифметику, и в первую очередь деление (правило 17 правил
254+ свойств), — ассистент ОБЯЗАН обернуть в явное приведение
255+ к объявленному классу:
244256 ` f(X x) += NUMERIC[16,2](a(x) / b(x)); `
245257 ` f(X x) += ISTRING[250](a(x) + b(x)); `
246258
247- Для операндов целочисленных классов приведение ОБЯЗАНО
248- сначала стоять на операнде, чтобы деление не оказалось
249- целочисленным (см. правило 16 правил свойств); результат
250- при этом всё равно расширяется до шкалы ` 32 ` , как любое
251- деление, поэтому внешнее приведение тоже нужно:
252- ` f(X x) += NUMERIC[16,2](NUMERIC[16,2](a(x)) / b(x)); `
253-
254259### Правила упорядочивания (` ORDER ` )
255260
2562611 . Там, где две строки могут разделить ключ порядка, а ответ
0 commit comments