:: Visual Foxpro, Foxpro for DOS
Re: SQL-запрос из нескольких таблиц FPD 2.6
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Simple777
Line is too long (Error 18)
The maximum length for a command line (8,192 bytes) has been exceeded.
Macro substitution might have caused the line to expand beyond the 8,192-byte

Разве здесь речь не об исходной длине строки команды?

Цитата:
Вот, спрашивается, почему длина компилируемой строки вдруг серьёзно увеличилась только из-за того, что я добавил в выходную таблицу два поля?
Ты же не говоришь, чему она была равна до добавления полей.
Может, она и так была на пределе.



Исправлено 1 раз(а). Последнее : akvvohinc, 31.05.20 19:49
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Длина строки SQL-запроса была значительно меньше - примерно 2500 символов.

Видимо, для запросов действуют другие ограничения.
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
akvvohinc
Ты же не говоришь, чему она была равна до добавления полей.
Может, она и так была на пределе.

Да, была на пределе. Но почему такой маленький этот предел - вот в чем вопрос.
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Simple777
Но почему такой маленький этот предел - вот в чем вопрос.

Я забыл, что ты работаешь в FPD, для которого другие ограничения (2,048).
Но тогда все верно, а твой вопрос - к разработчикам.
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Вот всё и разъяснилось. [sm128]
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
На самом деле там не совсем чисто с этими ограничениями... Есть ограничение как на размер исходной строки команды, так и на размер откомпилированной команды. При этом они реально чуть-чуть отличаются от документированного числа в 8192 символов/байт.
При этом из исходного кода при компиляции убираются переводы строки, ведущие пробелы/табуляции (отступы форматирования) поэтому чисто физически файл с одной единственной командой (даже не считая комментариев) может занимать и больше 8Кб.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Igor Korolyov
Есть ограничение как на размер исходной строки команды, так и на размер откомпилированной команды.

А чему равен максимальный размер откомпилированной команды, и где об этом написано?
Или он просто определяется размером поля, хранящего длину команды в FXP?



Исправлено 1 раз(а). Последнее : akvvohinc, 01.06.20 06:44
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Bероятно, об этом может знать аффтар Defoxa.
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Я ж говорю, оба размера примерно равны 8к. На откомпилированный код на 4 байта больше (2 байта из которых под размер уходят), на исходный - на 3-4 байта меньше Видимо там буфер какой-то 8К при компиляции используется.
Нигде про это не написано, и не факт что в разных версиях будет абсолютно идентично. Да и кому до этого есть дело - не будешь же ты выверять до 1 символа размер команды, чтобы потом предъявлять претензию что авторы фокса обманули
Поэтому всем и всегда будет вполне достаточно написанного в VFP system capacities - размер одной команды 8К.

Кстати, иногда при попытке откомпилить превышающую предел команду выдаётся не ошибка 18 "Line is too long", а Error 1252 "Compiled code for this line is too long". А иногда и вовсе Error 1309 "file" is not an object file (это когда компиляция "молча" обламывается и на выходе получается невалидный fxp)
Ну и нюанс с переводами строк/отступами.

Вот этот код генерирует prg размером ~9Мб - и это всего одна единственая команда
Код компилируется и работает в крайней версии VFP9.

#DEFINE LINE_COUNT 2728
#DEFINE INDENT_SIZE 5
#DEFINE COMMAND_PART ";"
#DEFINE FILE_NAME "program1.prg"
lnFile = FCREATE(FILE_NAME)
FPUTS(m.lnFile, "z=;")
FOR ln1 = 1 TO LINE_COUNT/2
FPUTS(m.lnFile, SPACE(m.ln1*INDENT_SIZE)+COMMAND_PART)
ENDFOR
FOR ln1 = LINE_COUNT/2 TO 1 STEP -1
FPUTS(m.lnFile, SPACE(m.ln1*INDENT_SIZE)+COMMAND_PART)
ENDFOR
FPUTS(m.lnFile, "1")
FCLOSE(m.lnFile)
PRIVATE z
z=0
COMPILE program1
DO program1
?z
ADIR(laPrgFile, FILE_NAME)
? laPrgFile[1,2]


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Обнаружил любопытную особенность в SQL-запросах.

В приведённом мной примере запроса понадобилось добавить в выходную таблицу числовую "пустышку" определённой разрядности. Допустим, надо добавить поле KOLM формата N(11,6). Для символьных "пустышек" всё очевидно. Напнимер, для поля формата C(30) пишем :

..., SPACE(30) AS MYFIELD

Оказывается, для числовой "пустышки" с определённой разрядностью можно записать так:

..., 00000.000000 AS KOLM

При этом формируется "чистенькое поле" нужного формата, то есть в данном случае формата N(11,6) [sm128]



Исправлено 1 раз(а). Последнее : Simple777, 04.06.20 15:54
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
О, сколько нам открытий чудных готовит просвещенья дух...
Любят некоторые Америки заново открывать...


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
Igor Korolyov
Вот этот код генерирует prg размером ~9Мб - и это всего одна единственая команда
Код компилируется и работает в крайней версии VFP9.

Пример абсолютно не корректен.
Пробелы в начале строки, являющейся продолжением предыдущей, компилятор просто игнорирует. А это и есть 9мб.
В итоге fxp всего 191 байт.

Если заполнить реальной строкой без ведущих пробелов, то ошибка длины строки как раз как в хелпе. (8160-8900, точнее лень смотреть).

Fputs(lnfile, [z="";])
For i=1 to 110
Fputs(lnfile, [+chrtran("]+space(50)+["," ","");])
... при to 120 валится



Исправлено 1 раз(а). Последнее : Taran, 05.06.20 02:02
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
ssa
О, сколько нам открытий чудных готовит просвещенья дух...
Любят некоторые Америки заново открывать...

Лучше уш открывать, чем закрывать.

youtube.com

Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Taran
Пример абсолютно не корректен.
Пробелы в начале строки, являющейся продолжением предыдущей, компилятор просто игнорирует. А это и есть 9мб.
В итоге fxp всего 191 байт.

Если заполнить реальной строкой без ведущих пробелов, то ошибка длины строки как раз как в хелпе.

Ты ошибаешься.
Этот пример показывает ограничение на размер исходной команды, размер которой включает те пробелы в начале строки.

То есть в размер команды включаются все символы от начала строки до его конца (в том числе начальные и конечные пробелы, причем, даже те, что окажутся после ";").



Исправлено 4 раз(а). Последнее : akvvohinc, 05.06.20 03:05
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
Опять двадцать пять.
Команда это одна строка без продолжения на следующей.
Перед компиляцией фокс откинет комменты в конце строки, если есть продолжение, то он объединит все в одну строку, отбросив незначащие пробелы. И когда останется одна цельная строка попытается компилировать. Именно одна цельная строка.
Так сказано в хелпе и я это подтверждаю и доказываю примером.
А ты голословно свистишь и заявляншь что я ошибаюсь.
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Taran
А ты голословно свистишь и заявляншь что я ошибаюсь.

Я думал ты сам в состоянии немного увеличить команду (одну единственную) в примере Игоря, чтобы получить ошибку.

Цитата:
Команда это одна строка без продолжения на следующей.

И здесь ты ошибаешься - команда - это не строка, а именно команда.



Исправлено 1 раз(а). Последнее : akvvohinc, 05.06.20 03:10
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
Taran

Сообщений: 13623
Откуда: Красноярск
Дата регистрации: 16.01.2008
akvvohinc
Taran
А ты голословно свистишь и заявляншь что я ошибаюсь.

Я думал ты сам в состоянии немного увеличить команду (одну единственную) в примере Игоря, чтобы получить ошибку.

Опять абстрактная "одна единственная". Ты можешь просто и конкретно указать, чтоб было о чем говорить?
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Taran
Перед компиляцией фокс откинет комменты в конце строки

Откинет, если раньше не свалится по "Line too long" (с учетом длины этих комментов).
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Taran
Опять абстрактная "одна единственная". Ты можешь просто и конкретно указать, чтоб было о чем говорить?
Могу.
Например, увеличь в первом #DEFINE число на 1.
Ratings: 0 negative/0 positive
Re: SQL-запрос из нескольких таблиц FPD 2.6
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Igor Korolyov
При этом из исходного кода при компиляции убираются переводы строки, ведущие пробелы/табуляции (отступы форматирования)

Тогда как бы ты объяснил, что эта программа валится как при увеличении SPACE_END, так и SPACE_BEG, при неизменном количестве строк?
Что изменилось для компилятора?
#DEFINE NUMLINE 8125
#DEFINE FILE_NAME "program1.prg"
#DEFINE SPACE_BEG 7
#DEFINE SPACE_END 50
lnFile = FCREATE(FILE_NAME)
FPUTS(lnfile, 'z=;')
FOR i=1 TO NUMLINE
FPUTS(lnfile, SPACE(SPACE_BEG)+'; &'+'& '+SPACE(SPACE_END))
ENDFOR
FPUTS(lnfile, '1')
FCLOSE(m.lnFile)
PRIVATE z
z=0
COMPILE program1
DO program1
?z
ADIR(laPrgFile, FILE_NAME)
? laPrgFile[1,2]
(приведенный код у меня не валится)
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 10 anelsasha  (Гостей: 9)

© 2000-2024 Fox Club 
Яндекс.Метрика